From eb20e60385ace56e1731d1003a87ac7d180cbe2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Hei=C3=9F?= <87521684+timo282@users.noreply.github.com> Date: Thu, 3 Oct 2024 23:02:36 +0200 Subject: [PATCH 001/120] Feature/workflows (#8) * chore: add codeowners file * chore: add python poetry action and docs workflow * chore: update pre-commit file * chore: update docs * chore: update logo * chore: add cicd pipeline for automated deployment * chore: update poetry version * chore: fix action versioning * chore: add gitattributes to ignore line count in jupyter notebooks * chore: add and update docstrings * chore: fix end of files * chore: update action versions * Update README.md --------- Co-authored-by: mo374z --- .flake8 | 1 + .gitattributes | 1 + .github/CODEOWNERS | 3 + .github/actions/python-poetry/action.yml | 39 + .github/workflows/ci.yml | 47 + .github/workflows/cicd.yml | 106 + .github/workflows/docs.yml | 27 + .pre-commit-config.yaml | 45 +- README.md | 2 +- configs/experiment_eval.ini | 2 +- configs/experiment_eval_task_descr.ini | 2 +- configs/experiment_gpt.ini | 2 +- configs/experiment_initial_prompts.ini | 2 +- configs/experiment_task_descr.ini | 2 +- data_sets/cls/agnews/description.json | 2 +- data_sets/cls/agnews/prompts.txt | 10 +- data_sets/cls/agnews/prompts_auto.txt | 2 +- data_sets/cls/cr/description.json | 2 +- data_sets/cls/cr/prompts.txt | 8 +- data_sets/cls/cr/seed5/dev.txt | 2 +- data_sets/cls/mr/description.json | 2 +- data_sets/cls/mr/prompts.txt | 8 +- data_sets/cls/mr/prompts_auto.txt | 2 +- data_sets/cls/mr/seed5/test.txt | 2 +- data_sets/cls/sst-5/description.json | 2 +- data_sets/cls/sst-5/prompts.txt | 2 +- data_sets/cls/sst2/description.json | 2 +- data_sets/cls/sst2/prompts.txt | 8 +- data_sets/cls/sst2/prompts_auto.txt | 2 +- data_sets/cls/subj/description.json | 2 +- data_sets/cls/subj/prompts.txt | 4 +- data_sets/cls/trec/description.json | 2 +- data_sets/cls/trec/prompts.txt | 8 +- data_sets/cls/trec/prompts_auto.txt | 2 +- docs/api/callbacks.md | 4 +- docs/api/config.md | 4 +- docs/api/llms.md | 18 - docs/api/optimizers.md | 14 - docs/api/predictors.md | 10 - docs/api/tasks.md | 10 - docs/img/logo.png | Bin 0 -> 85036 bytes docs/img/logo.svg | 127 + docs/index.md | 18 +- docs/release-notes.md | 3 + docs/stylesheets/extra.css | 3 + mkdocs.yml | 32 +- notebooks/evaluation_experiment.ipynb | 135 +- notebooks/interesting_prompts.ipynb | 47 +- notebooks/optimization_progress.ipynb | 1 - notebooks/test_train_score_correlation.ipynb | 69 +- poetry.lock | 425 +- promptolution/__init__.py | 9 +- promptolution/callbacks.py | 86 +- promptolution/config.py | 8 +- promptolution/llms/__init__.py | 5 +- promptolution/llms/api_llm.py | 28 +- promptolution/llms/base_llm.py | 18 +- promptolution/llms/deepinfra.py | 59 +- promptolution/llms/local_llm.py | 14 +- promptolution/optimizers/__init__.py | 5 +- promptolution/optimizers/base_optimizer.py | 32 +- promptolution/optimizers/evoprompt_de.py | 10 +- promptolution/optimizers/evoprompt_ga.py | 13 +- promptolution/predictors/__init__.py | 5 +- promptolution/predictors/base_predictor.py | 28 +- promptolution/predictors/classificator.py | 12 +- promptolution/tasks/__init__.py | 4 +- promptolution/tasks/base_task.py | 18 +- promptolution/tasks/classification_tasks.py | 21 +- pyproject.toml | 15 +- scripts/experiment_evaluation.py | 18 +- scripts/experiment_initial_prompts.py | 18 +- scripts/experiment_runs.py | 12 +- site/404.html | 172 - site/api/callbacks/index.html | 673 --- site/api/config/index.html | 794 --- site/api/llms/index.html | 4565 ----------------- site/api/optimizers/index.html | 3405 ------------ site/api/predictors/index.html | 2480 --------- site/api/tasks/index.html | 2603 ---------- site/assets/_mkdocstrings.css | 119 - site/css/base.css | 366 -- site/css/bootstrap.min.css | 12 - site/css/bootstrap.min.css.map | 1 - site/css/brands.min.css | 6 - site/css/fontawesome.min.css | 9 - site/css/solid.min.css | 6 - site/css/v4-font-face.min.css | 6 - site/img/favicon.ico | Bin 1150 -> 0 bytes site/img/grid.png | Bin 1458 -> 0 bytes site/index.html | 230 - site/js/base.js | 287 -- site/js/bootstrap.bundle.min.js | 7 - site/js/bootstrap.bundle.min.js.map | 1 - site/js/darkmode.js | 65 - site/objects.inv | Bin 1038 -> 0 bytes site/search/lunr.js | 3475 ------------- site/search/main.js | 109 - site/search/search_index.json | 1 - site/search/worker.js | 133 - site/sitemap.xml | 3 - site/sitemap.xml.gz | Bin 127 -> 0 bytes site/webfonts/fa-brands-400.ttf | Bin 207972 -> 0 bytes site/webfonts/fa-brands-400.woff2 | Bin 117372 -> 0 bytes site/webfonts/fa-regular-400.ttf | Bin 68004 -> 0 bytes site/webfonts/fa-regular-400.woff2 | Bin 25452 -> 0 bytes site/webfonts/fa-solid-900.ttf | Bin 419720 -> 0 bytes site/webfonts/fa-solid-900.woff2 | Bin 156496 -> 0 bytes site/webfonts/fa-v4compatibility.ttf | Bin 10832 -> 0 bytes site/webfonts/fa-v4compatibility.woff2 | Bin 4792 -> 0 bytes templates/evoprompt_de_template.txt | 2 +- templates/evoprompt_de_template_task_desc.txt | 2 +- templates/evoprompt_ga_template.txt | 2 +- templates/evoprompt_ga_template_task_desc.txt | 2 +- 114 files changed, 1283 insertions(+), 19966 deletions(-) create mode 100644 .gitattributes create mode 100644 .github/CODEOWNERS create mode 100644 .github/actions/python-poetry/action.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/cicd.yml create mode 100644 .github/workflows/docs.yml create mode 100644 docs/img/logo.png create mode 100644 docs/img/logo.svg create mode 100644 docs/release-notes.md create mode 100644 docs/stylesheets/extra.css delete mode 100644 site/404.html delete mode 100644 site/api/callbacks/index.html delete mode 100644 site/api/config/index.html delete mode 100644 site/api/llms/index.html delete mode 100644 site/api/optimizers/index.html delete mode 100644 site/api/predictors/index.html delete mode 100644 site/api/tasks/index.html delete mode 100644 site/assets/_mkdocstrings.css delete mode 100644 site/css/base.css delete mode 100644 site/css/bootstrap.min.css delete mode 100644 site/css/bootstrap.min.css.map delete mode 100644 site/css/brands.min.css delete mode 100644 site/css/fontawesome.min.css delete mode 100644 site/css/solid.min.css delete mode 100644 site/css/v4-font-face.min.css delete mode 100644 site/img/favicon.ico delete mode 100644 site/img/grid.png delete mode 100644 site/index.html delete mode 100644 site/js/base.js delete mode 100644 site/js/bootstrap.bundle.min.js delete mode 100644 site/js/bootstrap.bundle.min.js.map delete mode 100644 site/js/darkmode.js delete mode 100644 site/objects.inv delete mode 100644 site/search/lunr.js delete mode 100644 site/search/main.js delete mode 100644 site/search/search_index.json delete mode 100644 site/search/worker.js delete mode 100644 site/sitemap.xml delete mode 100644 site/sitemap.xml.gz delete mode 100644 site/webfonts/fa-brands-400.ttf delete mode 100644 site/webfonts/fa-brands-400.woff2 delete mode 100644 site/webfonts/fa-regular-400.ttf delete mode 100644 site/webfonts/fa-regular-400.woff2 delete mode 100644 site/webfonts/fa-solid-900.ttf delete mode 100644 site/webfonts/fa-solid-900.woff2 delete mode 100644 site/webfonts/fa-v4compatibility.ttf delete mode 100644 site/webfonts/fa-v4compatibility.woff2 diff --git a/.flake8 b/.flake8 index 6deafc2..a2d1129 100644 --- a/.flake8 +++ b/.flake8 @@ -1,2 +1,3 @@ [flake8] max-line-length = 120 +ignore = F401, W503 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..2f77e91 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.ipynb linguist-documentation diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..7d7140d --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,3 @@ +* @finitearth +* @timo282 +* @mo374z diff --git a/.github/actions/python-poetry/action.yml b/.github/actions/python-poetry/action.yml new file mode 100644 index 0000000..c9e9dc8 --- /dev/null +++ b/.github/actions/python-poetry/action.yml @@ -0,0 +1,39 @@ +name: Setup-Python-Poetry +description: 'Setup Python and Poetry' + +inputs: + python-version: + description: 'Python version to use' + required: true + default: '3.11' + poetry-version: + description: 'Poetry version to use' + required: true + default: 'latest' + groups: + required: false + default: 'main' + type: string + +runs: + using: 'composite' + steps: + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: ${{ inputs.python-version }} + - name: Setup Poetry + uses: snok/install-poetry@v1.4.1 + with: + python-version: ${{ inputs.python-version }} + virtualenvs-in-project: true + virtualenvs-create: true + - uses: actions/cache@v3 + id: cached-poetry-dependencies + with: + path: .venv + key: ${{ runner.os }}-poetry-${{ inputs.poetry-version }}-${{ hashFiles('**/poetry.lock') }} + - name: Install dependencies + run: poetry install --no-interaction --no-root --only ${{ inputs.groups }} + if: steps.cached-poetry-dependencies.outputs.cache-hit != 'true' + shell: bash diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..542e233 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,47 @@ +name: CI + +on: + push: + branches: + - dev + pull_request: + types: [opened, synchronize] + branches: + - dev + workflow_call: + workflow_dispatch: + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v3 + - name: Set up Python and Poetry + uses: ./.github/actions/python-poetry + with: + groups: dev + - name: Run pre-commit + uses: pre-commit/action@v3.0.1 + # - name: Run tests + # run: poetry run python -m pytest + + build: + runs-on: ubuntu-latest + needs: test + + steps: + - name: checkout + uses: actions/checkout@v3 + + - name: Set up Python and Poetry + uses: ./.github/actions/python-poetry + + - name: Build wheel + run: poetry build --format wheel + + - name: Upload wheel + uses: actions/upload-artifact@v4 + with: + name: ${{ github.event.repository.name }} + path: dist/ diff --git a/.github/workflows/cicd.yml b/.github/workflows/cicd.yml new file mode 100644 index 0000000..bcfdffc --- /dev/null +++ b/.github/workflows/cicd.yml @@ -0,0 +1,106 @@ +name: CICD + +on: + push: + branches: + - main + pull_request: + types: [opened, synchronize] + branches: + - main + workflow_dispatch: + +jobs: + build: + name: Run Tests, Pre-Commits, and Build Python package + uses: ./.github/workflows/ci.yml + + check-version: + needs: build + runs-on: ubuntu-latest + permissions: + contents: read + outputs: + version: ${{ steps.get_version.outputs.VERSION }} + steps: + - uses: actions/checkout@v3 + + - name: Set up Python and Poetry + uses: ./.github/actions/python-poetry + with: + cache: true + + - name: Get version from pyproject.toml + id: get_version + run: | + echo ::set-output name=VERSION::$(poetry version -s) + + - name: Get latest release version + id: get_latest_release + run: | + latest_release=$(curl -s https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r .tag_name) + echo ::set-output name=LATEST_VERSION::${latest_release#v} + + - name: Compare versions + run: | + current_version="${{ steps.get_version.outputs.VERSION }}" + latest_version="${{ steps.get_latest_release.outputs.LATEST_VERSION }}" + if [ "$(printf '%s\n' "$latest_version" "$current_version" | sort -V | tail -n1)" != "$current_version" ]; then + echo "Error: Current version ($current_version) is not higher than the latest release ($latest_version)" + exit 1 + fi + + create-release: + needs: check-version + runs-on: ubuntu-latest + permissions: + contents: write + id-token: write + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Create and push tag + run: | + git config --local user.email "action@github.com" + git config --local user.name "GitHub Action" + git tag -a v${{ needs.check-version.outputs.version }} -m "Release v${{ needs.check-version.outputs.version }}" + git push origin v${{ needs.check-version.outputs.version }} + + - name: Create GitHub Release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: v${{ needs.check-version.outputs.version }} + release_name: Release v${{ needs.check-version.outputs.version }} + draft: false + prerelease: false + + publish-to-pypi: + needs: [build, check-version, create-release] + name: Publish Python package to PyPI + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - uses: actions/checkout@v3 + + - name: Set up Python and Poetry + uses: ./.github/actions/python-poetry + with: + cache: true # Enable caching if your custom action supports it + + - name: Download wheel + uses: actions/download-artifact@v4 + with: + name: ${{ github.event.repository.name }} + path: dist/ + + - name: Publish to PyPI + env: + PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} + run: | + poetry config pypi-token.pypi $PYPI_TOKEN + poetry publish diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..b2c41f8 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,27 @@ +name: Docs + +on: + push: + branches: + - main + +permissions: + contents: write + +jobs: + build-and-deploy: + concurrency: ci-${{ github.ref }} + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup python and poetry + uses: ./.github/actions/python-poetry + with: + groups: "docs" + + - name: Deploy docs + run: | + poetry run mkdocs gh-deploy --force diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 56e37e5..dd2c8e7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,15 +1,48 @@ +fail_fast: true repos: + - repo: https://github.com/gitleaks/gitleaks + rev: v8.18.2 + hooks: + - id: gitleaks - repo: https://github.com/psf/black - rev: 23.3.0 # Use the latest version + rev: 23.7.0 hooks: - id: black - + - id: black-jupyter - repo: https://github.com/pycqa/flake8 - rev: 6.0.0 # Use the latest version + rev: 6.0.0 hooks: - id: flake8 - - - repo: https://github.com/pre-commit/mirrors-isort - rev: v5.10.1 # Use the latest version + - repo: https://github.com/pycqa/isort + rev: 5.12.0 hooks: - id: isort + - repo: https://github.com/pycqa/pydocstyle + rev: 6.3.0 + hooks: + - id: pydocstyle + - repo: https://github.com/python-poetry/poetry + rev: "1.6.0" + hooks: + - id: poetry-check + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.4.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: mixed-line-ending + - id: check-yaml + - id: check-added-large-files + - id: check-merge-conflict + - id: check-builtin-literals + - id: check-json + - id: check-toml + - id: check-xml + - id: debug-statements + - id: detect-private-key + - repo: https://github.com/compilerla/conventional-pre-commit + rev: v3.4.0 + hooks: + - id: conventional-pre-commit + stages: [commit-msg] + args: [] diff --git a/README.md b/README.md index 8314499..7b5d8d1 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ +![promptolution](https://github.com/user-attachments/assets/84c050bd-61a1-4f2e-bc4e-874d9b4a69af) # Promptolution - Promptolution is a library that provides a modular and extensible framework for implementing prompt tuning experiments. It offers a user-friendly interface to assemble the core components for various prompt optimization tasks. In addition, this repository contains our experiments for the paper "Towards Cost-Effective Prompt Tuning: Evaluating the Effects of Model Size, Model Family and Task Descriptions in EvoPrompt". diff --git a/configs/experiment_eval.ini b/configs/experiment_eval.ini index af0d1fa..0a02b06 100644 --- a/configs/experiment_eval.ini +++ b/configs/experiment_eval.ini @@ -12,4 +12,4 @@ subsample_seed = 42 n_samples = 200 [downstream_llm] -name = meta-llama/Meta-Llama-3-70B-Instruct \ No newline at end of file +name = meta-llama/Meta-Llama-3-70B-Instruct diff --git a/configs/experiment_eval_task_descr.ini b/configs/experiment_eval_task_descr.ini index e490dad..1eabc3a 100644 --- a/configs/experiment_eval_task_descr.ini +++ b/configs/experiment_eval_task_descr.ini @@ -10,4 +10,4 @@ subsample_seed = 42 n_samples = 200 [downstream_llm] -name = meta-llama/Meta-Llama-3-70B-Instruct \ No newline at end of file +name = meta-llama/Meta-Llama-3-70B-Instruct diff --git a/configs/experiment_gpt.ini b/configs/experiment_gpt.ini index 7cf4bac..cee235a 100644 --- a/configs/experiment_gpt.ini +++ b/configs/experiment_gpt.ini @@ -12,4 +12,4 @@ subsample_seed = 42 n_samples = 200 [downstream_llm] -name = gpt-4o-2024-05-13 \ No newline at end of file +name = gpt-4o-2024-05-13 diff --git a/configs/experiment_initial_prompts.ini b/configs/experiment_initial_prompts.ini index e063647..cef685f 100644 --- a/configs/experiment_initial_prompts.ini +++ b/configs/experiment_initial_prompts.ini @@ -8,4 +8,4 @@ n_prompts = 3 n_samples = 200 [downstream_llm] -name = meta-llama/Meta-Llama-3-70B-Instruct \ No newline at end of file +name = meta-llama/Meta-Llama-3-70B-Instruct diff --git a/configs/experiment_task_descr.ini b/configs/experiment_task_descr.ini index 15862e2..a06cbd4 100644 --- a/configs/experiment_task_descr.ini +++ b/configs/experiment_task_descr.ini @@ -18,4 +18,4 @@ name = meta-llama/Meta-Llama-3-8B-Instruct name = meta-llama/Meta-Llama-3-8B-Instruct [downstream_llm] -name = meta-llama/Meta-Llama-3-70B-Instruct \ No newline at end of file +name = meta-llama/Meta-Llama-3-70B-Instruct diff --git a/data_sets/cls/agnews/description.json b/data_sets/cls/agnews/description.json index cb283d5..83a68b9 100644 --- a/data_sets/cls/agnews/description.json +++ b/data_sets/cls/agnews/description.json @@ -9,4 +9,4 @@ "Business", "Tech" ] -} \ No newline at end of file +} diff --git a/data_sets/cls/agnews/prompts.txt b/data_sets/cls/agnews/prompts.txt index fab5322..411d314 100644 --- a/data_sets/cls/agnews/prompts.txt +++ b/data_sets/cls/agnews/prompts.txt @@ -1,10 +1,10 @@ Give the main topic of the news article and then choose from World, Sports, Tech and Business. -Determine the the topic of the item and then choose from World, Sports, Business and Tech. +Determine the the topic of the item and then choose from World, Sports, Business and Tech. Your task is to classify the news item as "World", "Sports", "Tech" or "Business". -Based on the main theme of given the news article, categorize it into World, Sports, Business, or Tech. +Based on the main theme of given the news article, categorize it into World, Sports, Business, or Tech. Determine the theme of the news item. Choose from World, Sports, Business and Tech. -Your objective is to classify a news article into one of four themes: World, Sports, Business and Tech. -Your task is to identify the primary topic of the news artical and choose from World, Sports, Business and Tech. +Your objective is to classify a news article into one of four themes: World, Sports, Business and Tech. +Your task is to identify the primary topic of the news artical and choose from World, Sports, Business and Tech. Your job is to determine whether a news article belongs to the World, Sports, Business, or Tech category based on its primary theme. You will be given a news article and asked to classify it as World, Sports, Business and Tech, depending on its main topic. Your responsibility is to assign a news article to one of four categories: World, Sports, Business, or Tech, based on its main idea. @@ -12,4 +12,4 @@ Categorize the news article into one of four categories: World, Sports, Business Choose a word from World, Sports, Business and Tech to categorize the given text. You will be required to classify a news article as World, Sports, Business, or Tech based on its primary topic. In this task, you are given a news article. Your task is to classify the article to one out of the four topics "World", "Sports", "Business", "Tech" if the article"s main topic is relevant to the world, sports, business, and technology, correspondingly. If you are not sure about the topic, choose the closest option. -Classify the topic of the following news as "World", "Sports", "Tech" or "Business". \ No newline at end of file +Classify the topic of the following news as "World", "Sports", "Tech" or "Business". diff --git a/data_sets/cls/agnews/prompts_auto.txt b/data_sets/cls/agnews/prompts_auto.txt index 42076e4..42420a6 100644 --- a/data_sets/cls/agnews/prompts_auto.txt +++ b/data_sets/cls/agnews/prompts_auto.txt @@ -17,4 +17,4 @@ classify each input-output pair according to the topic. identify the topic of the text. determine the topic of the given text. identify the topic of a given article. -identify the category of the article. \ No newline at end of file +identify the category of the article. diff --git a/data_sets/cls/cr/description.json b/data_sets/cls/cr/description.json index 88bcdb5..af13709 100644 --- a/data_sets/cls/cr/description.json +++ b/data_sets/cls/cr/description.json @@ -7,4 +7,4 @@ "negative", "positive" ] -} \ No newline at end of file +} diff --git a/data_sets/cls/cr/prompts.txt b/data_sets/cls/cr/prompts.txt index 4dcfc5b..2903b0a 100644 --- a/data_sets/cls/cr/prompts.txt +++ b/data_sets/cls/cr/prompts.txt @@ -10,7 +10,7 @@ Determine the sentiment of the text provided, positve or negative. Classify a sentence as expressing optimism or pessimism. In this task, you are given sentences from product reviews. The task is to classify a sentence as positive or as negative. When given an English sentence, your task is to analyze it and generate a sentiment word to describe the original text, such as positive or negative. -Now you are a classifier, your task is to determine the sentiment polarity of the given text, whether positive or negative. -You are a sentiment classifier. To do this, you must first understand the meaning of the sentence and any relevant context. And then you should classify it as positive or negative. -Please label the sentiment towards the product of the given product review. The sentiment label should be "positive" or "negative". -Given text, classify whether it is positive or negative. \ No newline at end of file +Now you are a classifier, your task is to determine the sentiment polarity of the given text, whether positive or negative. +You are a sentiment classifier. To do this, you must first understand the meaning of the sentence and any relevant context. And then you should classify it as positive or negative. +Please label the sentiment towards the product of the given product review. The sentiment label should be "positive" or "negative". +Given text, classify whether it is positive or negative. diff --git a/data_sets/cls/cr/seed5/dev.txt b/data_sets/cls/cr/seed5/dev.txt index 1491bab..b47be1d 100644 --- a/data_sets/cls/cr/seed5/dev.txt +++ b/data_sets/cls/cr/seed5/dev.txt @@ -197,4 +197,4 @@ the biggest problem is the installation . 0 i 've always liked symantec products , except for this version 2004 . 0 another thing you should know , the metal on the flip side of the ipod is very tacky , and scratches very easily . 0 if you experience problems with installation , you can visit symantec 's website , click the support tab , click the 'home or home office support ' and there is an automated support assistant that can scan the norton program files on your computer and it will tell you what is not working right and how to fix it . 0 -norton internet security 2004 is one of the more buggy implementations . 0 \ No newline at end of file +norton internet security 2004 is one of the more buggy implementations . 0 diff --git a/data_sets/cls/mr/description.json b/data_sets/cls/mr/description.json index 012a065..40ae995 100644 --- a/data_sets/cls/mr/description.json +++ b/data_sets/cls/mr/description.json @@ -7,4 +7,4 @@ "negative", "positive" ] -} \ No newline at end of file +} diff --git a/data_sets/cls/mr/prompts.txt b/data_sets/cls/mr/prompts.txt index 8b2b746..41ed142 100644 --- a/data_sets/cls/mr/prompts.txt +++ b/data_sets/cls/mr/prompts.txt @@ -10,7 +10,7 @@ Determine the sentiment of the text provided, positve or negative. Classify a sentence as expressing optimism or pessimism. In this task, you are given sentences from movie reviews. The task is to classify a sentence as positive or as negative. When given an English sentence, your task is to analyze it and generate a sentiment word to describe the original text, such as positive or negative. -Now you are a classifier, your task is to determine the sentiment polarity of the given text, whether positive or negative. -You are a sentiment classifier. To do this, you must first understand the meaning of the sentence and any relevant context. And then you should classify it as positive or negative. -Please label the sentiment towards the movie of the given movie review. The sentiment label should be "positive" or "negative". -Given text, classify whether it is positive or negative. \ No newline at end of file +Now you are a classifier, your task is to determine the sentiment polarity of the given text, whether positive or negative. +You are a sentiment classifier. To do this, you must first understand the meaning of the sentence and any relevant context. And then you should classify it as positive or negative. +Please label the sentiment towards the movie of the given movie review. The sentiment label should be "positive" or "negative". +Given text, classify whether it is positive or negative. diff --git a/data_sets/cls/mr/prompts_auto.txt b/data_sets/cls/mr/prompts_auto.txt index 289108a..5f554c0 100644 --- a/data_sets/cls/mr/prompts_auto.txt +++ b/data_sets/cls/mr/prompts_auto.txt @@ -17,4 +17,4 @@ provide an opinion (positive or negative) on the given input. provide a positive or negative sentiment in response to a given input. provide an opinion (positive or negative) based on the input provided. provide a judgment (positive or negative) based on the descriptions given in the inputs. -produce output (in this case a positive or negative judgment) based on the input (in this case a statement about a movie or book). \ No newline at end of file +produce output (in this case a positive or negative judgment) based on the input (in this case a statement about a movie or book). diff --git a/data_sets/cls/mr/seed5/test.txt b/data_sets/cls/mr/seed5/test.txt index f955bce..75c044b 100644 --- a/data_sets/cls/mr/seed5/test.txt +++ b/data_sets/cls/mr/seed5/test.txt @@ -497,4 +497,4 @@ a deliciously mordant , bitter black comedy . 1 kurys never shows why , of all the period's volatile romantic lives , sand and musset are worth particular attention . 0 with a cast that includes some of the top actors working in independent film , lovely & amazing involves us because it is so incisive , so bleakly amusing about how we go about our lives . 1 one of [herzog's] least inspired works . 1 -cheap , vulgar dialogue and a plot that crawls along at a snail's pace . 0 \ No newline at end of file +cheap , vulgar dialogue and a plot that crawls along at a snail's pace . 0 diff --git a/data_sets/cls/sst-5/description.json b/data_sets/cls/sst-5/description.json index 2f0c269..5120223 100644 --- a/data_sets/cls/sst-5/description.json +++ b/data_sets/cls/sst-5/description.json @@ -10,4 +10,4 @@ "good", "great" ] -} \ No newline at end of file +} diff --git a/data_sets/cls/sst-5/prompts.txt b/data_sets/cls/sst-5/prompts.txt index 81e1609..afed16e 100644 --- a/data_sets/cls/sst-5/prompts.txt +++ b/data_sets/cls/sst-5/prompts.txt @@ -13,4 +13,4 @@ Your responsibility is to categorize the movie review provided to you into one o Determine the sentiment of the movie review and choose from terrible, bad, okay, good and great to describe the movie. Classify the movie review provided to you into one of five categories based on the sentiment: terrible, bad, okay, good, or great. Your objective is to evaluate the the sentiment of the movie review and categorize it into one of five classes, ranging from terrible to great. -Analyze the sentence and categorize it into one of five categories based on the sentiment: terrible, bad, okay, good, or great. \ No newline at end of file +Analyze the sentence and categorize it into one of five categories based on the sentiment: terrible, bad, okay, good, or great. diff --git a/data_sets/cls/sst2/description.json b/data_sets/cls/sst2/description.json index 7a54225..1add206 100644 --- a/data_sets/cls/sst2/description.json +++ b/data_sets/cls/sst2/description.json @@ -7,4 +7,4 @@ "negative", "positive" ] -} \ No newline at end of file +} diff --git a/data_sets/cls/sst2/prompts.txt b/data_sets/cls/sst2/prompts.txt index 996c4ba..1fc8cf1 100644 --- a/data_sets/cls/sst2/prompts.txt +++ b/data_sets/cls/sst2/prompts.txt @@ -10,7 +10,7 @@ Determine the sentiment of the text provided, positive or negative. Classify a sentence as expressing optimism or pessimism. In this task, you are given sentences from movie reviews. The task is to classify a sentence as positive or as negative. When given an English sentence, your task is to analyze it and generate a sentiment word to describe the original text, such as positive or negative. -Now you are a classifier, your task is to determine the sentiment polarity of the given text, whether positive or negative. -You are a sentiment classifier. To do this, you must first understand the meaning of the sentence and any relevant context. And then you should classify it as positive or negative. -Please label the sentiment towards the movie of the given movie review. The sentiment label should be "positive" or "negative". -Given text, classify whether it is positive or negative. \ No newline at end of file +Now you are a classifier, your task is to determine the sentiment polarity of the given text, whether positive or negative. +You are a sentiment classifier. To do this, you must first understand the meaning of the sentence and any relevant context. And then you should classify it as positive or negative. +Please label the sentiment towards the movie of the given movie review. The sentiment label should be "positive" or "negative". +Given text, classify whether it is positive or negative. diff --git a/data_sets/cls/sst2/prompts_auto.txt b/data_sets/cls/sst2/prompts_auto.txt index 74f2ade..87a77a5 100644 --- a/data_sets/cls/sst2/prompts_auto.txt +++ b/data_sets/cls/sst2/prompts_auto.txt @@ -17,4 +17,4 @@ evaluate the given sentences and provide a positive or negative judgement. give a positive or negative evaluation based on the description provided. provide an opinion on the input given (positive or negative). Rate each sentence as positive or negative. -provide an evaluation of the sentence. \ No newline at end of file +provide an evaluation of the sentence. diff --git a/data_sets/cls/subj/description.json b/data_sets/cls/subj/description.json index 185ee2c..9940275 100644 --- a/data_sets/cls/subj/description.json +++ b/data_sets/cls/subj/description.json @@ -7,4 +7,4 @@ "subjective", "objective" ] -} \ No newline at end of file +} diff --git a/data_sets/cls/subj/prompts.txt b/data_sets/cls/subj/prompts.txt index c5b97be..d3308b2 100644 --- a/data_sets/cls/subj/prompts.txt +++ b/data_sets/cls/subj/prompts.txt @@ -4,7 +4,7 @@ Given a sentence, classify it as either subjective or objective category. Determine the category of a movie review based on a given text, subjective or objective. Given a statement, classify it as expressing a subjective or objective opinion. evaluate each sentence as either objective or subjective. -identify whether the given sentence was expressing an objective or a subjective opinion. +identify whether the given sentence was expressing an objective or a subjective opinion. evaluate each statement as either subjective or objective. classify each sentence as either "objective" or "subjective". -evaluate the given sentences and determine whether they are subjective or objective. \ No newline at end of file +evaluate the given sentences and determine whether they are subjective or objective. diff --git a/data_sets/cls/trec/description.json b/data_sets/cls/trec/description.json index 74541d4..162168e 100644 --- a/data_sets/cls/trec/description.json +++ b/data_sets/cls/trec/description.json @@ -11,4 +11,4 @@ "Location", "Number" ] -} \ No newline at end of file +} diff --git a/data_sets/cls/trec/prompts.txt b/data_sets/cls/trec/prompts.txt index e7f3665..29dc684 100644 --- a/data_sets/cls/trec/prompts.txt +++ b/data_sets/cls/trec/prompts.txt @@ -3,15 +3,15 @@ Determine the type of the given question and choose from Description, Entity, Ex Your task is to choose a type of the question, from Description, Entity, Expression, Human, Location and Number. Analyze an English question and identify which category it belongs to: Description, Entity, Expression, Human, Location, or Number. You are given a question. You need to detect which category better describes the question. Answer with "Description", "Entity", "Expression", "Human", "Location", and "Number". -Please select the correct classification for this sentence: Description, Entity, Expression, Human, Location, or Number. +Please select the correct classification for this sentence: Description, Entity, Expression, Human, Location, or Number. Classify this sentence into one of these categories: Description, Entity, Expression, Human, Location, or Number. Identify the most suitable category for this sentence: Description, Entity, Expression, Human, Location, or Number. Classify this sentence based on the provided categories: Description, Entity, Expression, Human, Location, or Number. -Determine the category that best describes this sentence: Description, Entity, Expression, Human, Location, or Number. +Determine the category that best describes this sentence: Description, Entity, Expression, Human, Location, or Number. Choose the appropriate classification for this sentence: Description, Entity, Expression, Human, Location, or Number. Assign this sentence to one of these categories: Description, Entity, Expression, Human, Location, or Number. -Using the following categories, classify this sentence: Description, Entity, Expression, Human, Location, or Number. +Using the following categories, classify this sentence: Description, Entity, Expression, Human, Location, or Number. Please pick the category that matches this sentence: Description, Entity, Expression, Human, Location, or Number. Identify the category that corresponds to this sentence: Description, Entity, Expression, Human, Location, or Number. Classify this sentence by choosing one of the following options: Description, Entity, Expression, Human, Location, or Number. -Which category best describes the following question? Choose from the following list: Description, Entity, Expression, Human, Location, Number. \ No newline at end of file +Which category best describes the following question? Choose from the following list: Description, Entity, Expression, Human, Location, Number. diff --git a/data_sets/cls/trec/prompts_auto.txt b/data_sets/cls/trec/prompts_auto.txt index 8505933..2edc171 100644 --- a/data_sets/cls/trec/prompts_auto.txt +++ b/data_sets/cls/trec/prompts_auto.txt @@ -17,4 +17,4 @@ identify the type of answer (number, description, entity) that would be needed t identify the type of answer that each input requires. determine whether the question being asked is asking for a description or a specific entity. provide the appropriate type of response for each question - either a number, a description, or an entity. -determine whether the input was asking for a description or for the name of a person or entity, and to provide the appropriate output. \ No newline at end of file +determine whether the input was asking for a description or for the name of a person or entity, and to provide the appropriate output. diff --git a/docs/api/callbacks.md b/docs/api/callbacks.md index e1a76ca..af752e5 100644 --- a/docs/api/callbacks.md +++ b/docs/api/callbacks.md @@ -1,7 +1,5 @@ # Callbacks -This module contains callback implementations for various purposes. - ::: promptolution.callbacks options: - show_submodules: true \ No newline at end of file + show_submodules: true diff --git a/docs/api/config.md b/docs/api/config.md index 6ad74f3..e973813 100644 --- a/docs/api/config.md +++ b/docs/api/config.md @@ -1,9 +1,7 @@ # Config -This module contains the configuration settings for the Promptolution library. - ::: promptolution.config.Config options: show_root_heading: true show_root_full_path: false - show_if_no_docstring: true \ No newline at end of file + show_if_no_docstring: true diff --git a/docs/api/llms.md b/docs/api/llms.md index 457b67c..ad57841 100644 --- a/docs/api/llms.md +++ b/docs/api/llms.md @@ -1,23 +1,5 @@ # LLMs -This module contains the LLM (Large Language Model) implementations. - ::: promptolution.llms options: show_submodules: true - -## API LLM - -::: promptolution.llms.api_llm - -## Base LLM - -::: promptolution.llms.base_llm - -## DeepInfra LLM - -::: promptolution.llms.deepinfra - -## Local LLM - -::: promptolution.llms.local_llm \ No newline at end of file diff --git a/docs/api/optimizers.md b/docs/api/optimizers.md index f8911cb..7e9dd5e 100644 --- a/docs/api/optimizers.md +++ b/docs/api/optimizers.md @@ -1,19 +1,5 @@ # Optimizers -This module contains various optimization algorithms for prompt tuning. - ::: promptolution.optimizers options: show_submodules: true - -## Base Optimizer - -::: promptolution.optimizers.base_optimizer - -## EvoPrompt DE - -::: promptolution.optimizers.evoprompt_de - -## EvoPrompt GA - -::: promptolution.optimizers.evoprompt_ga \ No newline at end of file diff --git a/docs/api/predictors.md b/docs/api/predictors.md index 543c374..e3a22f1 100644 --- a/docs/api/predictors.md +++ b/docs/api/predictors.md @@ -1,15 +1,5 @@ # Predictors -This module contains predictor implementations for various tasks. - ::: promptolution.predictors options: show_submodules: true - -## Base Predictor - -::: promptolution.predictors.base_predictor - -## Classifier - -::: promptolution.predictors.classificator \ No newline at end of file diff --git a/docs/api/tasks.md b/docs/api/tasks.md index d3bddd0..a6c488d 100644 --- a/docs/api/tasks.md +++ b/docs/api/tasks.md @@ -1,15 +1,5 @@ # Tasks -This module contains task-specific implementations. - ::: promptolution.tasks options: show_submodules: true - -## Base Task - -::: promptolution.tasks.base_task - -## Classification Tasks - -::: promptolution.tasks.classification_tasks \ No newline at end of file diff --git a/docs/img/logo.png b/docs/img/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..276474b8a5e35c6e0475e68e91bc2e6b3f80672d GIT binary patch literal 85036 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 prXVB0AtMHN9wNN%VL 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

^d7mA9C=I<^qWA?#K{T`+IaE+ zXKPyOp?}bmud^vy5^K%;##P2xvF)Eooc*g2&Gar<`acHce4<3Q4}G#1&edGjQW{My50v;KFGF|#F+vroFYkK;J}>X-Y-$+Bxa9VImB|Bf=|+WwmE-^fYs9ABYb$Xm z_2l24J*nIJuyH^P`W?BVjIV!w#zpAv3=OrgHdq49f-oSpRJYby3vLQ(3zl$_0dmTv ziC+wL((6A4v9U7Kb8S|Ism?#`agw5j?bZvkLITx8SC#L&ishQLM44su#C$Vb{O+DG z<#-;73aO)0a5<0Gwr>n#Vf}cbC)6bJOu;<#f<{0r+OTYG%8H=q(s@fqcp+DH@sF6z zaR}M6TtH9_CWz0{82&v}VFfB`{efl^t9y87_?iFIW0js?_;@kDlpr4b)P691GsYQV z1Pm-B*@!LmabK7s_bw35 zs==#HeRu9}ZmgaY8C1Rwbn85*l+(4R&yFMr!(Wd-215mLws976Y@>Ru_J_;9A&94_ z)3_wX2m$t!9D%$mr@>XX9}{7>sf(1dAjo?>Ai86ReA}p*f_==WRH5|muu1wbkp77+ zCUHS5(xI|_N0G%caZWsCo&x&3+|N4VWb^pT7x2tMVz5{f^(r>&uom z_nVF4vf~Wf1By#)(+awa5Mhd^U(gtjKAO!;b9Bs_QWBbGVPlF z!6-!nLySOb0zp*R<9Pi+>$De;YRHF!{^Z9C-Ou0RY^5YDt4#0vS?YM))Bgx>sECAm zi>IIRCR=G^KaYYg)>LbV^D?A*RkC$8DjQQ&7w!%=`r=5OY67pxYfeRkH}JyU9OV#b zKMxe0qqH^DO=46@uocq+y_*Q+WkLxj5ERw)u#nK_!gzj-V59>qU6>9mLjH|*zxtRZ zKq+D+%dSk z2_iHL=x>FJA#1fdZ`rQ=%}Dz{135 zAbRJ@nLRp~qFVGIG5$@5`I zVsSeR42JU1J!CWD238L;KuKQK(dP)}?zrEv&i0Ni8Q~;EnRyd}TC;8^@{AJ1_hjtz z1HWTU#SRJ7Rc7;8v*HolTZ4!WA>z@!#i9JZ*(z%)*B`(s1J8V>`^XtIgJhbx^H^5R z{PbHV2tI^`=SC*Ee^(}h@*{0c0-#{~eib#8O&?}ljeIz^-~3(Xf7bL3VNah+@g7m9 zo_wqgetGIqp|+_-_3r{g;PWxVEScyBt;Vn;1GUb5{ri)wpOT$>pt!pXR`7Oz`o0)U zzUn+kWd7eC-v}}3e*e)f#006{Pgt;g6x<$*w=e*Yr^ zKm0?r_3$C3Lz@Y1h-xL5Bn}tJB3XZ~oz9|V=!L_iIF^B|F=&|Bw4ag%>SQH6Gxx7a z4_~P#2lm_rzioBFh3)2B#vq`5SD)HTd);UT3D5SB^KV9#M3Ol28=bH=!zjP4d*Cdf z3d*L5=u3gq_nKT+LSS3AA~~(${kx`tX`LsZ7N!xq>^a*XpA@T`i!UiZ=&_THx&@kC z00clUXm1J&lntR9gUH@kCU;l>9ywcg6qnKK+pQ&u3n&mpa6Lq6Hsj+37la7@7$j=H zp1|-pSX7{&skI}NeiWggyK4Rcc8n*QLX;G{xyuP@GMGo=*qOK`2uc!d#U}GpJdR(= z)+B0&8(LbG?g^>)KDMPC#~3taat77wH+{b}2;bJ@j|ISY=Zs z7YI^Tmb`>FshV^Z)1ZB$mEBZ~){(q+465(J^5}BT3**&th(~oqQ=WBCqwm;~f(14J zl;E@n@pOgp%2CZZw9Wk14_l2d^)o>)A~iZM3?@gBr5{ z%8PpIBIN(AD0zE{1f--zv{CFZyebD<6ZHEn{2#TQV+S2#2&Bk$V>S3;nKy1^(I?u9 z8pLETnT5FlZ{Zq9fl#ycKPs|Lk(wb|f63SS7tguJ@J<2GnZtNJA+hSlpb1!t_5H4M zt$G?Q`SHWG!a`I^;kD8t*m@Y(0SrF|GK1s^pe-T7zT|7V5ot#+o7nlYpqSTjotB)Z z{Etdf9Is+|6YI-mac5AOg(iL~ULY&;6}iH*-M^4ho05?T1F#54YpD8Dus=ISG@fDe zs;6^YLudheLYi3{j_Y@x#(2N3*3PXINbF94r9e`xeL?p}Sp&LN;mlBIDF=o|_^}go zSI5zMR1GZjpB0YzDxF`pmj1FQ2+*VDcn_ht%-G2qzYuThCO{L=HEi+sPTWD=MA0FfV&h>mRPzGq<{`ZP2# zu$?k$qJxo0;-F_seAq+-ANOX))kM_Os!4y@A@6Df|0zpluuAYs=NXwK04e`5jz>Xn z+)>Q_IK=gWAgc7VDD^P8;lPuwsU%4g6c0qIlfp(vK~bdUorO!TR?c{>`3WdWLcvNQ z$nqv$&EjYs&}ia*RuueNzZE_x-Dhl`qP&K$;rp(bpE!Z zPq&;-I16Pn#tg-fv2k;|$N^NP0TKc}sZqJ1|9Y(~ve&IUkT82XNiS(v7u)ZBa?QLK zCMP>6d*Ut74$Z(E&on$(i#q%fP+u4;;-Bh_JVJ8zY{2gJ|E-pg^k>Y5fV;(wfi>;P zvra2p>pzkoe<~*dw}U&1|B@>Vcj}5tO0g>)AC0)#fvuULqV7YL7FQG)-#Fqw1Y}gl zR@d087FOfVoQG@-Yun!#l(Snir@78AR`bdej^Fi<<5DzJ0;E!Xn2do<7F!XIjlXyv zC?h`nk5IX(G7^{G*ejieG~Wd-WAwCmDl^(n2wl=Za<*bUVN(&W7RTEJ2u^iI3uQIw zMFnYs>yg!-wxH$NCZ!MC+L1X^vgY!~`78hw^E*oRDA8$ZJ2VD;`M~7J1m2GrtH%HX z%IrEdHD{aEKN+@5YM5alSYoKsvu_fZp)QvH2<>pa^oW);IQs}W&e}=YY&LrGRbaUGnLBiK>D7{R$!Bh6;_(gD7@}_ zFmb3M8q7FECPRvfyE`KrSApF6ZBmFUkiPF~W6-5$UmBRpQR;GZBL&lTQ-G6Hqu2G4?#wKLcn5_!1wb(M-as#DTIxumS|5I){XRu8JI{840s-JoLB$#6XX60GfP`cJv zEvB16hhEu>T=vSO{4eR>W13+smFCGeo|hf7U1LXDic$xMf%?Xw66F~cX`59|Zu8JR zD;=sK2QLWAkh5arx|)#@GarL&XoP8UcX0RL_v-b3RUeQ4o1PnE6VdIL(M6`o-M!dq zst5I{Jv-@yK1tF_ournerl%Uiw-7?$e?%>!dh%o`>8sx-%^!}Os=AAey=8L(FA~8! z9Qmxi!|Y$u`u;ISI-P{g8*@K;yrllU!kuvaxmNjpOKMK`DviwEFkj>`NbTyl!$O;o zGAl>kq#u1W?6|cp3MDzvZ>`TL=x3Y*?88EJLsvN zBHIM}Db*SdE7Nz|G=6A`8INdQxpj=?6<0?`2m0dq?{=*8u@Sqo$5-yWGWmwbGVJTm?}BZolAhIq;rZ*ip8}asgA#F_ET=TzSVW& z?tpndxvl8cQjY1|vru5lodcW4_G&M(nCRHA^uimDs_88<8jPlc>Gew8wCw}eCtCK> z^Q#wOoBQYdgq;j|o8wtXHf}aItmeoBr2d@e94szQPvScdwyfS(EXWjdVZcs?G(51` z2wul1N}c4dVp^nnu*@#wN$6(-xzD&U$=_j(q$3F7a1&oKHRWpdy#dLp3dTRk6)gW; zccTAH!2DVY^un;X6SksPG_sGMa?yFwReb(P(iF5@qz447wLz{ zud&hS4IYE~Xz3?{Xa(A|m>?=Gb!3j*q}S$oVu}sDCMf5WxoZ(rpZH2%uodL@tHH{%whTsd&>F1@knXY%H+I$aWi7w@OLg&E`d~YSuO#hd$Z_c7&=Vu`e5Z@kO+lV8G=UGB%8iH-IBORE zbN40lx;lw-l`qA4m?A%$K5%?CBkKa#KxIK9I>N0EgDEg_Kid=^>0%pUF1{mpq=ZP2 zY<_w08p(MisKpcB8{Bf8{iyTb=U5;X=2Ci;Wm}t!+ZV77_#h2xYSc{;u#*UWz3t7D z!jXO9K1u;*J85v6b^|55-+<&Cbl2};!NOODBe+MVC}#e7AWnSbw)fBm*&>SK@Fx*P zUnJ~hNEhw3PD8Ri%>S?om-ydx(1P#42k^wy*!{YG!{J_ML{oTxko&zmb|~XbWUIMn z^Q90lXb+gLei2f%H?-4|Px+4@Q};NfEI@_9nw2ZhVv}`w>U}cx2NILyOU2ztDUxT3NNyUG~jMkJiSp%OrHV=y2`OU(w98hq}OQumAh zX?y`|jLa8)&!<%7(_JJ&N$+ILm~hiTi~{3|W%F?8Mg_L^pMgU%j{1NVZ`4r_uLdZ& z$euY00H|b6qE6K@!$wo~0hM2dU}n_NI@v-jR`7-+mLLeEJdiUo=n9~VDO-P|3~Aae z8~~yyj{Io)SG4SFfrl0gBE4$#<(wqENlx#JVaCs8|QYtzg^z_2DCSaTxe* ztoC*({?^^O3?m&^dZ%{R$&>1(IN(s-J*eTuRRqIJfiFdaXb${#bdpENGtF8||NkVb?b`e?U5An%xL9GF5=b{D zdR1fA#GmTRIT__-K+*>o8X#(gvX%nb=V76b;=pJrJ_z_9YJ|<~EY|Mt!*2KXO;Pco z*avP${RAu6UiIt{lK%+snxfy157M$xG1pWBa?k2+Eo=&Ee< z`Ne{egz6ZO>L$jmBmq+)F|ssIv~^qcy@G6jb>1@qx z|D{`aYM~>gnvh$q*mS@)!svP|Y;MEvX*!EaB9#m&=Fh|fxH2Fs&2yu9)zR$vP5den z-Qj6S?xqS0`2$yb(pDhP#G!VB^BnV;C1No4l71alR*~e??`JB!POU;2Y9gqE@Dqju zUqP*znM#*r2jmF4^<#Jf0r)apuUIIISX=&Qp{NIbKN=>(ufTwJO(dpm^W;n3@3ibZ zRxM91=Ju}dC4rL1=kS~d(UkGFu1e}Ir=DJn>jq?~RLxOs6}4v_KQi*4-_+c#vSGr* zlsLZg`o4RF_aq1ub!T^Ff|FapY43`jc*tnklE#AJb5 zG?Qbjkj<|?)b1g(o)OkPBx-`S8_u%(QOTGO#+D@u^j`wo)X& zQ%@TbU!j@VRVF4$ksXbOlFrcv~orsQm@v5hsw;GNCSygQcxZgS=bBTV>?n@4ty91U`QTHCMnu|&b z4Mx|>1hR@XOD}n@`ZGYO4@jO~B)v3h@jtsdGex%4tOc=zG2& z{TaWagkfk7&&}l-2ef}@Q8YRS)80~=>XiB^y+MIv|D8?D``I^Cm2+bQzh(x^$JcUv zhUNB!T#1(PXT{E|e_ZOb4g<27`amnIy*%DlR8##h(r2ajdz$M1Rb0u;Il(rFm8f}U zSlp1i`h2f5erkK>A~f;O)w{REarx!gi;H%O<%~3(Rr23-U^QUX($^Zcu9{SBcCvm< z<@a(31xMl`hAUrkq^rwPvVdez6Xom-g4X$lSsAR&A@3JOZC2wpfyq?cOMldCq<U@Qy)EXEu#lc z7=(8;vroqmK-P1}5artxZZ5UVnJvdBW&B@8_todj2oFI%B;6+()HGURJJ_cR9 zbBELm({#3jGm#(~|GV&Jru(NbFnfX*5y-~){`rlnCX(CBG-ifC$UA#1UsGh&>-yH4|=gmvs z73@>_ZL>@`6g*bC9KnBn3v1Dt5-kel1G+N5^l!rwsrnNh=0A^1#~n%_wo zbxieo0}~~Uu*Cd5T~5^mhbEoeTOXBhh)KjUx`38JXrh-2eXwL! zHWPI^4h1(2ECkc{Q@&Opt86&;DxJ{_q_4@M$?jp2SPUB4vj1<%kOR|>yt=ewtU`L>tN!MjdoQfcfIYa@EkDF0 z0w0msM&oK4@3HWHEW2zLL_r*Op$sBIGkJBVqYTTuC2(+|86VYxd%a-{fzl5CRBxv~l zt1;7==a-!q?-vnm%4LSgzW16}J#6*E=%Rvm3Y>EW!>|QQ%7~MEMNsNpt>{<}AD6vO z@qQ+Gq==LlPwDrm?PFPh)W;mX#-n9~6P7sOtPd=nTG!iYjJtH5Ve@f()6>H&l49Bz zls%&Q2YSOxl6>Qngr0!p@yc45nEL`&q;_73y0V>b^Uza%>L@inD6m=z8r+Dtei+F0 z+;!Vos$$>Vk?w`NYFBWjLqBRaRBp3J&ZpO9-V3~-A|7G%_}|KdESNMMiI1dAbLIm) z)mZiB-C?e(l1Tr0jdJoJ&@Y0H4Kkuee(W8!0{8YyMRe!E2Ia5Sr4Daw?MD%jPY$Nt zXocH;_La4@%Pat5Iqnw4ooDZiw=bLz^IXN%J8EQq@s+-K3TB~C*Q%tv`J#;>9u*XIx@j-NG{L^BqF9(ySJ3rqsdHIgrn{JGYAUe(`_QMS<+< zc2o!n!ec~YG+I3geG(!uLYkT`jo(IZW@JjNDHR&>e<(!}+zx^7Sdo4YJ!%Man-U|q z395>szh422xT46ZLEk1+^JFp8hINE+5dV>UiC%4eVadC>cx>*f`S#@&(5oUKdhBrYJ556 zV&x=o)gDk=iS_o^yTllNv{AE>Kj+49NkIkx#(|^T` z2w<9T7R()0p$+=4R%99%6QSzf&l|k#Tqd`sPwK=UOuxP}8i{2_Wl5_9x zo_l>WrmPQuMU)_J{oGiI`S6dr3Z`NB{9jdXd!&}X1y0WAPs8%eUa#i^f@Yg%Xj7KW zDhf_OoeokxYN*12P;zEG2OuPdthih*)jlT zXYq^D7u|t~q-rXCEKv4YJ7I)J&A3fs^p0LTj63rn^iAiD}82La9x1=Ce$ zA%0+>^~O6~S@oV(Va^jzZ-3F?pX@Wj5;nX@(K!?V2!|YYda365>YA4ns|JlcuEoz_ zd}wgg64)tZc$7M$&z}KZMHfZ-o=64#9tMhNG9YYVm_QGRD(_$yr3H{IqFoIEif}r} z&b(vYgBfmM!p-y`;ZJA`!AZz}XvZxSI8AAFGTJEP?`2Bd zNbJ|d2}iV*Qif*2>U%dQ&apFOkXdxSGh(-sT85Nu<3!A~{lZB|ktV+k%fuI{x&WHb zF#k1X1at=YT-3q3dp#FVw1TUon9mzEwIX*uJt0ikDLt%fiV(+Q^FNxE0~^ah=lHCf zqq6_T!B?DR8o}cl((3*c#D9jdrzE;p#Z-i6{w7|%ooFVW_PVE#(YB>6+U$a!N-%t4 zms!35%;ZEYmxJwn_9K7QyY=c*ztq(YFq5bLf6JO_J0Rt7{WFK`+Po^w!=DC4e0IlUI4(&g=J(6(>-H zh$|EoN*mRu@5{STgoTvBV++~hPlxidZhP*`*JetPy`*1r(dlRdp~{PFbrkogQ!9<2 z^V@m)qXf*0YZ1er>?$n!XY11Xia=*F#1dQ_gLfb_zO`itsb=#~YJIPPlq|DZewh!< z5=*dAQCy10?+`FSO6DJ{gs_t=yhhr1NXqcVikL@J;nt4&_5XkM^s*tY8>dqAN)B!} z^vy%>ToRq7z&r71?o}0q#|p~?PW%m~Jng>Y9BS(530i#JoWJB<>e(lVndOV%)j0la zqEwJ>u`?B7Fja+6RyJa`%D+}X%bzQ;JwR0E#LbVV4nBRF+(vg>!Z{1IsU7cKr+S}M zi=C(!U>FK*W0UQ#SD967l?bpVFhQ)fvt|f=FU@{`?aucCk?c}9!OnsNqUg)7w~%MJ zRs-gXhoQ!{>qq!Em2KoQ?T)yN7Q`Mt zTfn2`PngfY-r={vhTf{eI4fH0zcZD9T?{u9u>!ic^V?wbmi@?WV>uV_I&<^i&#>J@ zCfuko(C>5>(#A=G_rK4yRh_e?L9xAvjYrvk7HaWQqla?SDfXcYc)Lqm1I z-Z`{VTrK;TY9;nr(D2!c5`{7DKbvx!5P-MQgX-gHQ3g}4DKPG&vsg*!Tr~zm7M~4? zjk0buJwXTW_m)yjrKzsm0(5Uyv{)QF_?6!JMYE;{t&oN+)aL*B`XC^z&bRt-d5P8U z@h-_;o5L^X!(=iw|0X6aI)H>PV;U%V;I_7^X68?UK@9~WZB(js7xKf=?jQ0?2y`%~x8d)#m2!A`y5ptxUxV!@mp^TLc87w2DOQ6W zns{Jh!~U_XMovUn@H;ngberX^$(M!g)x|BIKfbB(AjtV^m@=cPUr&sUvCqw2SGG?iyTCwZG=RUeGI0|z>fVx&!YGVar%LM7gh)A*&q1B=0ON=`H1$7>d!`@spw*Bng$zcpT&i^CDxHe`NRz1P5U=Pj*B=YD z`n9^S1{8@}Z2o5GxxFgeik26Mc>2344@`bRcG-I@D|+MOvqJATD}eeE8|nCu0U<&F zZFMPKtOpb3(0SjmlsXSx=jC|@3q4WLRC%=3x*l!m&xyKq#gmN>ep{#+z9`wnEo4N{|$59-M=@3zw@_i z`BA3hkT|?RpkB}Tzxw*R=_1$Ye$y(<_xZs$@_KyQ#TX~U64+alRY$Ih6eg~RlJnK@ z-@?<7n7;h0)9vhj5A%2K48+%HFEzUEd#c*aJ_B&#ztO#yFqFS;J0Rgssg$;2f^V{r z>928WEj$$l zwB(tZ!Eln+ha!ZSQg*mbfp%ZfTSR$!MOh$~zuds4vNX?pSqF}J$=bAUR4; zaPtkSYUdQriJ5T>hIg{&w$?81pHt`Fmo%g02f#+^dZ!XfO~HH@I1p(xSxH#`QqaVG za3Es0?-QC2xWbF>&hok{RvvTU>I(3fKNJ*Fdv_Z(@=tIxfJ$D_<@~a+hicWfqXm?( za}Q>=OWQTMZaTJybb#|j_v_VnZoD!LBMcw@+Qh*bWwn13KlV90FOYbehctx_RdpWI zd-D1{({cA9HUuz3hTy#&$yGeV7*K)sNdJn`9}h3eYZ>ZJ0fPF*0AarhfaUi5c<#a(G_Em)||V=XGs~g<9j5? zPt?WDF!$K%3azX_TJ$0_F;ofKdEH*^vzJ(n3;A#p9>sleCT80DU$@fwg_ze`$>0&n zz&-Rb#Myi=GK&VH%r8xrrko^2;9j5Ynnq_loS2`O1L%J?}KKtoT z;Nlijd5EKNIbgx}z>jc%MkH;W$O6+I<)N#^1>5fZLw;3xNv?0EuqvmB%BSk-C<1$6L6- ztVC39dtam(^S&II%4^XvtpC2TCqC)~nyMlGctJ41u0Ik4@4F0|)7=x$dqJu46+eAf*jmHn#rK&10cV+kY=s+)y?J_Vhjce4p+&O3} zLs|jSu`CQ|bRq66{AT`r$O0Q`WA%*`Up{moiV!cCMD3%RNOj{FFIl)aGkYdzYaq*adMwZtIT0UnT$5+*} zSwmMaCjs+^)zsk;iqk2-*7?kd8CD`TQvd`qiT0SN_pv8<0rLr8WJP}RN_0do4wR!UY;Vo|L7*x(QTak32#{4?k72s=;~Tcn3cWD} zCU2;|ls6kQxJcGJ^CS{r(rpWSwDjrLt*yS*Gpjnm_eq53$AyKJ9U_3%S>$hM3yY*; z4xR%iH({wEoM`t0LOXev54svRbhli#zzwBfp@BQM*1ijs;|E3GiNzROk^9-^l*?TD zG5B|EDC-sfA9x(S?n8UT(C>M9pKs{X2NBgvA)^l1j%X%`l|8wnE^p60}enl7!5?|s>3wgs0<)_>TLj3$kE{LGBP?vswyTT*zDTg5n_ zw2V2GCC_*(f78z4p8*2$;nuXDQ~i1#V(I`_r6wK#t&P_!xOpY^v8B{oX>C6uoE{gb zz}C6UCzx%OS&w_cLu8^f9ugk5)$<1=J)u_&2Z0B{ry?SJDoA@OEV{?W0xfk1T-XDh z#R1Lrb$phz0{VYkow|2+nhTbto`~6Y!+QxTvbMdYx=;^0b&BOI^+!5&_hm1NU?Fty z^5gTQdQUsFHMkNU5@i(Y@LnR|{_XrIw)Ckl$fpFPjGlQUHDpz}C2F{Y_n=e$M{|&k+~=~IWfL0@PzKPOBuV9%v1TW@9V{n1y`cwJ-X0JWILE(@ z^iGIN=Q{pCxEzeF@1KQlAi9#K9zV*g|Ho^z&3Ox<-_D18^P(Q?{Uvn!)|@ssuQp8Ki5eh-<$YoEM}!@)%E1uT{Tc3>OpNf<2Jp)jTN-MN39#@ zplHenCO$0n zKxc+YWG@Yi$*(2gU^c7%IZGjh-YA^qV_-}!es35~f1x&$cbeO4P6Lq`yDj|-c4lzu z;amzmQqDtez?Nvh=E7EPCo^x62Xx)^FhX)yffmTnd5>G=jsl}dOT3KZJPT00M?tyR z4sTDq)U|nv)^jH~%wra<_gkFm>p1Od_uW16!6i1+a|Q06bG;9CUOJ6B-^Tbq`FlL| z$wSUY0Ko@i7w&AP?ZajRR3InV1~3*KBUk*Mf-9pSgHT{EM>npNCN3<4t8IdasVp*0 z*s0vf-Cs!b*}8^X--NIDh^6(LT**I&_}l&Y*OOhljx~XPDN)a*k!F=r=RZ7_i@&_V z9RN^GgvRWZt&R@9yFYU{#i>Pu2_G{at5Dd|#Hyn{qJ?p3WxH-5S^>8y zHW5*b#MY!Mz5Dfh?Mg>{4Ab}p#`kAaU;Gy9UH$leeD&`7T`n(>v{<_*A}rn}yE2+3 zY>ToKKdB>Z^uEP* zZI|CEu^4s0od0Kg>|(6q^(2kiPVwcA3*PUz(^$WD#rW`9Nmxmay8yos^q+ii9EzKB zyHk!s7=Y`TBL9<}W1xS8n{Cr@bDF_cVa`Dbcz#jBt?MJOBWJ~wRg;luY;~;-2;6`a z|K8V<>d_PsfuuG)%uz{p9Mdus{dX-qpxL9^-A(7r=Q!H8$=jnqXudCIO7IuK2sXyD_r?5%2hjTsKPZIsRj-Qf zP)Q0YA9&LaMJ1Agh}x|CT~7Ony61k^@At_Wp8I0=9S!amPA_wg&9mIu$xz83xm}Z6 z(1AX8BPK;erLwK_`TODG{Z-J7@(4aiPiIEv?d`5NeBhqc(>Gq%d-sX=oU0d4=vqxW z@#GsoZ{y*y+xbTC50l7Jah^xsQ0mu^Je>iZdWWv1ofaWO4b&)1S&A}mLifk#o~h1_ zpF0PCCsaQV%GyK%bmLODLX)I^uf$KUB zNrM)$qk93sv1La=V-Lw=z4eaW_E((wM`#q;0|x`$v$h7<$ze8cD!UQt7iS`o*IS+` zesufia>r*9bj!p|@6Wk{09rAqoqsQm6=A*@B>)e?cxigM9-XFJGW~LMI4gfvXszi;`OLm2~64 zL-|51QU;H~s5)LWQn)j$G~R|1-m*Xbl^nMJVBwHi8Cw=qnVui(#s?t}T5BodU`UU^+o>Q!{a-68$-Tj)UI++*n*tjw?KfNlS zMy<1OVRgm%eCh^Qp3MvW(WO;VM@-8)n6Jt+dz?J6*ySUaUGFZMv1(u{0%jsS4NoB& z-^4yEnpT!FIyZ}^>(~2VZpdZa_(09tQkokrb+x_$pbkMDkTFcBJ({!y`}AwPCJnih zUaTkMz`jLV??hd2SLQoY`3Bil=2mO@;La^Gd=O!FEtz=NdNXzDj%+iyYuu`x!jWlr z;A;>SFDrOhlnX#KbtpakfkRFe7c7sKx45jKiM4AQe;nLn^EPqrI=Alf9`+JnJ9`|e z>yq{~jL_NH%5yWTWvOnJb#;}vP3 zkRc}33r{fTDTn0&=TByV&5XKkLXDJC&2|i9)4@0Zz=FJ(eC?pEREX8S35G}T=I^n3 zSSH>=BC-24i6+c&26i^=E4cN2rYV66U>Cs?C)1z!*y&Q_nsFJ@mR!Pmvv!E}jU||r zlW9<4Bl6Z#k6Wn)X{D8d{@D}39Qn?*v1dc{#T-V=jF%uM^BtzgV2J@%s|UWdfVO;A z&)Csz(&AgNyl2H>3r6|uF>8)U+mgxb-%75xrM*&!_h#q`;B&(*&j(%$7~Nj2&!={a zyt%C4P|tMN8mh67Y2H9BG+Qejm+>_()JCUu4PZGyZy-0>OgN@|5zo8I#R-r*<0p6R zH0bsaa$$jQCR92qq@p>vY;Mo!!-7Zqe$BDzghrWEhwUKR`QKwV%vIkT-Plz)EFypP zD;A2fnc9qrQ~v#x+(Z~;fz+0WrX<_c|8;kUIY9&Bmq#c}BbxkBkjig_VMoFMi^9ab z3A>h%?)Oso`c{pFS6f+E<0w$u#(+c9##LdjqeV2E7g5Oghw5 zZb%gW%M(a4r4!W6DU{syqUwf_1>52T^SdN=QNLjEcy)rxwxWxfud2Tj>oSPL3YQ{JvA zO$*2aQrKyi7SvJHtahU{IkcaAHfW^e;IGFO1mq7J^hK$6-`>9a*XG++uD-=P8feIM%+ae-GVPWedyBKdC++5eRH`_7L6EQ{_XAUVVLJ! znehaes%|{fYfxEQ(to^6m$1ze2IiucZe#wI+$?5^3TRjFYN6tBJ4=uv5fM;Y$J9Fi zLXp-AmZHaKxVKmX#Yjx9)#2!Q?MzRds}~I68yRka?e*CTm z=pENp+~vEj_JuJfzv_$~PtXvppE7G74AQ*_fo)=RixBLh*<+xpdk+*cL0t1>Ru*X= zy-?f{m9Lx+^4nlCbm)`ufQK^0%BOF5djT-Vt(Um0ynOe?$vKfp0qmnJ>Ecm zN#t@i9RjVt5NaAi`u0IvIr;sH)IoCNwl*#PeOJ#R!HnQwic-}g%BeYUgC|e(alJ5F zh8E(hy8kt`5G5J=&#^4oyCEh~X+6dx2mO`PG(y-3&}cOLKcr}l!3DW$E8Ns=UZBvt zH@I{ZW|mc$gO8tj&x#ri2=r$-P zC+Q1|C|SYu`k%1A2XE@=;EV6|yu9gyg#-gOg3qu2M3i^GOWxGxwHWnV!YTy~q~H(c zaJaM4UC{vFO|LtaG}-$QcfXQd8@<)rG^)Kl(U6l`3$pnBf=32Hb8qc4f0s(;4X1-> zt~EwTH^GIgTb6IOj2+-`; zNt=B6upIsHI4mlOxEYRKsnMl=W11r8X)3*#(k^&L@&;oPY4v63XPi@N%SKNC-*aAG zq$>v0YGJfndt&hWJ(U_akp8qwZcXbUHqm|+V0FLC&nqVpRMB36&jMBzl-wTwfWqNa z)eE-WR=Op~R3St>n7~M@vmwEq)in)BvQWOC9x!+hSpER}R$2@c<+vtG4yl;hNYrnp zghrGW6&B0%0p7Ozc>k#>`HP~|&NNa@;_diMn#5m zNN3UP8g1d*GnFZQ3zJ|w6Nwa%C7iATd6l$^jD}T%y|ntW0ni}Yf$mg&O(fCvPc*a& zWa5fzF`v}rG481HikmVvi$hC2 zQ?&k?EF*oGUnH0z2!uDf%7|Z|eSZa|dDsx-Op*e5!r-~gM#U0}1Tio&)Vc*kSr96L z@!Ov^jiOn(dQJxA1)O#HV@nuHA2lz0E+CAgQt##rJe}pjSpW5Ruve z=sHhaAZb}=XM;u=WX&7a0<|6d3@SgP8a8XHym8MROk3>l=CXo-F*v6CZB}}c)YsG80ek#DwVa$u>kofGVg)N&NBi4c z;3C8E))$KM_VPUsdJmv>u=ZDno&7Ei7V1H}A75%fZ!zRxPJW7%O)8g&(qlRmqY`BRi-!~O zM&?kkNuMl8vdBudwBQdmf@SXENd}jU*p7yQ7w<-14x02(tBhg}uFSb>@&6~s%l%7u zqcGUaa?9>6x|zJ<(>(X?p9kskzh0}e2`2=*;y0BKrcSr`4MIfZ#RqHM0okW`4Aee@ zw&Ax+Y@Eg!aX`S#JIj#?d9(2i1xuXPdFPFO4K6E`*2Q-{R zLM4p`65h+&%Z7pahfpryRky(|aT6^p0%>TfZ`_Z6aJAq545%Z*R(M8Ha?8QXDv4cy zO5l^!AE3s-otWwq^wi&PLUv})&1$!-hT12Di|TlWAn;!fuRLq5ri;rk+TZHLnV8i0 zI84s+5|h*lVo0of<_#OEytto> zUb@vOI{A_%bGHbY)fJ_7Dao*$g4&2=hrc5QPbP+I9D8u|%}SL~Q%}XDJUkZ@M|6~b zE|^*9-;&ji^KR}?M*A)AHjy<5Voh7=dt*zinew#C3kjpWxw&bt{#t>F4Z)=0v+Z1Q zXO6^PWiKs$l=d4xnCYX+zhE0jJi;%GsNxig-#e*Fm%0>1HEFL8*C&r%7xE-_ zXt%8+P2|?%Z@cK5_Q$KZN6NXUJCwjs-dNh~KP5D8Gpw}l6oU%0&p@G%-CzO47HXN} z$YD3A*!lnz0%Sq<%rx}^KeQ00*ny06=R*~RYM9h`Y3tuy)}fLFlu54(`abZnsc@+K z9GSCNYn|SsZEu^o`rEEGGpeNymUXrL!n>b>Emg7U`o= z5L_}O(7as`Jr(Q4B0iEkj;$PXTpky~S`h1WgaIe&)$i<@*LI&0m^$vlp*}dPNA*l+ z={pb8G6l-^F8xwDj(kl^lPnP9iQp!uas4>gqn$Z|QPD1b8;CU5oh2Xm>as6xIxmZS zcuQ5HtdmYjZ!Xn?u&)nsMHVRvfx9RSsyGOBoDX7TG@78Y!dsNVXT`CrtJOBQY0=JO zln49^uuD)0Hm0dJg5m9fLO=CIcWEVCLqXBkCmHt-8)AUt)!f6EUdC|-t{SR$Fz%Qx z<*m$1acRoe5tVVoqn&?E%8T#(ux}y9p_M5l5lS?VCz;@4ac@ws)tEoYD~~&;HqS+4 z^FoA9Mw7xqeS*65kvY|~s!e*_L5ob-=)e#13$LX+6$6ITE7SJsoy_b#_l~W1I+l26 z&quQb($tP$vM7~CF6-9+wL_*)RaC=Rhloh!mHgm!o}^5V-Q#%6q~DEo;L0{8XCIcj z1TOBK z6GtUe_cdw0f?$jqV|aKHjZjUHIFeEZY2pM%ycei@nP}waPru%cM})S$i%7$|XaV|4 zIzbjgjtYwF!&pT_+Mr1dAurl8U^o2|M#+vtBEySaJkjCGETdY~Y8!aLc*+294AtNQW+=jLGTI!5*wfI+Bl*dNn4~~;rmg!X0JAG zPB!NaZ}md_krh|tNagBe2AdCqrWeAg)9%^pA1=qzavRnlV3F+G(?{wdOp}sYnWd)> zk#{p0A9jN58mRIIy*#}5W769szCdS;eKR#KATvp$WsEYkmkplspUX|pydx_6$W>Vq zP76X9Q+CcUYoKD+#lq)WC3*w+g01nl8(a^B(OlCqq<+gLxj960EGb3n%JCmP0+1R_louE}{F>h3X_u+6slweVJ!cBORw<5QgN7 zlfxGTCXY3O&O3+d%^=Xb6?F!(W~AlnSm07i9V@~qHX(Ky&2g_ivP0iTZ*Sws!{fxp z-GUN%OHU1d+L5TD;|~+e%dXDNXTSusUHs4{74~9%xs9n{^v>U4Zp%Sj-q|mSR@}OQ ze0@~sl>H21(=%nuUaZGF)x$yw|H)af1U5ic(+GAidK}92E^DV_0Q^$=Kg!&YBCz~* zF3rSWh+waxb}WdLI({i=)?&84K6yMcaYn_uC#Yp?CzNlp#Z_%Umxp64(8q01`>w1y z#0(>x8;B(c^cnk&^*Tm?MlFY?A@OoJsoHUB_eUH$&>5|W;{&!vP#UU1xM^7>9H%ik zFZ(jh#Y6`vg@f?!y)w3A(d>aV{jd7Vnd(5ni|DHK_Z38ZAHD?n;p!wQ+sEq8+AJc1 z%AY}6yfJy4TlXFZalC#mA&o|L!UYxNfiN^|pE2>08oAi% z2i15OkSrb#jfwB@5~T`YiUvS0}LxQZQf-D}+y^FD2K6BKcg#!%rxz=FV$v3$;JT>Uh3 zfO5b=P-E@U&O|NBcv^8~?NnKb2qrTv0g3{%rL4x*rPs~suXd7(-yixRy%lyE0Y09i zhg46rlFM@?7sflfy%Q3uuoeN^OQRUG(lV_ICBn_=zQ-EuXLy%)N0Z9Cci4@~S-`?+A)hhVTupzVz&_c)q4AI>P#)~Q*+Mm|38 zfCcak>i=A|DuizCFY9F)%uKVs`+9@lQ26E^_3i*`%e8CU2{HLZ`B<;>?sT$KhDf2) zJUk{mh_tk&<>xdaqY*Myv1!}1N6HD4q^6b|fMGLEj)qXyurXWg;G1t2jcMdHu zOKTQ?lDYYuF%gxb9XF)}|J@rpT<7cwG$(78GSeIb-4Ia@nq5fS4qMyQwtB+-A`xlw zv21c#6eE*$#U}Z zt4lDpvHB8=h=e2ZLtC;w>Fxb{9PrH%CO*m=Vspz!5P;V7o0R)oBa-U%I6KSZmvb*Y zep0MwTJ(7>noaX7de(UV{ziAeZ!q4G|Do7hB`-HnCkdQln|A#UJ3nC=Mp}-}wQb^& z&Vv?$Zl+E&cU|0M%|sKCsby?`;%mGOx6;lp#-<4o)<}4YC&U#x*6iCKIpWiwaVzNF z&5T0L`o9Dd_upFQHg`NZn(PaWFcj-~Hkfrw+vXn18v`a)!wDvs5cc+Ry~x&ExTvcM zx#7^X{HI&yUx>AhsP_kpvikYM!Sg7e;*48$yC=uXQ)7uLe*f6qcK?!3ZXO>|4D3Q@ z`R-MDp=7VuF|kKd7|<;vDeXl5eg<#TAFZE%lRG$&ri?kX`U>~lrC}9 zbI0B4u}9PyH*4`D@r-r8wxLdGJ^6QZmeLhnP$pvARRWiwsp>w~vryBndmJu&9G9qV zlW1kX2FsQyfD2mxnFAFNm61-gDo2hrlDU9A=Ls}-WFbH_;^F@9NTFttKd29zDaiXk zK=uE$Ey;8Yn+xlAem`5g*wRAIuoqRdnHmPbR#t_Xc%t)#{?@^&Jb9&IZm%?moDJnT z^+0FI0e8*fEx>~^8_(3<;X6hVw=X0(>1GVnKlAsTGw+d_%xw^V5u#@NRI=kiq$R6>XBX`Sbv3e&?Vj(YjKuy3c{tEoIO&VgD0H*G9#)&{^yo zFDh@7_5FANZ0IHW3|h?P6_{e>#8T<_FK$j5rrv$>hCaQ{E_G5#IuIbp-2Jm*l;3}z=RG`6BP@ ze+wZ#L(i^UgiZzH+glp_cFMN9VqK4lS9jNCfciIxPW}XIa+m_zGyN3Sclty4XPHxT zwaUzG@}zs~?bF?qEbaQgIGpHij6eMlJ35bli9qOWPYtv8DZmFzlI{SK9y`txIOfil z?5Z=M;FCAtHzH|`y3ZO+^2!~0^2rN5J;!>+f$DH{`gE+OoPMUB1KPGiMCZAStk2?n zo_=|OfeRSZfQR87HZOATG}hX$VXf8!?huej8IS;&)6F|r)gJq2Dzhh7+4<4v($7Q@ z#5_u6pG(7Of$5&QMqL&B%X;7Cg{h+dg*nF~VRUeEK5=D5DlIypQ1iu*cuqmxUi+F~ zSEx%#90Z-)h>3H(U#=0nPMTtTM?4@-F7x_Z1BOExWCM2U! z%gMydb1v1SL~Jwld6B)xNmajy*`Ivf>~Q&ykcs+@P6!2s6ZQJ@U($5exKp zypz`Skhy8hd!^VmRlyTwel{$at!OHC4L4J?PNAM(u0F&UOmtCgvk^hs_0yf()d(lU zjE3TcSJ@@-96z9 zQ;CuS>)p!E&T94BFw7;rcqW8FJY<)`(=+z3-*}XpYs1_)dcF9FcxpKd#3fRzLNZCm z>Pm>xu(xycIn~|wvoa@h1Ru1lNFfpcgw^F$kmt;n0p$bD*PXwRhpX5YG}s-67}`3q3u zY(d{?_FJEmljETSkF$4D*`C^vqb6}U*+%$zND0IBD*&Fu#%Di=JMRT)5HNt4EhWsF ze=>AVBz#VgIp@vLEFoKE=8QZW`HVLX7YEjlB|QlcFE%>rxM=yIP(czol8E$OTZ*u| z>6Qhzwy{`+zu*b*9}Mz!Y7><6sw|}?rCIqBV$#-X@i!13Vy`@d!&HCvz_=M=`Q>kx zl4gGuhdbL5A{Q4oO$CP0#U;JkiBL}UnwdU*4OPZ#p+*Ve@XeK;fZ%-%w1_SUK{S9p zYvuE08R@^{Tvsog)GQGW1C5=9-rD!qUQm7UOU+tOu*^2sc)!3_jeJ_Unrb{~(fWYC zVa#wPWaZbt9-&Jp=w zQ5I&+0a!-){m1N=G#NOS=VK$B6fkm8l)m^#$5+3 ze1lA#cpmC~s^SDL*7@K?d2LAuYZ%v zb!58l5K-zZ-c5VoC#%o7oG3kFkTC$YlCH{=z&?G{y|MHcR73UcZreGbh3ZUd_I9*V z%XZB4{&D&3)6!pZ#~G$eVtWi>4KWG=b9L-Lt1C>MhJXD8^@+UQ5eeZ3mqk;;${<#v zN^BuZc`@mEo@D)aZbL>+l8MU@*I};uhq11V zuLdqJdg6JxYhL7-l@F5C-$wBiL}d9(mM5V zt$F$JpvzrZdNa<}w9E2x#V2tkj~dF`SbK{dnaTUA_QPUeIiQ9XJ26Ef9-ElVfbjT1 zoqBHtmbPE5?n<=%nat)AbYrFG^6E0*XpX@=i*;0T7>AO~gw&UY79Rddz^whIapPfo zfNu|*HK$9Rmz|DhP~RZRIj^d@u&^xeD%RO7FUf1p_hQEj@puR~%bV%pM+7l6abnwD z*Nvu$&|W6rLNPv$dIkdO)n9dCf3rLn_GA}CusdcKIrn&oVk%>aTx*{N&%6~p>D;sQ zVfGi{>&*TM+xPkH(?2}x8`97+cU9<4Xx;uJ@ax{&k(DtJJB0PK&}_+ye4YNr)wTuC zaZ|HJqs4LogrZxbjai=xbBfoRG26p|n5W%vTlecNpe@LKNHL`^k3Dm=+3B&+j0jKk zw-|Y-qiN_tT79^B&Cyn4y@9ekBwP5Mo{t#2DjlVUt7%F()mO2PW7LPADU^O*6ATTJtav!#!Bhq^RltM3(~ z;_tP7Zsk(mn#B(^HG{T=wlBauJx2}h+w$vM#Ass?ilrKf1MeZsIc<-df1K~wu*OJP zUg8i^z#I%}nuQ;S!@HF|KDuomZ8b}>XnYBE{uNjCcRolV`U!O@Rj{3qJmu(HZ9A6e zI0i+P`z?Yvp1Vtrtt-Yhxjo8e^%q~io6sJ0)AakQ^;cX$7EM)&pu+^1|x;{R?IgWVdj6Vj>MrBZPh zeEp6ybY;au?UKwb*U|=_-Cs^jHFvesv^n6$N|{+;3%YZmb&>c*C^F8IN5JWkBmd;S zogm`#)3c}8HNU!N8*pA!*>bpIx%u`9wkLp9A;9;`T0*N4)0Y17yI9xbuROpS74^w| zn)mNFXUxZZ80;BZ;`Hbu#X9cdRa?$5NAQ;%Cd;c^@IE0t0s4ZwNXAgO+Qq5$Rv#nc zvajQl+8<(7Kdrz0{vAlRIK1HcBHa^SzEWX`^a==fMcqo^+8e79C49?%sjV+(+VN07 zsKk@nCYffh<>-hkDR%gt+sKLaF616ZdWjYdmiKD(NQr1;itn7hCT*IbQ4m->^n|11 zK#%)$n6=c|kbzHp$KHm|~|AFX*5RhK~w|{-3LC=_#i8_ESB3H>9+B&?Ce$Md4`K*1Dkfz=5@W~8L#ivi zv`U`dXTAbOI#r?->k5(e5(~!FCi*Eo%vT=BE%-&*jzdqTXy<#X>{GeE!#N;q8i@V1 zmRlFP+ILm%F<${t`Xu7=`xEarsS%JhUWF0mbqc%Q;E%A6de_^&|B#S~kGkJ}Qu|U! zGv9H``cCDSTF3m&j6Qycb23cV9wuS`U6Lex&icnT9u}5xYfh#pG-eoTD==(;9X2#D zWGO)`%fRxiImUiOxtJ2*yMLLqfBelCoN1dJ^Rb>SMDN#_p|Rlc<5#?#ALYmZ5R!XE zL-FA4yQtr%w>j+6qpM`E&WXDrR$>BI7CUm3dn6kfU;U%mzv?An(jpiC;)9TCRk&)^ z-{m78KaW+H)SJsqKI3@UDTOGg`tr95vnD6OSj0#}$Ohpt8;#77$UPN$_V|?$@l!U} z4TYt0&#ApoxEylUn(a61hxjuN=e8ZMP;wIwP;3Wbi3iQ=ly7k@zwmX8@pM)$hDaMy zC)eqX3Y=-5Ww)?N%!TnVp^&q}?vdtlu`0~x!heEW@^nGfezyeQH|7jWe3=_^wk^`z zIXN*g523by7qrjO+e*-PdLWC5wCuLK2C|%4JGis|Gd)kd=*#PWXABIsP6ov6!v>`P z9UQE5*YxLuSLO6VZ2I@{bP9F)=_lv^>vI1gkw4!Hn$ZE)pVPae^sQt1uTdBO + + + diff --git a/docs/index.md b/docs/index.md index 286d04d..c562b8c 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,8 @@ -# Welcome to Promptolution +# Welcome to Promptolution! -Promptolution is a library for optimizing prompts for large language models. +Promptolution is a modular library for optimizing prompts for large language models. + +Promptolution makes advanced prompt tuning techniques available to everybody In an intuitive design, it facilitates the application of prompt optimization techniques both for real-world problems and research projects. The library's modular design ensures extensibility, allowing for seamless integration of new prompt optimizers, LLMs, and tasks. By providing a common framework, it helps standardize prompt tuning approaches, facilitating comparison of different methods and results across studies, and enhancing reproducibility in prompt optimization research. ## Features @@ -11,7 +13,15 @@ Promptolution is a library for optimizing prompts for large language models. ## Getting Started -To get started with Promptolution, check out our API reference for detailed information on each module. +Install via pip: + +``` +pip install promptolution +``` + +Or clone our GitHub repository: + +[https://github.com/finitearth/promptolution](https://github.com/finitearth/promptolution) ## API Reference @@ -20,4 +30,4 @@ To get started with Promptolution, check out our API reference for detailed info - [Predictors](api/predictors.md) - [Tasks](api/tasks.md) - [Callbacks](api/callbacks.md) -- [Config](api/config.md) \ No newline at end of file +- [Config](api/config.md) diff --git a/docs/release-notes.md b/docs/release-notes.md new file mode 100644 index 0000000..ba6a637 --- /dev/null +++ b/docs/release-notes.md @@ -0,0 +1,3 @@ +# Release Notes + +coming soon... diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css new file mode 100644 index 0000000..e87da2f --- /dev/null +++ b/docs/stylesheets/extra.css @@ -0,0 +1,3 @@ +:root{ + --md-primary-fg-color: #3087A8; +} diff --git a/mkdocs.yml b/mkdocs.yml index 413a5af..e4b2445 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,12 +1,19 @@ site_name: Promptolution Documentation +site_url: https://finitearth.github.io/promptolution/ +repo_url: https://github.com/finitearth/promptolution +remote_branch: docs + theme: - name: mkdocs + name: material + logo: img/logo.svg features: - navigation.tabs - navigation.sections - toc.integrate + - toc.follow - search.suggest - search.highlight + - search.share - content.tabs.link - content.code.annotation - content.code.copy @@ -14,30 +21,31 @@ theme: palette: - scheme: default toggle: - icon: material/toggle-switch-off-outline + icon: material/toggle-switch-off-outline name: Switch to dark mode - primary: teal - accent: purple - - scheme: slate + primary: custom + accent: purple + - scheme: slate toggle: icon: material/toggle-switch - name: Switch to light mode - primary: teal + name: Switch to light mode + primary: custom accent: lime +extra_css: + - stylesheets/extra.css plugins: - search - mkdocstrings: - default_handler: python handlers: python: - rendering: + options: show_source: true - watch: - - promptolution + show_submodules: true nav: - Home: index.md + - Release Notes: release-notes.md - API Reference: - LLMs: api/llms.md - Optimizers: api/optimizers.md @@ -61,4 +69,4 @@ markdown_extensions: - attr_list copyright: | - © 2024 Tom Zehle, Timo Heiß, Moritz Schlager \ No newline at end of file + by Tom Zehle, Timo Heiß, Moritz Schlager diff --git a/notebooks/evaluation_experiment.ipynb b/notebooks/evaluation_experiment.ipynb index e50752a..0d4f3d2 100644 --- a/notebooks/evaluation_experiment.ipynb +++ b/notebooks/evaluation_experiment.ipynb @@ -28,7 +28,7 @@ "metadata": {}, "outputs": [], "source": [ - "plt.style.use('mpl_stylesheet.mplstyle')" + "plt.style.use(\"mpl_stylesheet.mplstyle\")" ] }, { @@ -54,11 +54,11 @@ "\n", " metainformation = pd.DataFrame(\n", " {\n", - " \"task\": [task_name]*len(result),\n", - " \"optimizer\": [optimizer]*len(result),\n", - " \"meta_llm\": [meta_llm]*len(result),\n", - " \"evaluation_llm\": [evaluation_llm]*len(result),\n", - " \"random_seed\": [random_seed]*len(result),\n", + " \"task\": [task_name] * len(result),\n", + " \"optimizer\": [optimizer] * len(result),\n", + " \"meta_llm\": [meta_llm] * len(result),\n", + " \"evaluation_llm\": [evaluation_llm] * len(result),\n", + " \"random_seed\": [random_seed] * len(result),\n", " }\n", " )\n", "\n", @@ -68,21 +68,32 @@ "\n", " return results\n", "\n", + "\n", "def read_best_scores(target_experiment: str):\n", " return pd.read_csv(f\"../logs/{target_experiment}/best_scores.csv\")\n", "\n", + "\n", "def get_mean_std(df):\n", " group_cols = [\"task\", \"optimizer\", \"meta_llm\", \"downstream_llm\", \"use_task_desc\"]\n", " df_copy = df.groupby(group_cols).agg(\"mean\", numeric_only=True).drop(columns=\"random_seed\")\n", - " df_copy[\"test_score_std\"] = df.groupby(group_cols).agg(\"std\", numeric_only=True).drop(columns=\"random_seed\")[\"test_score\"]\n", + " df_copy[\"test_score_std\"] = (\n", + " df.groupby(group_cols).agg(\"std\", numeric_only=True).drop(columns=\"random_seed\")[\"test_score\"]\n", + " )\n", " df_copy = df_copy.reset_index()\n", "\n", " return df_copy\n", "\n", + "\n", "def get_avg_across_tasks(df):\n", - " df_avg = df.groupby(['optimizer', 'meta_llm', \"downstream_llm\", \"use_task_desc\"]).agg({\n", - " 'test_score': 'mean',\n", - " }).reset_index()\n", + " df_avg = (\n", + " df.groupby([\"optimizer\", \"meta_llm\", \"downstream_llm\", \"use_task_desc\"])\n", + " .agg(\n", + " {\n", + " \"test_score\": \"mean\",\n", + " }\n", + " )\n", + " .reset_index()\n", + " )\n", "\n", " df_avg[\"task\"] = \"Average\"\n", "\n", @@ -90,60 +101,66 @@ "\n", " return df\n", "\n", + "\n", "def clean_names(df):\n", " def map_task_desc(row):\n", " if row is None:\n", " return False\n", " if type(row) is not str:\n", " return False\n", - " return \".txt\" in row\n", - " \n", + " return \".txt\" in row\n", + "\n", " llm_cols = [\"meta_llm\", \"downstream_llm\"]\n", - " df[llm_cols] =\\\n", - " df[llm_cols]\\\n", - " .replace({c: {\n", + " df[llm_cols] = df[llm_cols].replace(\n", + " {\n", + " c: {\n", " \"meta-llama/Meta-Llama-3-70B-Instruct\": \"Llama-3-70B\",\n", " \"meta-llama\\Meta-Llama-3-70B-Instruct\": \"Llama-3-70B\",\n", " \"meta-llama/Meta-Llama-3-8B-Instruct\": \"Llama-3-8B\",\n", " \"meta-llama\\Meta-Llama-3-8B-Instruct\": \"Llama-3-8B\",\n", - " \"gpt-4o-2024-05-13\": \"gpt-4o\"\n", - " } for c in llm_cols})\n", + " \"gpt-4o-2024-05-13\": \"gpt-4o\",\n", + " }\n", + " for c in llm_cols\n", + " }\n", + " )\n", "\n", - " df[\"optimizer\"] = df[\"optimizer\"].map({\n", - " \"evopromptde\": \"DE\",\n", - " \"evopromptga\": \"GA\",\n", - " \"init\": \"init\"\n", - " })\n", + " df[\"optimizer\"] = df[\"optimizer\"].map({\"evopromptde\": \"DE\", \"evopromptga\": \"GA\", \"init\": \"init\"})\n", "\n", " df[\"use_task_desc\"] = df[\"use_task_desc\"].map(map_task_desc)\n", "\n", " return df\n", "\n", + "\n", "def format_score(df):\n", " df = df.copy()\n", + "\n", " def format_score_(row):\n", - " if pd.isna(row['test_score_std']):\n", + " if pd.isna(row[\"test_score_std\"]):\n", " return f\"{row['test_score']:.2f}\"\n", " else:\n", " return f\"{row['test_score']:.2f} Β± {row['test_score_std']:.2f}\"\n", "\n", " # Apply the formatting\n", - " df['test_score'] = df.apply(lambda row: format_score_({\n", - " 'test_score': row['test_score'] * 100,\n", - " 'test_score_std': row['test_score_std'] * 100\n", - " }), axis=1)\n", + " df[\"test_score\"] = df.apply(\n", + " lambda row: format_score_(\n", + " {\"test_score\": row[\"test_score\"] * 100, \"test_score_std\": row[\"test_score_std\"] * 100}\n", + " ),\n", + " axis=1,\n", + " )\n", "\n", " # Drop the test_score_std column as it's no longer needed\n", - " df = df.drop('test_score_std', axis=1)\n", + " df = df.drop(\"test_score_std\", axis=1)\n", "\n", " return df\n", "\n", "\n", "def get_result_table(df):\n", " df = df.copy()\n", - " return df.groupby([\"meta_llm\", \"downstream_llm\", \"optimizer\", \"task\", \"use_task_desc\"], as_index=False)\\\n", - " .first()\\\n", - " .pivot(index=['meta_llm', \"downstream_llm\", 'optimizer', \"use_task_desc\"], columns='task', values='test_score')" + " return (\n", + " df.groupby([\"meta_llm\", \"downstream_llm\", \"optimizer\", \"task\", \"use_task_desc\"], as_index=False)\n", + " .first()\n", + " .pivot(index=[\"meta_llm\", \"downstream_llm\", \"optimizer\", \"use_task_desc\"], columns=\"task\", values=\"test_score\")\n", + " )" ] }, { @@ -153,27 +170,25 @@ "outputs": [], "source": [ "def plot_bar(df_plot, hue=None, title=None):\n", - " df_plot = df_plot.loc[df_plot[\"task\"]!=\"Average\", :].copy()\n", + " df_plot = df_plot.loc[df_plot[\"task\"] != \"Average\", :].copy()\n", " df_plot = df_plot.sort_values(by=[\"task\", \"meta_llm\", \"use_task_desc\"], ascending=[True, False, True])\n", "\n", - " df_plot.loc[:, 'test_score'] = df_plot.loc[:, 'test_score'] * 100\n", - " df_plot.loc[:, 'test_score_std'] = df_plot.loc[:, 'test_score_std'] * 100\n", + " df_plot.loc[:, \"test_score\"] = df_plot.loc[:, \"test_score\"] * 100\n", + " df_plot.loc[:, \"test_score_std\"] = df_plot.loc[:, \"test_score_std\"] * 100\n", "\n", " plt.figure(figsize=(10, 6))\n", - " sns.barplot(x='task', y='test_score', hue=hue, data=df_plot,\n", - " capsize=0.3, errorbar=None, palette=\"Set2\")\n", + " sns.barplot(x=\"task\", y=\"test_score\", hue=hue, data=df_plot, capsize=0.3, errorbar=None, palette=\"Set2\")\n", "\n", - " for i, task in enumerate(df_plot['task'].unique()):\n", - " task_data = df_plot[df_plot['task'] == task]\n", + " for i, task in enumerate(df_plot[\"task\"].unique()):\n", + " task_data = df_plot[df_plot[\"task\"] == task]\n", " for j, (_, row) in enumerate(task_data.iterrows()):\n", " x = i + (j - (len(task_data) - 1) / 2) * (0.8 / len(task_data))\n", - " plt.errorbar(x, row['test_score'], yerr=row['test_score_std'],\n", - " fmt='none', color='black', capsize=3)\n", - " plt.xlabel('Task', fontsize=12)\n", - " plt.ylabel('Test Score (%)', fontsize=12)\n", + " plt.errorbar(x, row[\"test_score\"], yerr=row[\"test_score_std\"], fmt=\"none\", color=\"black\", capsize=3)\n", + " plt.xlabel(\"Task\", fontsize=12)\n", + " plt.ylabel(\"Test Score (%)\", fontsize=12)\n", " plt.ylim(0, 100)\n", "\n", - " plt.xticks(rotation=45, ha='right')\n", + " plt.xticks(rotation=45, ha=\"right\")\n", "\n", " if title is not None:\n", " plt.title(title, fontsize=14)\n", @@ -208,7 +223,11 @@ "outputs": [], "source": [ "best_scores_init = read_best_scores(\"experiment-initial-prompts\")\n", - "best_scores_init = best_scores_init[best_scores_init[\"downstream_llm\"].isin([\"meta-llama/Meta-Llama-3-70B-Instruct\", \"meta-llama/Meta-Llama-3-8B-Instruct\"])]\n", + "best_scores_init = best_scores_init[\n", + " best_scores_init[\"downstream_llm\"].isin(\n", + " [\"meta-llama/Meta-Llama-3-70B-Instruct\", \"meta-llama/Meta-Llama-3-8B-Instruct\"]\n", + " )\n", + "]\n", "best_scores_init[[\"meta_llm\", \"evaluation_llm\", \"use_task_desc\", \"optimizer\"]] = \"init\"\n", "best_scores_init = get_mean_std(best_scores_init)\n", "\n", @@ -242,11 +261,11 @@ } ], "source": [ - "df_plot = best_scores_all[best_scores_all['optimizer'] == 'GA'].copy()\n", - "init_prompts = best_scores_all[best_scores_all[\"optimizer\"]==\"init\"]\n", + "df_plot = best_scores_all[best_scores_all[\"optimizer\"] == \"GA\"].copy()\n", + "init_prompts = best_scores_all[best_scores_all[\"optimizer\"] == \"init\"]\n", "\n", "df_plot = pd.concat([df_plot, init_prompts])\n", - "plot_bar(df_plot, \"meta_llm\", title=\"EvoPrompt GA\")\n" + "plot_bar(df_plot, \"meta_llm\", title=\"EvoPrompt GA\")" ] }, { @@ -255,10 +274,10 @@ "metadata": {}, "outputs": [], "source": [ - "df_plot = best_scores_all[best_scores_all['optimizer'] == 'DE'].copy()\n", - "init_prompts = best_scores_all[(best_scores_all[\"optimizer\"]==\"init\")]\n", + "df_plot = best_scores_all[best_scores_all[\"optimizer\"] == \"DE\"].copy()\n", + "init_prompts = best_scores_all[(best_scores_all[\"optimizer\"] == \"init\")]\n", "\n", - "df_plot = pd.concat([df_plot, init_prompts])\n" + "df_plot = pd.concat([df_plot, init_prompts])" ] }, { @@ -278,7 +297,7 @@ } ], "source": [ - "plot_bar(df_plot, \"meta_llm\", \"EvoPrompt DE\")\n" + "plot_bar(df_plot, \"meta_llm\", \"EvoPrompt DE\")" ] }, { @@ -739,9 +758,9 @@ "source": [ "df_comparison = read_best_scores(\"experiment\")\n", "df_comparison = clean_names(df_comparison)\n", - "df_comparison = df_comparison[df_comparison[\"meta_llm\"]==\"Llama-3-70B\"]\n", - "df_comparison = df_comparison[df_comparison[\"use_task_desc\"]==False]\n", - "df_comparison = df_comparison[df_comparison[\"optimizer\"]==\"DE\"]\n", + "df_comparison = df_comparison[df_comparison[\"meta_llm\"] == \"Llama-3-70B\"]\n", + "df_comparison = df_comparison[df_comparison[\"use_task_desc\"] == False]\n", + "df_comparison = df_comparison[df_comparison[\"optimizer\"] == \"DE\"]\n", "df_comparison = df_comparison[df_comparison[\"task\"].isin(df_experiment.task.unique())]\n", "\n", "df_comparison = get_mean_std(df_comparison)\n", @@ -902,7 +921,7 @@ "source": [ "df_comparison = read_best_scores(\"experiment\")\n", "df_comparison = clean_names(df_comparison)\n", - "df_comparison = df_comparison[df_comparison[\"meta_llm\"]==\"Llama-3-70B\"]\n", + "df_comparison = df_comparison[df_comparison[\"meta_llm\"] == \"Llama-3-70B\"]\n", "\n", "df_comparison = get_mean_std(df_comparison)\n", "df_comparison = get_avg_across_tasks(df_comparison)\n", @@ -1062,7 +1081,7 @@ "source": [ "df_comparison = read_best_scores(\"experiment\")\n", "df_comparison = clean_names(df_comparison)\n", - "df_comparison = df_comparison[df_comparison[\"meta_llm\"]==\"Llama-3-8B\"]\n", + "df_comparison = df_comparison[df_comparison[\"meta_llm\"] == \"Llama-3-8B\"]\n", "\n", "df_comparison = get_mean_std(df_comparison)\n", "df_comparison = get_avg_across_tasks(df_comparison)\n", @@ -1211,9 +1230,9 @@ "source": [ "df_comparison = read_best_scores(\"experiment-initial-prompts\")\n", "df_comparison[[\"meta_llm\", \"optimizer\", \"use_task_desc\", \"evaluation_llm\"]] = \"init\"\n", - "df_comparison=df_comparison.drop(\"prompt\", axis=\"columns\")\n", + "df_comparison = df_comparison.drop(\"prompt\", axis=\"columns\")\n", "df_comparison = clean_names(df_comparison)\n", - "df_comparison = df_comparison[df_comparison[\"downstream_llm\"]==\"gpt-4o\"]\n", + "df_comparison = df_comparison[df_comparison[\"downstream_llm\"] == \"gpt-4o\"]\n", "df_comparison = df_comparison[df_comparison[\"task\"].isin(df_experiment.task.unique())]\n", "df_comparison = get_mean_std(df_comparison)\n", "df_comparison = get_avg_across_tasks(df_comparison)" diff --git a/notebooks/interesting_prompts.ipynb b/notebooks/interesting_prompts.ipynb index a1de27b..646cceb 100644 --- a/notebooks/interesting_prompts.ipynb +++ b/notebooks/interesting_prompts.ipynb @@ -38,11 +38,11 @@ "\n", " metainformation = pd.DataFrame(\n", " {\n", - " \"task\": [task_name]*len(result),\n", - " \"optimizer\": [optimizer]*len(result),\n", - " \"meta_llm\": [meta_llm]*len(result),\n", - " \"evaluation_llm\": [evaluation_llm]*len(result),\n", - " \"random_seed\": [random_seed]*len(result),\n", + " \"task\": [task_name] * len(result),\n", + " \"optimizer\": [optimizer] * len(result),\n", + " \"meta_llm\": [meta_llm] * len(result),\n", + " \"evaluation_llm\": [evaluation_llm] * len(result),\n", + " \"random_seed\": [random_seed] * len(result),\n", " }\n", " )\n", "\n", @@ -52,6 +52,7 @@ "\n", " return results\n", "\n", + "\n", "def read_best_scores(target_experiment: str):\n", " return pd.read_csv(f\"../logs/{target_experiment}/best_scores.csv\")" ] @@ -89,7 +90,7 @@ "metadata": {}, "outputs": [], "source": [ - "df = df[df[\"downstream_llm\"]==r\"meta-llama/Meta-Llama-3-70B-Instruct\"]" + "df = df[df[\"downstream_llm\"] == r\"meta-llama/Meta-Llama-3-70B-Instruct\"]" ] }, { @@ -98,10 +99,10 @@ "metadata": {}, "outputs": [], "source": [ - "df.loc[df[\"meta_llm\"]==r\"meta-llama\\Meta-Llama-3-70B-Instruct\", \"meta_llm\"] = \"Llama70B\"\n", - "df.loc[df[\"meta_llm\"]==r\"meta-llama\\Meta-Llama-3-8B-Instruct\", \"meta_llm\"] = \"Llama8B\"\n", - "df.loc[df[\"optimizer\"]==\"evopromptde\", \"optimizer\"] = \"DE\"\n", - "df.loc[df[\"optimizer\"]==\"evopromptga\", \"optimizer\"] = \"GA\"" + "df.loc[df[\"meta_llm\"] == r\"meta-llama\\Meta-Llama-3-70B-Instruct\", \"meta_llm\"] = \"Llama70B\"\n", + "df.loc[df[\"meta_llm\"] == r\"meta-llama\\Meta-Llama-3-8B-Instruct\", \"meta_llm\"] = \"Llama8B\"\n", + "df.loc[df[\"optimizer\"] == \"evopromptde\", \"optimizer\"] = \"DE\"\n", + "df.loc[df[\"optimizer\"] == \"evopromptga\", \"optimizer\"] = \"GA\"" ] }, { @@ -305,7 +306,7 @@ } ], "source": [ - "pd.set_option('display.max_colwidth', None)\n", + "pd.set_option(\"display.max_colwidth\", None)\n", "df[(df[\"task\"] == \"trec\")].sort_values(\"test_score\")[[\"meta_llm\", \"optimizer\", \"prompt\", \"test_score\"]]" ] }, @@ -530,7 +531,7 @@ } ], "source": [ - "pd.set_option('display.max_colwidth', None)\n", + "pd.set_option(\"display.max_colwidth\", None)\n", "df[(df[\"task\"] == \"subj\")].sort_values(\"test_score\")[[\"meta_llm\", \"optimizer\", \"prompt\", \"test_score\"]]" ] }, @@ -744,7 +745,7 @@ } ], "source": [ - "pd.set_option('display.max_colwidth', None)\n", + "pd.set_option(\"display.max_colwidth\", None)\n", "df[(df[\"task\"] == \"cr\")].sort_values(\"test_score\")[[\"meta_llm\", \"optimizer\", \"prompt\", \"test_score\"]]" ] }, @@ -958,7 +959,7 @@ } ], "source": [ - "pd.set_option('display.max_colwidth', None)\n", + "pd.set_option(\"display.max_colwidth\", None)\n", "df[(df[\"task\"] == \"agnews\")].sort_values(\"test_score\")[[\"meta_llm\", \"optimizer\", \"prompt\", \"test_score\"]]" ] }, @@ -1172,7 +1173,7 @@ } ], "source": [ - "pd.set_option('display.max_colwidth', None)\n", + "pd.set_option(\"display.max_colwidth\", None)\n", "df[(df[\"task\"] == \"mr\")].sort_values(\"test_score\")[[\"meta_llm\", \"optimizer\", \"prompt\", \"test_score\"]]" ] }, @@ -1386,7 +1387,7 @@ } ], "source": [ - "pd.set_option('display.max_colwidth', None)\n", + "pd.set_option(\"display.max_colwidth\", None)\n", "df[(df[\"task\"] == \"sst-5\")].sort_values(\"test_score\")[[\"meta_llm\", \"optimizer\", \"prompt\", \"test_score\"]]" ] }, @@ -1602,7 +1603,7 @@ } ], "source": [ - "pd.set_option('display.max_colwidth', None)\n", + "pd.set_option(\"display.max_colwidth\", None)\n", "df[(df[\"task\"] == \"sst2\")].sort_values(\"test_score\")[[\"meta_llm\", \"optimizer\", \"prompt\", \"test_score\"]]" ] }, @@ -1813,14 +1814,14 @@ "df1 = read_best_scores(\"experiment_eval_task_descr\")\n", "\n", "for task in df1[\"task\"].unique():\n", - " df = df1[df1[\"task\"]==task]\n", + " df = df1[df1[\"task\"] == task]\n", "\n", - " df = df[df[\"downstream_llm\"]==r\"meta-llama/Meta-Llama-3-70B-Instruct\"]\n", + " df = df[df[\"downstream_llm\"] == r\"meta-llama/Meta-Llama-3-70B-Instruct\"]\n", "\n", - " df.loc[df[\"meta_llm\"]==r\"meta-llama\\Meta-Llama-3-70B-Instruct\", \"meta_llm\"] = \"Llama70B\"\n", - " df.loc[df[\"meta_llm\"]==r\"meta-llama\\Meta-Llama-3-8B-Instruct\", \"meta_llm\"] = \"Llama8B\"\n", - " df.loc[df[\"optimizer\"]==\"evopromptde\", \"optimizer\"] = \"DE\"\n", - " df.loc[df[\"optimizer\"]==\"evopromptga\", \"optimizer\"] = \"GA\"\n", + " df.loc[df[\"meta_llm\"] == r\"meta-llama\\Meta-Llama-3-70B-Instruct\", \"meta_llm\"] = \"Llama70B\"\n", + " df.loc[df[\"meta_llm\"] == r\"meta-llama\\Meta-Llama-3-8B-Instruct\", \"meta_llm\"] = \"Llama8B\"\n", + " df.loc[df[\"optimizer\"] == \"evopromptde\", \"optimizer\"] = \"DE\"\n", + " df.loc[df[\"optimizer\"] == \"evopromptga\", \"optimizer\"] = \"GA\"\n", "\n", " print(df.sort_values(\"test_score\")[[\"meta_llm\", \"optimizer\", \"prompt\", \"test_score\"]])" ] diff --git a/notebooks/optimization_progress.ipynb b/notebooks/optimization_progress.ipynb index 2f9040d..0656845 100644 --- a/notebooks/optimization_progress.ipynb +++ b/notebooks/optimization_progress.ipynb @@ -196,7 +196,6 @@ "plt.figure(figsize=(15, 25))\n", "\n", "for i, task in enumerate([\"agnews\", \"cr\", \"mr\", \"sst2\", \"sst-5\", \"subj\", \"trec\"]):\n", - "\n", " for j, optimizer in enumerate([\"evopromptde\", \"evopromptga\"]):\n", " plt.subplot(7, 2, 2 * i + j + 1)\n", "\n", diff --git a/notebooks/test_train_score_correlation.ipynb b/notebooks/test_train_score_correlation.ipynb index ea8908d..0b8e1c5 100644 --- a/notebooks/test_train_score_correlation.ipynb +++ b/notebooks/test_train_score_correlation.ipynb @@ -38,11 +38,11 @@ "\n", " metainformation = pd.DataFrame(\n", " {\n", - " \"task\": [task_name]*len(result),\n", - " \"optimizer\": [optimizer]*len(result),\n", - " \"meta_llm\": [meta_llm]*len(result),\n", - " \"evaluation_llm\": [evaluation_llm]*len(result),\n", - " \"random_seed\": [random_seed]*len(result),\n", + " \"task\": [task_name] * len(result),\n", + " \"optimizer\": [optimizer] * len(result),\n", + " \"meta_llm\": [meta_llm] * len(result),\n", + " \"evaluation_llm\": [evaluation_llm] * len(result),\n", + " \"random_seed\": [random_seed] * len(result),\n", " }\n", " )\n", "\n", @@ -147,22 +147,19 @@ } ], "source": [ - "evaluation_llm = meta_llm = \"meta-llama/Meta-Llama-3-70B-Instruct\"\n", + "evaluation_llm = meta_llm = \"meta-llama/Meta-Llama-3-70B-Instruct\"\n", "\n", "group_cols = [\"task\", \"optimizer\", \"meta_llm\", \"evaluation_llm\", \"random_seed\"]\n", "\n", - "df1 = df_train[\n", - " (df_train[\"meta_llm\"] == meta_llm)\n", - " & (df_train[\"evaluation_llm\"] == evaluation_llm)\n", - "]\n", + "df1 = df_train[(df_train[\"meta_llm\"] == meta_llm) & (df_train[\"evaluation_llm\"] == evaluation_llm)]\n", "\n", "# find prompt which got the best score first, per seed\n", - "df1 = df1.sort_values(\"score\", ascending=False)#\n", + "df1 = df1.sort_values(\"score\", ascending=False) #\n", "df1 = df1.groupby(group_cols).first()\n", "\n", "df2 = df_test[\n", - "# (df_test[\"task\"] == task)\n", - " (df_test[\"meta_llm\"] == meta_llm)\n", + " # (df_test[\"task\"] == task)\n", + " (df_test[\"meta_llm\"] == meta_llm)\n", " & (df_test[\"evaluation_llm\"] == evaluation_llm)\n", "]\n", "\n", @@ -172,8 +169,8 @@ "df1.loc[:, \"test_score\"] = df2.loc[df1.index, [\"test_score\"]]\n", "\n", "sns.scatterplot(data=df1, x=\"score\", y=\"test_score\", hue=\"task\")\n", - "#trendline black with dashed\n", - "sns.regplot(data=df1, x=\"score\", y=\"test_score\", scatter=False, color=\"black\", line_kws={\"linestyle\":\"dashed\"})\n", + "# trendline black with dashed\n", + "sns.regplot(data=df1, x=\"score\", y=\"test_score\", scatter=False, color=\"black\", line_kws={\"linestyle\": \"dashed\"})\n", "plt.show()\n", "\n", "df1.corr()" @@ -246,22 +243,19 @@ } ], "source": [ - "evaluation_llm = meta_llm = \"meta-llama/Meta-Llama-3-8B-Instruct\"\n", + "evaluation_llm = meta_llm = \"meta-llama/Meta-Llama-3-8B-Instruct\"\n", "\n", "group_cols = [\"task\", \"optimizer\", \"meta_llm\", \"evaluation_llm\", \"random_seed\"]\n", "\n", - "df1 = df_train[\n", - " (df_train[\"meta_llm\"] == meta_llm)\n", - " & (df_train[\"evaluation_llm\"] == evaluation_llm)\n", - "]\n", + "df1 = df_train[(df_train[\"meta_llm\"] == meta_llm) & (df_train[\"evaluation_llm\"] == evaluation_llm)]\n", "\n", "# find prompt which got the best score first, per seed\n", - "df1 = df1.sort_values(\"score\", ascending=False)#\n", + "df1 = df1.sort_values(\"score\", ascending=False) #\n", "df1 = df1.groupby(group_cols).first()\n", "\n", "df2 = df_test[\n", - "# (df_test[\"task\"] == task)\n", - " (df_test[\"meta_llm\"] == meta_llm)\n", + " # (df_test[\"task\"] == task)\n", + " (df_test[\"meta_llm\"] == meta_llm)\n", " & (df_test[\"evaluation_llm\"] == evaluation_llm)\n", "]\n", "\n", @@ -271,12 +265,11 @@ "df1.loc[:, \"test_score\"] = df2.loc[df1.index, [\"test_score\"]]\n", "\n", "sns.scatterplot(data=df1, x=\"score\", y=\"test_score\", hue=\"task\")\n", - "#trendline black with dashed\n", - "sns.regplot(data=df1, x=\"score\", y=\"test_score\", scatter=False, color=\"black\", line_kws={\"linestyle\":\"dashed\"})\n", + "# trendline black with dashed\n", + "sns.regplot(data=df1, x=\"score\", y=\"test_score\", scatter=False, color=\"black\", line_kws={\"linestyle\": \"dashed\"})\n", "plt.show()\n", "\n", - "df1.corr()\n", - "\n" + "df1.corr()" ] }, { @@ -290,7 +283,7 @@ "df1 = df_train\n", "\n", "# find prompt which got the best score first, per seed\n", - "df1 = df1.sort_values(\"score\", ascending=False)#\n", + "df1 = df1.sort_values(\"score\", ascending=False) #\n", "df1 = df1.groupby(group_cols).first()\n", "\n", "df2 = df_test\n", @@ -308,12 +301,12 @@ "metadata": {}, "outputs": [], "source": [ - "df1.loc[df1[\"meta_llm\"]==\"meta-llama/Meta-Llama-3-70B-Instruct\", \"meta_llm\"] = \"Llama-70B\"\n", - "df1.loc[df1[\"evaluation_llm\"]==\"meta-llama/Meta-Llama-3-70B-Instruct\", \"evaluation_llm\"] = \"Llama-70B\"\n", - "df1.loc[df1[\"meta_llm\"]==\"meta-llama/Meta-Llama-3-8B-Instruct\", \"meta_llm\"] = \"Llama-8B\"\n", - "df1.loc[df1[\"evaluation_llm\"]==\"meta-llama/Meta-Llama-3-8B-Instruct\", \"evaluation_llm\"] = \"Llama-8B\"\n", - "df1.loc[df1[\"optimizer\"]==\"evopromptde\", \"optimizer\"] = \"DE\"\n", - "df1.loc[df1[\"optimizer\"]==\"evopromptga\", \"optimizer\"] = \"GA\"" + "df1.loc[df1[\"meta_llm\"] == \"meta-llama/Meta-Llama-3-70B-Instruct\", \"meta_llm\"] = \"Llama-70B\"\n", + "df1.loc[df1[\"evaluation_llm\"] == \"meta-llama/Meta-Llama-3-70B-Instruct\", \"evaluation_llm\"] = \"Llama-70B\"\n", + "df1.loc[df1[\"meta_llm\"] == \"meta-llama/Meta-Llama-3-8B-Instruct\", \"meta_llm\"] = \"Llama-8B\"\n", + "df1.loc[df1[\"evaluation_llm\"] == \"meta-llama/Meta-Llama-3-8B-Instruct\", \"evaluation_llm\"] = \"Llama-8B\"\n", + "df1.loc[df1[\"optimizer\"] == \"evopromptde\", \"optimizer\"] = \"DE\"\n", + "df1.loc[df1[\"optimizer\"] == \"evopromptga\", \"optimizer\"] = \"GA\"" ] }, { @@ -342,7 +335,13 @@ "metadata": {}, "outputs": [], "source": [ - "diff_df = df1.groupby([\"task\", \"optimizer\", \"meta_llm\", \"evaluation_llm\"]).mean().reset_index().drop([\"random_seed\", \"evaluation_llm\"], axis=1).round(2)" + "diff_df = (\n", + " df1.groupby([\"task\", \"optimizer\", \"meta_llm\", \"evaluation_llm\"])\n", + " .mean()\n", + " .reset_index()\n", + " .drop([\"random_seed\", \"evaluation_llm\"], axis=1)\n", + " .round(2)\n", + ")" ] }, { diff --git a/poetry.lock b/poetry.lock index 439d09d..efe5954 100644 --- a/poetry.lock +++ b/poetry.lock @@ -240,6 +240,20 @@ docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphi tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] +[[package]] +name = "babel" +version = "2.16.0" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.8" +files = [ + {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, + {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, +] + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + [[package]] name = "black" version = "24.8.0" @@ -957,6 +971,23 @@ test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe, test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] tqdm = ["tqdm"] +[[package]] +name = "ghp-import" +version = "2.1.0" +description = "Copy your docs directly to the gh-pages branch." +optional = false +python-versions = "*" +files = [ + {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, + {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, +] + +[package.dependencies] +python-dateutil = ">=2.8.1" + +[package.extras] +dev = ["flake8", "markdown", "twine", "wheel"] + [[package]] name = "greenlet" version = "3.0.3" @@ -1028,6 +1059,20 @@ files = [ docs = ["Sphinx", "furo"] test = ["objgraph", "psutil"] +[[package]] +name = "griffe" +version = "1.3.2" +description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." +optional = false +python-versions = ">=3.8" +files = [ + {file = "griffe-1.3.2-py3-none-any.whl", hash = "sha256:2e34b5e46507d615915c8e6288bb1a2234bd35dee44d01e40a2bc2f25bd4d10c"}, + {file = "griffe-1.3.2.tar.gz", hash = "sha256:1ec50335aa507ed2445f2dd45a15c9fa3a45f52c9527e880571dfc61912fd60c"}, +] + +[package.dependencies] +colorama = ">=0.4" + [[package]] name = "h11" version = "0.14.0" @@ -1244,6 +1289,23 @@ docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alab qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +[[package]] +name = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + [[package]] name = "jiter" version = "0.5.0" @@ -1520,7 +1582,10 @@ aiohttp = ">=3.8.3,<4.0.0" langchain-core = ">=0.2.32,<0.3.0" langchain-text-splitters = ">=0.2.0,<0.3.0" langsmith = ">=0.1.17,<0.2.0" -numpy = {version = ">=1,<2", markers = "python_version < \"3.12\""} +numpy = [ + {version = ">=1,<2", markers = "python_version < \"3.12\""}, + {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, +] pydantic = ">=1,<3" PyYAML = ">=5.3" requests = ">=2,<3" @@ -1560,7 +1625,10 @@ dataclasses-json = ">=0.5.7,<0.7" langchain = ">=0.2.13,<0.3.0" langchain-core = ">=0.2.30,<0.3.0" langsmith = ">=0.1.0,<0.2.0" -numpy = {version = ">=1,<2", markers = "python_version < \"3.12\""} +numpy = [ + {version = ">=1,<2", markers = "python_version < \"3.12\""}, + {version = ">=1.26.0,<2.0.0", markers = "python_version >= \"3.12\""}, +] PyYAML = ">=5.3" requests = ">=2,<3" SQLAlchemy = ">=1.4,<3" @@ -1581,7 +1649,10 @@ files = [ jsonpatch = ">=1.33,<2.0" langsmith = ">=0.1.75,<0.2.0" packaging = ">=23.2,<25" -pydantic = {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""} +pydantic = [ + {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, + {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, +] PyYAML = ">=5.3" tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" typing-extensions = ">=4.7" @@ -1629,9 +1700,96 @@ files = [ [package.dependencies] orjson = ">=3.9.14,<4.0.0" -pydantic = {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""} +pydantic = [ + {version = ">=1,<3", markers = "python_full_version < \"3.12.4\""}, + {version = ">=2.7.4,<3.0.0", markers = "python_full_version >= \"3.12.4\""}, +] requests = ">=2,<3" +[[package]] +name = "markdown" +version = "3.7" +description = "Python implementation of John Gruber's Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Markdown-3.7-py3-none-any.whl", hash = "sha256:7eb6df5690b81a1d7942992c97fad2938e956e79df20cbc6186e9c3a77b1c803"}, + {file = "markdown-3.7.tar.gz", hash = "sha256:2ae2471477cfd02dbbf038d5d9bc226d40def84b4fe2986e49b59b6b472bbed2"}, +] + +[package.extras] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + [[package]] name = "marshmallow" version = "3.21.3" @@ -1739,6 +1897,162 @@ files = [ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] +[[package]] +name = "mergedeep" +version = "1.3.4" +description = "A deep merge function for 🐍." +optional = false +python-versions = ">=3.6" +files = [ + {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, + {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, +] + +[[package]] +name = "mkdocs" +version = "1.6.1" +description = "Project documentation with Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"}, + {file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} +ghp-import = ">=1.0" +jinja2 = ">=2.11.1" +markdown = ">=3.3.6" +markupsafe = ">=2.0.1" +mergedeep = ">=1.3.4" +mkdocs-get-deps = ">=0.2.0" +packaging = ">=20.5" +pathspec = ">=0.11.1" +pyyaml = ">=5.1" +pyyaml-env-tag = ">=0.1" +watchdog = ">=2.0" + +[package.extras] +i18n = ["babel (>=2.9.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.4)", "jinja2 (==2.11.1)", "markdown (==3.3.6)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "mkdocs-get-deps (==0.2.0)", "packaging (==20.5)", "pathspec (==0.11.1)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "watchdog (==2.0)"] + +[[package]] +name = "mkdocs-autorefs" +version = "1.2.0" +description = "Automatically link across pages in MkDocs." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_autorefs-1.2.0-py3-none-any.whl", hash = "sha256:d588754ae89bd0ced0c70c06f58566a4ee43471eeeee5202427da7de9ef85a2f"}, + {file = "mkdocs_autorefs-1.2.0.tar.gz", hash = "sha256:a86b93abff653521bda71cf3fc5596342b7a23982093915cb74273f67522190f"}, +] + +[package.dependencies] +Markdown = ">=3.3" +markupsafe = ">=2.0.1" +mkdocs = ">=1.1" + +[[package]] +name = "mkdocs-get-deps" +version = "0.2.0" +description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"}, + {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"}, +] + +[package.dependencies] +mergedeep = ">=1.3.4" +platformdirs = ">=2.2.0" +pyyaml = ">=5.1" + +[[package]] +name = "mkdocs-material" +version = "9.5.39" +description = "Documentation that simply works" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_material-9.5.39-py3-none-any.whl", hash = "sha256:0f2f68c8db89523cb4a59705cd01b4acd62b2f71218ccb67e1e004e560410d2b"}, + {file = "mkdocs_material-9.5.39.tar.gz", hash = "sha256:25faa06142afa38549d2b781d475a86fb61de93189f532b88e69bf11e5e5c3be"}, +] + +[package.dependencies] +babel = ">=2.10,<3.0" +colorama = ">=0.4,<1.0" +jinja2 = ">=3.0,<4.0" +markdown = ">=3.2,<4.0" +mkdocs = ">=1.6,<2.0" +mkdocs-material-extensions = ">=1.3,<2.0" +paginate = ">=0.5,<1.0" +pygments = ">=2.16,<3.0" +pymdown-extensions = ">=10.2,<11.0" +regex = ">=2022.4" +requests = ">=2.26,<3.0" + +[package.extras] +git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2.4,<2.0)"] +imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=10.2,<11.0)"] +recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"] + +[[package]] +name = "mkdocs-material-extensions" +version = "1.3.1" +description = "Extension pack for Python Markdown and MkDocs Material." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, + {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, +] + +[[package]] +name = "mkdocstrings" +version = "0.26.1" +description = "Automatic documentation from sources, for MkDocs." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocstrings-0.26.1-py3-none-any.whl", hash = "sha256:29738bfb72b4608e8e55cc50fb8a54f325dc7ebd2014e4e3881a49892d5983cf"}, + {file = "mkdocstrings-0.26.1.tar.gz", hash = "sha256:bb8b8854d6713d5348ad05b069a09f3b79edbc6a0f33a34c6821141adb03fe33"}, +] + +[package.dependencies] +click = ">=7.0" +Jinja2 = ">=2.11.1" +Markdown = ">=3.6" +MarkupSafe = ">=1.1" +mkdocs = ">=1.4" +mkdocs-autorefs = ">=1.2" +mkdocstrings-python = {version = ">=0.5.2", optional = true, markers = "extra == \"python\""} +platformdirs = ">=2.2" +pymdown-extensions = ">=6.3" + +[package.extras] +crystal = ["mkdocstrings-crystal (>=0.3.4)"] +python = ["mkdocstrings-python (>=0.5.2)"] +python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] + +[[package]] +name = "mkdocstrings-python" +version = "1.11.1" +description = "A Python handler for mkdocstrings." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocstrings_python-1.11.1-py3-none-any.whl", hash = "sha256:a21a1c05acef129a618517bb5aae3e33114f569b11588b1e7af3e9d4061a71af"}, + {file = "mkdocstrings_python-1.11.1.tar.gz", hash = "sha256:8824b115c5359304ab0b5378a91f6202324a849e1da907a3485b59208b797322"}, +] + +[package.dependencies] +griffe = ">=0.49" +mkdocs-autorefs = ">=1.2" +mkdocstrings = ">=0.26" + [[package]] name = "multidict" version = "6.0.5" @@ -2017,6 +2331,21 @@ files = [ {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, ] +[[package]] +name = "paginate" +version = "0.5.7" +description = "Divides large result sets into pages for easier browsing" +optional = false +python-versions = "*" +files = [ + {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"}, + {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"}, +] + +[package.extras] +dev = ["pytest", "tox"] +lint = ["black"] + [[package]] name = "pandas" version = "2.2.2" @@ -2056,7 +2385,10 @@ files = [ ] [package.dependencies] -numpy = {version = ">=1.23.2", markers = "python_version == \"3.11\""} +numpy = [ + {version = ">=1.23.2", markers = "python_version == \"3.11\""}, + {version = ">=1.26.0", markers = "python_version >= \"3.12\""}, +] python-dateutil = ">=2.8.2" pytz = ">=2020.1" tzdata = ">=2022.7" @@ -2361,7 +2693,10 @@ files = [ [package.dependencies] annotated-types = ">=0.4.0" pydantic-core = "2.20.1" -typing-extensions = {version = ">=4.6.1", markers = "python_version < \"3.13\""} +typing-extensions = [ + {version = ">=4.6.1", markers = "python_version < \"3.13\""}, + {version = ">=4.12.2", markers = "python_version >= \"3.13\""}, +] [package.extras] email = ["email-validator (>=2.0.0)"] @@ -2492,6 +2827,24 @@ files = [ [package.extras] windows-terminal = ["colorama (>=0.4.6)"] +[[package]] +name = "pymdown-extensions" +version = "10.11.2" +description = "Extension pack for Python Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pymdown_extensions-10.11.2-py3-none-any.whl", hash = "sha256:41cdde0a77290e480cf53892f5c5e50921a7ee3e5cd60ba91bf19837b33badcf"}, + {file = "pymdown_extensions-10.11.2.tar.gz", hash = "sha256:bc8847ecc9e784a098efd35e20cba772bc5a1b529dfcef9dc1972db9021a1049"}, +] + +[package.dependencies] +markdown = ">=3.6" +pyyaml = "*" + +[package.extras] +extra = ["pygments (>=2.12)"] + [[package]] name = "pyparsing" version = "3.1.4" @@ -2616,6 +2969,20 @@ files = [ {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] +[[package]] +name = "pyyaml-env-tag" +version = "0.1" +description = "A custom YAML tag for referencing environment variables in YAML files. " +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, + {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, +] + +[package.dependencies] +pyyaml = "*" + [[package]] name = "pyzmq" version = "26.1.1" @@ -3508,6 +3875,48 @@ platformdirs = ">=3.9.1,<5" docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] +[[package]] +name = "watchdog" +version = "5.0.3" +description = "Filesystem events monitoring" +optional = false +python-versions = ">=3.9" +files = [ + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:85527b882f3facda0579bce9d743ff7f10c3e1e0db0a0d0e28170a7d0e5ce2ea"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:53adf73dcdc0ef04f7735066b4a57a4cd3e49ef135daae41d77395f0b5b692cb"}, + {file = "watchdog-5.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e25adddab85f674acac303cf1f5835951345a56c5f7f582987d266679979c75b"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f01f4a3565a387080dc49bdd1fefe4ecc77f894991b88ef927edbfa45eb10818"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:91b522adc25614cdeaf91f7897800b82c13b4b8ac68a42ca959f992f6990c490"}, + {file = "watchdog-5.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d52db5beb5e476e6853da2e2d24dbbbed6797b449c8bf7ea118a4ee0d2c9040e"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:94d11b07c64f63f49876e0ab8042ae034674c8653bfcdaa8c4b32e71cfff87e8"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:349c9488e1d85d0a58e8cb14222d2c51cbc801ce11ac3936ab4c3af986536926"}, + {file = "watchdog-5.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:53a3f10b62c2d569e260f96e8d966463dec1a50fa4f1b22aec69e3f91025060e"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:950f531ec6e03696a2414b6308f5c6ff9dab7821a768c9d5788b1314e9a46ca7"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ae6deb336cba5d71476caa029ceb6e88047fc1dc74b62b7c4012639c0b563906"}, + {file = "watchdog-5.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1021223c08ba8d2d38d71ec1704496471ffd7be42cfb26b87cd5059323a389a1"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:752fb40efc7cc8d88ebc332b8f4bcbe2b5cc7e881bccfeb8e25054c00c994ee3"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a2e8f3f955d68471fa37b0e3add18500790d129cc7efe89971b8a4cc6fdeb0b2"}, + {file = "watchdog-5.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b8ca4d854adcf480bdfd80f46fdd6fb49f91dd020ae11c89b3a79e19454ec627"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:90a67d7857adb1d985aca232cc9905dd5bc4803ed85cfcdcfcf707e52049eda7"}, + {file = "watchdog-5.0.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:720ef9d3a4f9ca575a780af283c8fd3a0674b307651c1976714745090da5a9e8"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:223160bb359281bb8e31c8f1068bf71a6b16a8ad3d9524ca6f523ac666bb6a1e"}, + {file = "watchdog-5.0.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:560135542c91eaa74247a2e8430cf83c4342b29e8ad4f520ae14f0c8a19cfb5b"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:dd021efa85970bd4824acacbb922066159d0f9e546389a4743d56919b6758b91"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_armv7l.whl", hash = "sha256:78864cc8f23dbee55be34cc1494632a7ba30263951b5b2e8fc8286b95845f82c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_i686.whl", hash = "sha256:1e9679245e3ea6498494b3028b90c7b25dbb2abe65c7d07423ecfc2d6218ff7c"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64.whl", hash = "sha256:9413384f26b5d050b6978e6fcd0c1e7f0539be7a4f1a885061473c5deaa57221"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:294b7a598974b8e2c6123d19ef15de9abcd282b0fbbdbc4d23dfa812959a9e05"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_s390x.whl", hash = "sha256:26dd201857d702bdf9d78c273cafcab5871dd29343748524695cecffa44a8d97"}, + {file = "watchdog-5.0.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:0f9332243355643d567697c3e3fa07330a1d1abf981611654a1f2bf2175612b7"}, + {file = "watchdog-5.0.3-py3-none-win32.whl", hash = "sha256:c66f80ee5b602a9c7ab66e3c9f36026590a0902db3aea414d59a2f55188c1f49"}, + {file = "watchdog-5.0.3-py3-none-win_amd64.whl", hash = "sha256:f00b4cf737f568be9665563347a910f8bdc76f88c2970121c86243c8cfdf90e9"}, + {file = "watchdog-5.0.3-py3-none-win_ia64.whl", hash = "sha256:49f4d36cb315c25ea0d946e018c01bb028048023b9e103d3d3943f58e109dd45"}, + {file = "watchdog-5.0.3.tar.gz", hash = "sha256:108f42a7f0345042a854d4d0ad0834b741d421330d5f575b81cb27b883500176"}, +] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + [[package]] name = "wcwidth" version = "0.2.13" @@ -3624,5 +4033,5 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" -python-versions = "~3.11" -content-hash = "604f00d838e479aa10111ffc0a32da6da26ef02ca0c739a7e6de1c22f9322b18" +python-versions = "^3.11" +content-hash = "7f2a00d58b72f3b7cec0991808ffc354c5f10f87e1c78bd9ed4d5369932d243d" diff --git a/promptolution/__init__.py b/promptolution/__init__.py index 8aa28e5..3efcb5a 100644 --- a/promptolution/__init__.py +++ b/promptolution/__init__.py @@ -1,6 +1,3 @@ -from . import llms -from . import optimizers -from . import predictors -from . import tasks -from . import callbacks -from . import config \ No newline at end of file +"""Promptolution: A library for prompt tuning.""" + +from . import callbacks, config, llms, optimizers, predictors, tasks diff --git a/promptolution/callbacks.py b/promptolution/callbacks.py index df563a8..82aa7b4 100644 --- a/promptolution/callbacks.py +++ b/promptolution/callbacks.py @@ -1,3 +1,5 @@ +"""Callback classes for logging, saving, and tracking optimization progress.""" + import os import pandas as pd @@ -5,19 +7,31 @@ class Callback: + """Base class for optimization callbacks.""" + def on_step_end(self, optimizer): + """Called at the end of each optimization step. + + Args: + optimizer: The optimizer object that called the callback. + """ pass - def on_epoch_end(self, epoch, logs=None): + def on_epoch_end(self, epoch): + """Called at the end of each optimization epoch. + + Args: + epoch: The current epoch number. + """ pass - def on_train_end(self, logs=None): + def on_train_end(self): + """Called at the end of the entire optimization process.""" pass class LoggerCallback(Callback): - """ - Callback for logging optimization progress. + """Callback for logging optimization progress. This callback logs information about each step, epoch, and the end of training. @@ -25,11 +39,14 @@ class LoggerCallback(Callback): logger: The logger object to use for logging. step (int): The current step number. """ + def __init__(self, logger): + """Initialize the LoggerCallback.""" self.logger = logger self.step = 0 def on_step_end(self, optimizer): + """Log information about the current step.""" self.step += 1 self.logger.critical(f"✨Step {self.step} ended✨") for i, (prompt, score) in enumerate(zip(optimizer.prompts, optimizer.scores)): @@ -37,15 +54,25 @@ def on_step_end(self, optimizer): self.logger.critical(f"{prompt}") def on_epoch_end(self, epoch, logs=None): + """Log information about the current epoch. + + Args: + epoch: The current epoch number. + logs: Additional information to log. + """ self.logger.critical(f"Epoch {epoch} - {logs}") def on_train_end(self, logs=None): + """Log information at the end of training. + + Args: + logs: Additional information to log. + """ self.logger.critical(f"Training ended - {logs}") class CSVCallback(Callback): - """ - Callback for saving optimization progress to a CSV file. + """Callback for saving optimization progress to a CSV file. This callback saves prompts and scores at each step to a CSV file. @@ -53,7 +80,13 @@ class CSVCallback(Callback): path (str): The path to the CSV file. step (int): The current step number. """ + def __init__(self, path): + """Initialize the CSVCallback. + + Args: + path (str): The path to the CSV file. + """ # if dir does not exist if not os.path.exists(os.path.dirname(path)): os.makedirs(os.path.dirname(path)) @@ -65,8 +98,10 @@ def __init__(self, path): self.step = 0 def on_step_end(self, optimizer): - """ - Save prompts and scores to csv + """Save prompts and scores to csv. + + Args: + optimizer: The optimizer object that called the callback """ self.step += 1 df = pd.DataFrame( @@ -74,13 +109,13 @@ def on_step_end(self, optimizer): ) df.to_csv(self.path, mode="a", header=False, index=False) - def on_train_end(self, logs=None): + def on_train_end(self): + """Called at the end of training.""" pass class BestPromptCallback(Callback): - """ - Callback for tracking the best prompt during optimization. + """Callback for tracking the best prompt during optimization. This callback keeps track of the prompt with the highest score. @@ -88,33 +123,56 @@ class BestPromptCallback(Callback): best_prompt (str): The prompt with the highest score so far. best_score (float): The highest score achieved so far. """ + def __init__(self): + """Initialize the BestPromptCallback.""" self.best_prompt = "" self.best_score = -99999 def on_step_end(self, optimizer): + """Update the best prompt and score if a new high score is achieved. + + Args: + optimizer: The optimizer object that called the callback. + """ if optimizer.scores[0] > self.best_score: self.best_score = optimizer.scores[0] self.best_prompt = optimizer.prompts[0] def get_best_prompt(self): + """Get the best prompt and score achieved during optimization. + + Returns: + Tuple[str, float]: The best prompt and score. + """ return self.best_prompt, self.best_score class ProgressBarCallback(Callback): - """ - Callback for displaying a progress bar during optimization. + """Callback for displaying a progress bar during optimization. This callback uses tqdm to display a progress bar that updates at each step. Attributes: pbar (tqdm): The tqdm progress bar object. """ + def __init__(self, total_steps): + """Initialize the ProgressBarCallback. + + Args: + total_steps (int): The total number of steps in the optimization process. + """ self.pbar = tqdm(total=total_steps) def on_step_end(self, optimizer): + """Update the progress bar at the end of each step. + + Args: + optimizer: The optimizer object that called the callback. + """ self.pbar.update(1) - def on_train_end(self, logs=None): + def on_train_end(self): + """Close the progress bar at the end of training.""" self.pbar.close() diff --git a/promptolution/config.py b/promptolution/config.py index 7fca82f..5bba4df 100644 --- a/promptolution/config.py +++ b/promptolution/config.py @@ -1,11 +1,12 @@ +"""Configuration class for the promptolution library.""" + from configparser import ConfigParser from dataclasses import dataclass @dataclass class Config: - """ - Configuration class for the promptolution library. + """Configuration class for the promptolution library. This class handles loading and parsing of configuration settings, either from a config file or from keyword arguments. @@ -25,6 +26,7 @@ class Config: include_task_desc (bool): Whether to include task description. Defaults to False. random_seed (int): Random seed for reproducibility. Defaults to 42. """ + task_name: str ds_path: str n_steps: int @@ -40,6 +42,7 @@ class Config: random_seed: int = 42 def __init__(self, config_path: str = None, **kwargs): + """Initialize the Config object.""" if config_path: self.config_path = config_path self.config = ConfigParser() @@ -50,6 +53,7 @@ def __init__(self, config_path: str = None, **kwargs): setattr(self, key, value) def _parse_config(self): + """Parse the configuration settings from the config file.""" self.task_name = self.config["task"]["task_name"] self.ds_path = self.config["task"]["ds_path"] self.n_steps = int(self.config["task"]["steps"]) diff --git a/promptolution/llms/__init__.py b/promptolution/llms/__init__.py index f8680f8..e4ca64e 100644 --- a/promptolution/llms/__init__.py +++ b/promptolution/llms/__init__.py @@ -1,11 +1,12 @@ +"""Module for Large Language Models.""" + from .api_llm import APILLM from .base_llm import DummyLLM from .local_llm import LocalLLM def get_llm(model_id: str, *args, **kwargs): - """ - Factory function to create and return a language model instance based on the provided model_id. + """Factory function to create and return a language model instance based on the provided model_id. This function supports three types of language models: 1. DummyLLM: A mock LLM for testing purposes. diff --git a/promptolution/llms/api_llm.py b/promptolution/llms/api_llm.py index d160468..a3dcdc7 100644 --- a/promptolution/llms/api_llm.py +++ b/promptolution/llms/api_llm.py @@ -1,11 +1,12 @@ +"""Module to interface with various language models through their respective APIs.""" + import asyncio -import requests import time -import openai from logging import INFO, Logger - from typing import List +import openai +import requests from langchain_anthropic import ChatAnthropic from langchain_community.chat_models.deepinfra import ChatDeepInfraException from langchain_core.messages import HumanMessage @@ -13,14 +14,12 @@ from promptolution.llms.deepinfra import ChatDeepInfra - logger = Logger(__name__) logger.setLevel(INFO) async def invoke_model(prompt, model, semaphore): - """ - Asynchronously invoke a language model with retry logic. + """Asynchronously invoke a language model with retry logic. Args: prompt (str): The input prompt for the model. @@ -49,8 +48,7 @@ async def invoke_model(prompt, model, semaphore): class APILLM: - """ - A class to interface with various language models through their respective APIs. + """A class to interface with various language models through their respective APIs. This class supports Claude (Anthropic), GPT (OpenAI), and LLaMA (DeepInfra) models. It handles API key management, model initialization, and provides methods for @@ -63,9 +61,9 @@ class APILLM: get_response: Synchronously get responses for a list of prompts. _get_response: Asynchronously get responses for a list of prompts. """ + def __init__(self, model_id: str): - """ - Initialize the APILLM with a specific model. + """Initialize the APILLM with a specific model. Args: model_id (str): Identifier for the model to use. @@ -86,8 +84,7 @@ def __init__(self, model_id: str): raise ValueError(f"Unknown model: {model_id}") def get_response(self, prompts: List[str]) -> List[str]: - """ - Synchronously get responses for a list of prompts. + """Get responses for a list of prompts in a synchronous manner. This method includes retry logic for handling connection errors and rate limits. @@ -124,11 +121,8 @@ def get_response(self, prompts: List[str]) -> List[str]: # If the loop exits, it means max retries were reached raise requests.exceptions.ConnectionError("Max retries exceeded. Connection could not be established.") - async def _get_response( - self, prompts: list[str], max_concurrent_calls=200 - ) -> list[str]: - """ - Asynchronously get responses for a list of prompts. + async def _get_response(self, prompts: list[str], max_concurrent_calls=200) -> list[str]: + """Asynchronously get responses for a list of prompts. This method uses a semaphore to limit the number of concurrent API calls. diff --git a/promptolution/llms/base_llm.py b/promptolution/llms/base_llm.py index b0e5a9a..7f0e95d 100644 --- a/promptolution/llms/base_llm.py +++ b/promptolution/llms/base_llm.py @@ -1,3 +1,5 @@ +"""Base module for LLMs in the promptolution library.""" + from abc import ABC, abstractmethod from typing import List @@ -5,8 +7,7 @@ class BaseLLM(ABC): - """ - Abstract base class for Language Models in the promptolution library. + """Abstract base class for Language Models in the promptolution library. This class defines the interface that all concrete LLM implementations should follow. @@ -14,13 +15,14 @@ class BaseLLM(ABC): get_response: An abstract method that should be implemented by subclasses to generate responses for given prompts. """ + def __init__(self, *args, **kwargs): + """Initialize the LLM.""" pass @abstractmethod def get_response(self, prompts: List[str]) -> List[str]: - """ - Generate responses for the given prompts. + """Generate responses for the given prompts. This method should be implemented by subclasses to define how the LLM generates responses. @@ -35,19 +37,19 @@ def get_response(self, prompts: List[str]) -> List[str]: class DummyLLM(BaseLLM): - """ - A dummy implementation of the BaseLLM for testing purposes. + """A dummy implementation of the BaseLLM for testing purposes. This class generates random responses for given prompts, simulating the behavior of a language model without actually performing any complex natural language processing. """ + def __init__(self, *args, **kwargs): + """Initialize the DummyLLM.""" pass def get_response(self, prompts: str) -> str: - """ - Generate random responses for the given prompts. + """Generate random responses for the given prompts. This method creates silly, random responses enclosed in tags. It's designed for testing and demonstration purposes. diff --git a/promptolution/llms/deepinfra.py b/promptolution/llms/deepinfra.py index 7ed5e2c..d91603c 100644 --- a/promptolution/llms/deepinfra.py +++ b/promptolution/llms/deepinfra.py @@ -1,53 +1,29 @@ +"""DeepInfra API module for language models.""" + from __future__ import annotations -from typing import ( - Any, - AsyncIterator, - Callable, - Dict, - Iterator, - List, - Mapping, - Optional, - Sequence, - Tuple, - Type, - Union, -) -from langchain_core.callbacks.manager import ( - AsyncCallbackManagerForLLMRun, - CallbackManagerForLLMRun, -) -from langchain_core.language_models import LanguageModelInput -from langchain_core.language_models.chat_models import ( - BaseChatModel, - agenerate_from_stream, - generate_from_stream, -) -from langchain_core.messages import ( - BaseMessage, -) -from langchain_core.outputs import ( - ChatGeneration, - ChatGenerationChunk, - ChatResult, -) -from langchain_core.pydantic_v1 import BaseModel, Field, root_validator -from langchain_core.runnables import Runnable -from langchain_core.tools import BaseTool -from langchain_core.utils import get_from_dict_or_env -from langchain_core.utils.function_calling import convert_to_openai_tool +from typing import Any, AsyncIterator, Callable, Dict, Iterator, List, Mapping, Optional, Sequence, Tuple, Type, Union + from langchain_community.chat_models.deepinfra import ( - _create_retry_decorator, + ChatDeepInfraException, _convert_dict_to_message, _convert_message_to_dict, + _create_retry_decorator, _handle_sse_line, _parse_stream, _parse_stream_async, - ChatDeepInfraException, ) - from langchain_community.utilities.requests import Requests +from langchain_core.callbacks.manager import AsyncCallbackManagerForLLMRun, CallbackManagerForLLMRun +from langchain_core.language_models import LanguageModelInput +from langchain_core.language_models.chat_models import BaseChatModel, agenerate_from_stream, generate_from_stream +from langchain_core.messages import BaseMessage +from langchain_core.outputs import ChatGeneration, ChatGenerationChunk, ChatResult +from langchain_core.pydantic_v1 import BaseModel, Field, root_validator +from langchain_core.runnables import Runnable +from langchain_core.tools import BaseTool +from langchain_core.utils import get_from_dict_or_env +from langchain_core.utils.function_calling import convert_to_openai_tool class ChatDeepInfra(BaseChatModel): @@ -76,6 +52,7 @@ class ChatDeepInfra(BaseChatModel): max_retries: int = 1 def __init__(self, model_name: str, **kwargs: Any): + """Initialize the DeepInfra chat model.""" super().__init__(model=model_name, **kwargs) @property @@ -164,6 +141,7 @@ def init_defaults(cls, values: Dict) -> Dict: @root_validator(pre=False, skip_on_failure=True) def validate_environment(cls, values: Dict) -> Dict: + """Validate the environment variables.""" if values["temperature"] is not None and not 0 <= values["temperature"] <= 1: raise ValueError("temperature must be in the range [0.0, 1.0]") @@ -329,6 +307,5 @@ def bind_tools( **kwargs: Any additional parameters to pass to the :class:`~langchain.runnable.Runnable` constructor. """ - formatted_tools = [convert_to_openai_tool(tool) for tool in tools] return super().bind(tools=formatted_tools, **kwargs) diff --git a/promptolution/llms/local_llm.py b/promptolution/llms/local_llm.py index a6e1760..1cfb616 100644 --- a/promptolution/llms/local_llm.py +++ b/promptolution/llms/local_llm.py @@ -1,3 +1,4 @@ +"""Module for running language models locally using the Hugging Face Transformers library.""" try: import torch import transformers @@ -9,8 +10,7 @@ class LocalLLM: - """ - A class for running language models locally using the Hugging Face Transformers library. + """A class for running language models locally using the Hugging Face Transformers library. This class sets up a text generation pipeline with specified model parameters and provides a method to generate responses for given prompts. @@ -21,9 +21,9 @@ class LocalLLM: Methods: get_response: Generate responses for a list of prompts. """ + def __init__(self, model_id: str, batch_size=8): - """ - Initialize the LocalLLM with a specific model. + """Initialize the LocalLLM with a specific model. Args: model_id (str): The identifier of the model to use (e.g., "gpt2", "facebook/opt-1.3b"). @@ -47,8 +47,7 @@ def __init__(self, model_id: str, batch_size=8): self.pipeline.tokenizer.padding_side = "left" def get_response(self, prompts: list[str]): - """ - Generate responses for a list of prompts using the local language model. + """Generate responses for a list of prompts using the local language model. Args: prompts (list[str]): A list of input prompts. @@ -68,8 +67,9 @@ def get_response(self, prompts: list[str]): response = [r["generated_text"] for r in response] return response - + def __del__(self): + """Cleanup method to delete the pipeline and free up GPU memory.""" try: del self.pipeline torch.cuda.empty_cache() diff --git a/promptolution/optimizers/__init__.py b/promptolution/optimizers/__init__.py index d554524..fe0fce8 100644 --- a/promptolution/optimizers/__init__.py +++ b/promptolution/optimizers/__init__.py @@ -1,11 +1,12 @@ +"""Module for prompt optimizers.""" + from .base_optimizer import DummyOptimizer from .evoprompt_de import EvoPromptDE from .evoprompt_ga import EvoPromptGA def get_optimizer(config, *args, **kwargs): - """ - Factory function to create and return an optimizer instance based on the provided configuration. + """Factory function to create and return an optimizer instance based on the provided configuration. This function selects and instantiates the appropriate optimizer class based on the 'optimizer' field in the config object. It supports three types of optimizers: diff --git a/promptolution/optimizers/base_optimizer.py b/promptolution/optimizers/base_optimizer.py index afdbc5f..effc329 100644 --- a/promptolution/optimizers/base_optimizer.py +++ b/promptolution/optimizers/base_optimizer.py @@ -1,12 +1,13 @@ +"""Base class for prompt optimizers.""" + from abc import ABC, abstractmethod from typing import Callable, List from promptolution.tasks.base_task import BaseTask -class BaseOptimizer(ABC): - """ - Abstract base class for prompt optimizers. +class BaseOptimizer(ABC): + """Abstract base class for prompt optimizers. This class defines the basic structure and interface for prompt optimization algorithms. Concrete optimizer implementations should inherit from this class and implement @@ -24,7 +25,9 @@ class BaseOptimizer(ABC): callbacks (List[Callable], optional): List of callback functions. Defaults to an empty list. predictor (optional): Predictor for prompt evaluation. Defaults to None. """ + def __init__(self, initial_prompts: list[str], task: BaseTask, callbacks: list[Callable] = [], predictor=None): + """Initialize the BaseOptimizer.""" self.prompts = initial_prompts self.task = task self.callbacks = callbacks @@ -32,8 +35,7 @@ def __init__(self, initial_prompts: list[str], task: BaseTask, callbacks: list[C @abstractmethod def optimize(self, n_steps: int) -> List[str]: - """ - Abstract method to perform the optimization process. + """Abstract method to perform the optimization process. This method should be implemented by concrete optimizer classes to define the specific optimization algorithm. @@ -50,30 +52,23 @@ def optimize(self, n_steps: int) -> List[str]: raise NotImplementedError def _on_step_end(self): - """ - Call all registered callbacks at the end of each optimization step. - """ + """Call all registered callbacks at the end of each optimization step.""" for callback in self.callbacks: callback.on_step_end(self) def _on_epoch_end(self): - """ - Call all registered callbacks at the end of each optimization epoch. - """ + """Call all registered callbacks at the end of each optimization epoch.""" for callback in self.callbacks: callback.on_epoch_end(self) def _on_train_end(self): - """ - Call all registered callbacks at the end of the entire optimization process. - """ + """Call all registered callbacks at the end of the entire optimization process.""" for callback in self.callbacks: callback.on_train_end(self) class DummyOptimizer(BaseOptimizer): - """ - A dummy optimizer that doesn't perform any actual optimization. + """A dummy optimizer that doesn't perform any actual optimization. This optimizer simply returns the initial prompts without modification. It's useful for testing or as a baseline comparison. @@ -87,13 +82,14 @@ class DummyOptimizer(BaseOptimizer): *args: Variable length argument list (unused). **kwargs: Arbitrary keyword arguments (unused). """ + def __init__(self, initial_prompts, *args, **kwargs): + """Initialize the DummyOptimizer.""" self.callbacks = [] self.prompts = initial_prompts def optimize(self, n_steps) -> list[str]: - """ - Simulate an optimization process without actually modifying the prompts. + """Simulate an optimization process without actually modifying the prompts. This method calls the callback methods to simulate a complete optimization cycle, but returns the initial prompts unchanged. diff --git a/promptolution/optimizers/evoprompt_de.py b/promptolution/optimizers/evoprompt_de.py index 50c3abf..a01b457 100644 --- a/promptolution/optimizers/evoprompt_de.py +++ b/promptolution/optimizers/evoprompt_de.py @@ -1,3 +1,5 @@ +"""Module for EvoPromptDE optimizer.""" + from typing import List import numpy as np @@ -6,8 +8,7 @@ class EvoPromptDE(BaseOptimizer): - """ - EvoPromptDE: Differential Evolution-based Prompt Optimizer + """EvoPromptDE: Differential Evolution-based Prompt Optimizer. This class implements a differential evolution algorithm for optimizing prompts in large language models. It is adapted from the paper "Connecting Large Language Models with Evolutionary Algorithms @@ -27,15 +28,16 @@ class EvoPromptDE(BaseOptimizer): donor_random (bool, optional): Whether to use a random donor. Defaults to False. **args: Additional arguments passed to the BaseOptimizer. """ + def __init__(self, prompt_template, meta_llm, donor_random=False, **args): + """Initialize the EvoPromptDE optimizer.""" self.prompt_template = prompt_template self.donor_random = donor_random self.meta_llm = meta_llm super().__init__(**args) def optimize(self, n_steps: int) -> List[str]: - """ - Perform the optimization process for a specified number of steps. + """Perform the optimization process for a specified number of steps. This method iteratively improves the prompts using a differential evolution strategy. It evaluates prompts, generates new prompts using the DE algorithm, and replaces diff --git a/promptolution/optimizers/evoprompt_ga.py b/promptolution/optimizers/evoprompt_ga.py index ff795a6..749c0c5 100644 --- a/promptolution/optimizers/evoprompt_ga.py +++ b/promptolution/optimizers/evoprompt_ga.py @@ -1,3 +1,5 @@ +"""Module for EvoPromptGA optimizer.""" + from typing import List import numpy as np @@ -6,8 +8,7 @@ class EvoPromptGA(BaseOptimizer): - """ - EvoPromptGA: Genetic Algorithm-based Prompt Optimizer + """EvoPromptGA: Genetic Algorithm-based Prompt Optimizer. This class implements a genetic algorithm for optimizing prompts in large language models. It is adapted from the paper "Connecting Large Language Models with Evolutionary Algorithms @@ -30,7 +31,9 @@ class EvoPromptGA(BaseOptimizer): Raises: AssertionError: If an invalid selection mode is provided. """ + def __init__(self, prompt_template, meta_llm, selection_mode="wheel", **args): + """Initialize the EvoPromptGA optimizer.""" self.prompt_template = prompt_template self.meta_llm = meta_llm assert selection_mode in ["random", "wheel", "tour"], "Invalid selection mode." @@ -38,8 +41,7 @@ def __init__(self, prompt_template, meta_llm, selection_mode="wheel", **args): super().__init__(**args) def optimize(self, n_steps: int) -> List[str]: - """ - Perform the optimization process for a specified number of steps. + """Perform the optimization process for a specified number of steps. This method iteratively improves the prompts using genetic algorithm techniques. It evaluates prompts, performs crossover to generate new prompts, and selects @@ -70,8 +72,7 @@ def optimize(self, n_steps: int) -> List[str]: return self.prompts def _crossover(self, prompts, scores) -> str: - """ - Perform crossover operation to generate new child prompts. + """Perform crossover operation to generate new child prompts. This method selects parent prompts based on the chosen selection mode, creates meta-prompts using the prompt template, and generates new child diff --git a/promptolution/predictors/__init__.py b/promptolution/predictors/__init__.py index 81293a6..9ae2dfe 100644 --- a/promptolution/predictors/__init__.py +++ b/promptolution/predictors/__init__.py @@ -1,3 +1,5 @@ +"""Module for LLM predictors.""" + from promptolution.llms import get_llm from .base_predictor import DummyPredictor @@ -5,8 +7,7 @@ def get_predictor(name, *args, **kwargs): - """ - Factory function to create and return a predictor instance based on the provided name. + """Factory function to create and return a predictor instance based on the provided name. This function supports two types of predictors: 1. DummyPredictor: A mock predictor for testing purposes. diff --git a/promptolution/predictors/base_predictor.py b/promptolution/predictors/base_predictor.py index 6f0c6fa..941ee9a 100644 --- a/promptolution/predictors/base_predictor.py +++ b/promptolution/predictors/base_predictor.py @@ -1,3 +1,5 @@ +"""Base module for predictors.""" + from abc import abstractmethod from typing import List @@ -5,8 +7,7 @@ class BasePredictor: - """ - Abstract base class for predictors in the promptolution library. + """Abstract base class for predictors in the promptolution library. This class defines the interface that all concrete predictor implementations should follow. @@ -18,9 +19,9 @@ class BasePredictor: predict: An abstract method that should be implemented by subclasses to make predictions based on prompts and input data. """ + def __init__(self, model_id, classes, *args, **kwargs): - """ - Initialize the BasePredictor. + """Initialize the BasePredictor. Args: model_id (str): Identifier for the model to use. @@ -37,8 +38,7 @@ def predict( prompts: List[str], xs: np.ndarray, ) -> np.ndarray: - """ - Abstract method to make predictions based on prompts and input data. + """Abstract method to make predictions based on prompts and input data. Args: prompts (List[str]): List of prompts to use for prediction. @@ -54,8 +54,7 @@ def predict( class DummyPredictor(BasePredictor): - """ - A dummy predictor implementation for testing purposes. + """A dummy predictor implementation for testing purposes. This predictor generates random predictions from the list of possible classes. @@ -66,7 +65,17 @@ class DummyPredictor(BasePredictor): Methods: predict: Generates random predictions for the given prompts and input data. """ + def __init__(self, model_id, classes, *args, **kwargs): + """Initialize the DummyPredictor. + + Parameters + ---------- + model_id : str + Model identifier string. + classes : list + List of possible class labels. + """ self.model_id = "dummy" self.classes = classes @@ -75,8 +84,7 @@ def predict( prompts: List[str], xs: np.ndarray, ) -> np.ndarray: - """ - Generate random predictions for the given prompts and input data. + """Generate random predictions for the given prompts and input data. Args: prompts (List[str]): List of prompts (ignored in this implementation). diff --git a/promptolution/predictors/classificator.py b/promptolution/predictors/classificator.py index 19b5e1a..43518eb 100644 --- a/promptolution/predictors/classificator.py +++ b/promptolution/predictors/classificator.py @@ -1,3 +1,5 @@ +"""Module for classification predictors.""" + from typing import List import numpy as np @@ -6,8 +8,7 @@ class Classificator(BasePredictor): - """ - A predictor class for classification tasks using language models. + """A predictor class for classification tasks using language models. This class takes a language model and a list of classes, and provides a method to predict classes for given prompts and input data. @@ -19,9 +20,9 @@ class Classificator(BasePredictor): Inherits from: BasePredictor: The base class for predictors in the promptolution library. """ + def __init__(self, llm, classes, *args, **kwargs): - """ - Initialize the Classificator. + """Initialize the Classificator. Args: llm: The language model to use for predictions. @@ -35,8 +36,7 @@ def predict( prompts: List[str], xs: np.ndarray, ) -> np.ndarray: - """ - Predict classes for given prompts and input data. + """Predict classes for given prompts and input data. This method generates predictions using the language model and then extracts the predicted class from the model's output. diff --git a/promptolution/tasks/__init__.py b/promptolution/tasks/__init__.py index 5c5dcba..5e48b85 100644 --- a/promptolution/tasks/__init__.py +++ b/promptolution/tasks/__init__.py @@ -1,3 +1,4 @@ +"""Module for task-related functions and classes.""" import json from pathlib import Path from typing import List, Literal @@ -7,8 +8,7 @@ def get_tasks(config, split: Literal["dev", "test"] = "dev") -> List[BaseTask]: - """ - Create and return a list of task instances based on the provided configuration. + """Create and return a list of task instances based on the provided configuration. This function supports creating multiple tasks, including a special 'dummy' task for testing purposes and classification tasks based on JSON descriptions. diff --git a/promptolution/tasks/base_task.py b/promptolution/tasks/base_task.py index 5d75e94..c88f412 100644 --- a/promptolution/tasks/base_task.py +++ b/promptolution/tasks/base_task.py @@ -1,3 +1,5 @@ +"""Base module for tasks.""" + from abc import ABC, abstractmethod from typing import List @@ -5,8 +7,7 @@ class BaseTask(ABC): - """ - Abstract base class for tasks in the promptolution library. + """Abstract base class for tasks in the promptolution library. This class defines the interface that all concrete task implementations should follow. @@ -14,13 +15,14 @@ class BaseTask(ABC): evaluate: An abstract method that should be implemented by subclasses to evaluate prompts using a given predictor. """ + def __init__(self, *args, **kwargs): + """Initialize the BaseTask.""" pass @abstractmethod def evaluate(self, prompts: List[str], predictor) -> np.ndarray: - """ - Abstract method to evaluate prompts using a given predictor. + """Abstract method to evaluate prompts using a given predictor. Args: prompts (List[str]): List of prompts to evaluate. @@ -36,8 +38,7 @@ def evaluate(self, prompts: List[str], predictor) -> np.ndarray: class DummyTask(BaseTask): - """ - A dummy task implementation for testing purposes. + """A dummy task implementation for testing purposes. This task generates random evaluation scores for given prompts. @@ -50,7 +51,9 @@ class DummyTask(BaseTask): ys (np.ndarray): Array of dummy labels. classes (List[str]): List of possible class labels. """ + def __init__(self): + """Initialize the DummyTask.""" self.task_id = "dummy" self.dataset_json = None self.initial_population = ["Some", "initial", "prompts", "that", "will", "do", "the", "trick"] @@ -60,8 +63,7 @@ def __init__(self): self.classes = ["negative", "positive"] def evaluate(self, prompts: List[str], predictor) -> np.ndarray: - """ - Generate random evaluation scores for the given prompts. + """Generate random evaluation scores for the given prompts. Args: prompts (List[str]): List of prompts to evaluate. diff --git a/promptolution/tasks/classification_tasks.py b/promptolution/tasks/classification_tasks.py index bb7c4c5..e7e25b1 100644 --- a/promptolution/tasks/classification_tasks.py +++ b/promptolution/tasks/classification_tasks.py @@ -1,3 +1,5 @@ +"""Module for classification tasks.""" + from pathlib import Path from typing import Dict, List, Literal, Optional @@ -8,8 +10,7 @@ class ClassificationTask(BaseTask): - """ - A class representing a classification task in the promptolution library. + """A class representing a classification task in the promptolution library. This class handles the loading and management of classification datasets, as well as the evaluation of predictors on these datasets. @@ -28,9 +29,9 @@ class ClassificationTask(BaseTask): Inherits from: BaseTask: The base class for tasks in the promptolution library. """ - def __init__(self, task_id: str, dataset_json: Dict, seed: int = 42, split: Literal["dev", "test"] = "dev"): - """ - Initialize the ClassificationTask. + + def __init__(self, task_id: str, dataset_json: Dict, seed: int = 42, split: Literal["dev", "test"] = "dev"): + """Initialize the ClassificationTask. Args: task_id (str): Unique identifier for the task. @@ -50,11 +51,11 @@ def __init__(self, task_id: str, dataset_json: Dict, seed: int = 42, split: Lite self.reset_seed(seed) def __str__(self): + """Convert task to string representation, returning the task id.""" return self.task_id def _parse_task(self): - """ - Parse the task data from the provided dataset JSON. + """Parse the task data from the provided dataset JSON. This method loads the task description, classes, initial prompts, and the dataset split (dev or test) into the class attributes. @@ -87,9 +88,8 @@ def _parse_task(self): def evaluate( self, prompts: List[str], predictor: BasePredictor, n_samples: int = 20, subsample: bool = True - ) -> np.ndarray: - """ - Evaluate a set of prompts using a given predictor. + ) -> np.ndarray: + """Evaluate a set of prompts using a given predictor. Args: prompts (List[str]): List of prompts to evaluate. @@ -118,6 +118,7 @@ def evaluate( return np.mean(preds == ys_subsample, axis=1) def reset_seed(self, seed: int = None): + """Reset the random seed.""" if seed is not None: self.seed = seed np.random.seed(self.seed) diff --git a/pyproject.toml b/pyproject.toml index 728ebe6..d2d1cc1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "promptolution" -version = "0.1.0" +version = "0.1.1" description = "" authors = ["Tom Zehle, Moritz Schlager, Timo Heiß"] readme = "README.md" @@ -27,9 +27,22 @@ isort = "^5.13.2" pre-commit = "^3.7.1" ipykernel = "^6.29.5" + +[tool.poetry.group.docs.dependencies] +mkdocs = "^1.6.1" +mkdocs-material = "^9.5.39" +mkdocstrings = {version = "^0.26.1", extras = ["python"]} + [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" [tool.black] line-length = 120 + +[tool.isort] +line_length = 120 +profile = "black" + +[tool.pydocstyle] +convention = "google" diff --git a/scripts/experiment_evaluation.py b/scripts/experiment_evaluation.py index bf23304..e3ef1b5 100644 --- a/scripts/experiment_evaluation.py +++ b/scripts/experiment_evaluation.py @@ -1,8 +1,10 @@ -from configparser import ConfigParser +"""Experiment for paper Towards Cost-Effective Prompt Tuning to evaluate best prompts.""" from argparse import ArgumentParser -from typing import Tuple -from pathlib import Path +from configparser import ConfigParser from logging import INFO, Logger +from pathlib import Path +from typing import Tuple + import pandas as pd from tqdm import tqdm @@ -15,8 +17,9 @@ def get_best_prompt_from_csv(csv_path: str) -> Tuple[str, float]: - """ - Get the best prompt from a csv file, by looking at the most recent step + """Get the best prompt from a csv file. + + This function gets the best prompst from a csv file by looking at the most recent step and picking the prompt with the highest score in that step. There are multiple occurrences of the same step, we only pick the highest score (first occurrrence if there are multiple). """ @@ -31,9 +34,7 @@ def get_best_prompt_from_csv(csv_path: str) -> Tuple[str, float]: def evaluate_best_prompts( experiment_name: str, target_experiment: str, logging_dir: Path, downstream_llm: str, n_samples: int, seed: int ) -> pd.DataFrame: - """ - Evaluate the best prompts from a csv file - """ + """Evaluate the best prompts from a csv file.""" # convert the logging directory to a string logging_dir = str(logging_dir) @@ -77,6 +78,7 @@ def evaluate_best_prompts( def main(): + """Run the evaluation of best prompts.""" # read experiments arg_parser = ArgumentParser() arg_parser.add_argument("-e", "--experiment", type=str, help="Experiment Config Filepath") diff --git a/scripts/experiment_initial_prompts.py b/scripts/experiment_initial_prompts.py index 1616ab0..455f41b 100644 --- a/scripts/experiment_initial_prompts.py +++ b/scripts/experiment_initial_prompts.py @@ -1,10 +1,13 @@ -from configparser import ConfigParser +"""Experiments for paper Towards Cost-Effective Prompt Tuning initial prompt evaluation.""" + from argparse import ArgumentParser +from configparser import ConfigParser +from logging import INFO, Logger from pathlib import Path from typing import List -from logging import INFO, Logger -import pandas as pd + import numpy as np +import pandas as pd from promptolution.config import Config from promptolution.predictors import get_predictor @@ -22,10 +25,7 @@ def evaluate_prompts( n_samples: int, prompts: List[str], ) -> pd.DataFrame: - """ - Evaluate the best prompts from a csv file - """ - + """Evaluate the best prompts from a csv file.""" # create config for the experiment config = Config( task_name=task_name, @@ -39,7 +39,7 @@ def evaluate_prompts( # evaluate the best prompt on the test set for prompt in prompts: - # check if the combination of task, downstream_llm, seed and prompt has already been evaluated and is a row in + # check if the combination of task, downstream_llm, seed and prompt has already been evaluated and is a row in # the csv file if Path(f"logs/{experiment_name}/best_scores.csv").exists(): df = pd.read_csv(f"logs/{experiment_name}/best_scores.csv") @@ -74,6 +74,7 @@ def evaluate_prompts( def main(): + """Run experiment.""" # read experiments arg_parser = ArgumentParser() arg_parser.add_argument("-e", "--experiment", type=str, help="Experiment Config Filepath") @@ -95,7 +96,6 @@ def main(): logger.critical(f"Downstream LLM: {downstream_llm}") for task in tasks: - # sample initial prompt (read txt from datasets/cls/task_name/prompts.txt) task_path = Path(f"data_sets/cls/{task}/prompts.txt") with open(task_path, "r", encoding="utf-8") as file: diff --git a/scripts/experiment_runs.py b/scripts/experiment_runs.py index 03ec4e6..7f13194 100644 --- a/scripts/experiment_runs.py +++ b/scripts/experiment_runs.py @@ -1,5 +1,6 @@ -from configparser import ConfigParser +"""Experiments for paper Towards Cost-Effective Prompt Tuning.""" from argparse import ArgumentParser +from configparser import ConfigParser from logging import INFO, Logger from pathlib import Path @@ -18,9 +19,10 @@ def main(): + """Run the experiments defined in the provided configuration file.""" # read experiments ini arg_parser = ArgumentParser() - arg_parser.add_argument('-e', '--experiment', type=str, help='Experiment Config Filepath') + arg_parser.add_argument("-e", "--experiment", type=str, help="Experiment Config Filepath") args = arg_parser.parse_args() all_configs = ConfigParser() all_configs.read(args.experiment) @@ -45,7 +47,10 @@ def main(): downstream_llm=downstream_llm, meta_prompt_path=meta_prompt_path, init_pop_size=int(all_configs["optimizer"]["init_population"]), - logging_dir=f"logs/{experiment_name}/{task_name}_{optimizer_name}_{meta_llm}_{evaluator_llm}_{random_seed}.csv", + logging_dir=( + f"logs/{experiment_name}/" + + f"{task_name}_{optimizer_name}_{meta_llm}_{evaluator_llm}_{random_seed}.csv" + ), experiment_name=experiment_name, random_seed=random_seed, evaluation_llm=evaluator_llm, @@ -59,6 +64,7 @@ def main(): def run_experiment(config: Config): + """Run a single experiment.""" task = get_tasks(config)[0] init_populations = task.initial_population # subsample using random seed diff --git a/site/404.html b/site/404.html deleted file mode 100644 index c5e6d60..0000000 --- a/site/404.html +++ /dev/null @@ -1,172 +0,0 @@ - - - - - - - - - - - Promptolution Documentation - - - - - - - - - - - - - - -

- -
-
- -
-
-

404

-

Page not found

-
-
- - -
-
- - - - - - - - - - - diff --git a/site/api/callbacks/index.html b/site/api/callbacks/index.html deleted file mode 100644 index d2d62dc..0000000 --- a/site/api/callbacks/index.html +++ /dev/null @@ -1,673 +0,0 @@ - - - - - - - - - - - Callbacks - Promptolution Documentation - - - - - - - - - - - - - - - - -
-
-
-
- -

Callbacks

-

This module contains callback implementations for various purposes.

- - -
- - - - -
- - - -
- - - - - - - - -
- - - -

- BestPromptCallback - - -

- - -
-

- Bases: Callback

- - -

Callback for tracking the best prompt during optimization.

-

This callback keeps track of the prompt with the highest score.

- - -

Attributes:

- - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
best_prompt - str - -
-

The prompt with the highest score so far.

-
-
best_score - float - -
-

The highest score achieved so far.

-
-
- -
- Source code in promptolution\callbacks.py -
class BestPromptCallback(Callback):
-    """
-    Callback for tracking the best prompt during optimization.
-
-    This callback keeps track of the prompt with the highest score.
-
-    Attributes:
-        best_prompt (str): The prompt with the highest score so far.
-        best_score (float): The highest score achieved so far.
-    """
-    def __init__(self):
-        self.best_prompt = ""
-        self.best_score = -99999
-
-    def on_step_end(self, optimizer):
-        if optimizer.scores[0] > self.best_score:
-            self.best_score = optimizer.scores[0]
-            self.best_prompt = optimizer.prompts[0]
-
-    def get_best_prompt(self):
-        return self.best_prompt, self.best_score
-
- - - -
- - - - - - - - - - - -
- -
- -
- -
- - - -

- CSVCallback - - -

- - -
-

- Bases: Callback

- - -

Callback for saving optimization progress to a CSV file.

-

This callback saves prompts and scores at each step to a CSV file.

- - -

Attributes:

- - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
path - str - -
-

The path to the CSV file.

-
-
step - int - -
-

The current step number.

-
-
- -
- Source code in promptolution\callbacks.py -
class CSVCallback(Callback):
-    """
-    Callback for saving optimization progress to a CSV file.
-
-    This callback saves prompts and scores at each step to a CSV file.
-
-    Attributes:
-        path (str): The path to the CSV file.
-        step (int): The current step number.
-    """
-    def __init__(self, path):
-        # if dir does not exist
-        if not os.path.exists(os.path.dirname(path)):
-            os.makedirs(os.path.dirname(path))
-
-        # create file in path with header: "step,prompt,score"
-        with open(path, "w") as f:
-            f.write("step,prompt,score\n")
-        self.path = path
-        self.step = 0
-
-    def on_step_end(self, optimizer):
-        """
-        Save prompts and scores to csv
-        """
-        self.step += 1
-        df = pd.DataFrame(
-            {"step": [self.step] * len(optimizer.prompts), "prompt": optimizer.prompts, "score": optimizer.scores}
-        )
-        df.to_csv(self.path, mode="a", header=False, index=False)
-
-    def on_train_end(self, logs=None):
-        pass
-
- - - -
- - - - - - - - - -
- - -

- on_step_end(optimizer) - -

- - -
- -

Save prompts and scores to csv

- -
- Source code in promptolution\callbacks.py -
def on_step_end(self, optimizer):
-    """
-    Save prompts and scores to csv
-    """
-    self.step += 1
-    df = pd.DataFrame(
-        {"step": [self.step] * len(optimizer.prompts), "prompt": optimizer.prompts, "score": optimizer.scores}
-    )
-    df.to_csv(self.path, mode="a", header=False, index=False)
-
-
- -
- - - -
- -
- -
- -
- - - -

- LoggerCallback - - -

- - -
-

- Bases: Callback

- - -

Callback for logging optimization progress.

-

This callback logs information about each step, epoch, and the end of training.

- - -

Attributes:

- - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
logger - -
-

The logger object to use for logging.

-
-
step - int - -
-

The current step number.

-
-
- -
- Source code in promptolution\callbacks.py -
class LoggerCallback(Callback):
-    """
-    Callback for logging optimization progress.
-
-    This callback logs information about each step, epoch, and the end of training.
-
-    Attributes:
-        logger: The logger object to use for logging.
-        step (int): The current step number.
-    """
-    def __init__(self, logger):
-        self.logger = logger
-        self.step = 0
-
-    def on_step_end(self, optimizer):
-        self.step += 1
-        self.logger.critical(f"✨Step {self.step} ended✨")
-        for i, (prompt, score) in enumerate(zip(optimizer.prompts, optimizer.scores)):
-            self.logger.critical(f"*** Prompt {i}: Score: {score}")
-            self.logger.critical(f"{prompt}")
-
-    def on_epoch_end(self, epoch, logs=None):
-        self.logger.critical(f"Epoch {epoch} - {logs}")
-
-    def on_train_end(self, logs=None):
-        self.logger.critical(f"Training ended - {logs}")
-
- - - -
- - - - - - - - - - - -
- -
- -
- -
- - - -

- ProgressBarCallback - - -

- - -
-

- Bases: Callback

- - -

Callback for displaying a progress bar during optimization.

-

This callback uses tqdm to display a progress bar that updates at each step.

- - -

Attributes:

- - - - - - - - - - - - - - - -
NameTypeDescription
pbar - tqdm - -
-

The tqdm progress bar object.

-
-
- -
- Source code in promptolution\callbacks.py -
class ProgressBarCallback(Callback):
-    """
-    Callback for displaying a progress bar during optimization.
-
-    This callback uses tqdm to display a progress bar that updates at each step.
-
-    Attributes:
-        pbar (tqdm): The tqdm progress bar object.
-    """
-    def __init__(self, total_steps):
-        self.pbar = tqdm(total=total_steps)
-
-    def on_step_end(self, optimizer):
-        self.pbar.update(1)
-
-    def on_train_end(self, logs=None):
-        self.pbar.close()
-
- - - -
- - - - - - - - - - - -
- -
- -
- - - - -
- -
- -
-
-
- - - - - - - - - - - diff --git a/site/api/config/index.html b/site/api/config/index.html deleted file mode 100644 index d94d0ce..0000000 --- a/site/api/config/index.html +++ /dev/null @@ -1,794 +0,0 @@ - - - - - - - - - - - Config - Promptolution Documentation - - - - - - - - - - - - - - - - -
-
-
-
- -

Config

-

This module contains the configuration settings for the Promptolution library.

- - -
- - - -

- Config - - - - dataclass - - -

- - -
- - -

Configuration class for the promptolution library.

-

This class handles loading and parsing of configuration settings, -either from a config file or from keyword arguments.

- - -

Attributes:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
task_name - str - -
-

Name of the task.

-
-
ds_path - str - -
-

Path to the dataset.

-
-
n_steps - int - -
-

Number of optimization steps.

-
-
optimizer - str - -
-

Name of the optimizer to use.

-
-
meta_prompt_path - str - -
-

Path to the meta prompt file.

-
-
meta_llms - str - -
-

Name of the meta language model.

-
-
downstream_llm - str - -
-

Name of the downstream language model.

-
-
evaluation_llm - str - -
-

Name of the evaluation language model.

-
-
init_pop_size - int - -
-

Initial population size. Defaults to 10.

-
-
logging_dir - str - -
-

Directory for logging. Defaults to "logs/run.csv".

-
-
experiment_name - str - -
-

Name of the experiment. Defaults to "experiment".

-
-
include_task_desc - bool - -
-

Whether to include task description. Defaults to False.

-
-
random_seed - int - -
-

Random seed for reproducibility. Defaults to 42.

-
-
- -
- Source code in promptolution\config.py -
@dataclass
-class Config:
-    """
-    Configuration class for the promptolution library.
-
-    This class handles loading and parsing of configuration settings,
-    either from a config file or from keyword arguments.
-
-    Attributes:
-        task_name (str): Name of the task.
-        ds_path (str): Path to the dataset.
-        n_steps (int): Number of optimization steps.
-        optimizer (str): Name of the optimizer to use.
-        meta_prompt_path (str): Path to the meta prompt file.
-        meta_llms (str): Name of the meta language model.
-        downstream_llm (str): Name of the downstream language model.
-        evaluation_llm (str): Name of the evaluation language model.
-        init_pop_size (int): Initial population size. Defaults to 10.
-        logging_dir (str): Directory for logging. Defaults to "logs/run.csv".
-        experiment_name (str): Name of the experiment. Defaults to "experiment".
-        include_task_desc (bool): Whether to include task description. Defaults to False.
-        random_seed (int): Random seed for reproducibility. Defaults to 42.
-    """
-    task_name: str
-    ds_path: str
-    n_steps: int
-    optimizer: str
-    meta_prompt_path: str
-    meta_llms: str
-    downstream_llm: str
-    evaluation_llm: str
-    init_pop_size: int = 10
-    logging_dir: str = "logs/run.csv"
-    experiment_name: str = "experiment"
-    include_task_desc: bool = False
-    random_seed: int = 42
-
-    def __init__(self, config_path: str = None, **kwargs):
-        if config_path:
-            self.config_path = config_path
-            self.config = ConfigParser()
-            self.config.read(config_path)
-            self._parse_config()
-        else:
-            for key, value in kwargs.items():
-                setattr(self, key, value)
-
-    def _parse_config(self):
-        self.task_name = self.config["task"]["task_name"]
-        self.ds_path = self.config["task"]["ds_path"]
-        self.n_steps = int(self.config["task"]["steps"])
-        self.random_seed = int(self.config["task"]["random_seed"])
-        self.optimizer = self.config["optimizer"]["name"]
-        self.meta_prompt_path = self.config["optimizer"]["meta_prompt_path"]
-        self.meta_llm = self.config["meta_llm"]["name"]
-        self.downstream_llm = self.config["downstream_llm"]["name"]
-        self.evaluation_llm = self.config["evaluator_llm"]["name"]
-        self.init_pop_size = int(self.config["optimizer"]["init_pop_size"])
-        self.logging_dir = self.config["logging"]["dir"]
-        self.experiment_name = self.config["experiment"]["name"]
-
-        if "include_task_desc" in self.config["task"]:
-            self.include_task_desc = self.config["task"]["include_task_desc"] == "True"
-
-        if self.optimizer == "evopromptga":
-            self.selection_mode = self.config["optimizer"]["selection_mode"]
-        elif self.optimizer == "evopromptde":
-            self.selection_mode = self.config["optimizer"]["donor_random"]
-
-        if "local" in self.meta_llm:
-            self.meta_bs = int(self.config["meta_llm"]["batch_size"])
-
-        if "local" in self.downstream_llm:
-            self.downstream_bs = int(self.config["downstream_llm"]["batch_size"])
-
- - - -
- - - - - - - -
- - - -

- config = ConfigParser() - - - instance-attribute - - -

- - -
-
- -
- -
- - - -

- config_path = config_path - - - instance-attribute - - -

- - -
-
- -
- -
- - - -

- downstream_llm: str - - - instance-attribute - - -

- - -
-
- -
- -
- - - -

- ds_path: str - - - instance-attribute - - -

- - -
-
- -
- -
- - - -

- evaluation_llm: str - - - instance-attribute - - -

- - -
-
- -
- -
- - - -

- experiment_name: str = 'experiment' - - - class-attribute - instance-attribute - - -

- - -
-
- -
- -
- - - -

- include_task_desc: bool = False - - - class-attribute - instance-attribute - - -

- - -
-
- -
- -
- - - -

- init_pop_size: int = 10 - - - class-attribute - instance-attribute - - -

- - -
-
- -
- -
- - - -

- logging_dir: str = 'logs/run.csv' - - - class-attribute - instance-attribute - - -

- - -
-
- -
- -
- - - -

- meta_llms: str - - - instance-attribute - - -

- - -
-
- -
- -
- - - -

- meta_prompt_path: str - - - instance-attribute - - -

- - -
-
- -
- -
- - - -

- n_steps: int - - - instance-attribute - - -

- - -
-
- -
- -
- - - -

- optimizer: str - - - instance-attribute - - -

- - -
-
- -
- -
- - - -

- random_seed: int = 42 - - - class-attribute - instance-attribute - - -

- - -
-
- -
- -
- - - -

- task_name: str - - - instance-attribute - - -

- - -
-
- -
- - - -
- - -

- __init__(config_path=None, **kwargs) - -

- - -
- -
- Source code in promptolution\config.py -
def __init__(self, config_path: str = None, **kwargs):
-    if config_path:
-        self.config_path = config_path
-        self.config = ConfigParser()
-        self.config.read(config_path)
-        self._parse_config()
-    else:
-        for key, value in kwargs.items():
-            setattr(self, key, value)
-
-
- -
- - - -
- -
- -
-
-
- - - - - - - - - - - diff --git a/site/api/llms/index.html b/site/api/llms/index.html deleted file mode 100644 index b03febd..0000000 --- a/site/api/llms/index.html +++ /dev/null @@ -1,4565 +0,0 @@ - - - - - - - - - - - LLMs - Promptolution Documentation - - - - - - - - - - - - - - - - -
-
-
-
- -

LLMs

-

This module contains the LLM (Large Language Model) implementations.

- - -
- - - - -
- - - -
- - - - - - - - - -
- - -

- get_llm(model_id, *args, **kwargs) - -

- - -
- -

Factory function to create and return a language model instance based on the provided model_id.

-

This function supports three types of language models: -1. DummyLLM: A mock LLM for testing purposes. -2. LocalLLM: For running models locally (identified by 'local' in the model_id). -3. APILLM: For API-based models (default if not matching other types).

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
model_id - str - -
-

Identifier for the model to use. Special cases: - - "dummy" for DummyLLM - - "local-{model_name}" for LocalLLM - - Any other string for APILLM

-
-
- required -
*args - -
-

Variable length argument list passed to the LLM constructor.

-
-
- () -
**kwargs - -
-

Arbitrary keyword arguments passed to the LLM constructor.

-
-
- {} -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- -
-

An instance of DummyLLM, LocalLLM, or APILLM based on the model_id.

-
-
- -
- Source code in promptolution\llms\__init__.py -
def get_llm(model_id: str, *args, **kwargs):
-    """
-    Factory function to create and return a language model instance based on the provided model_id.
-
-    This function supports three types of language models:
-    1. DummyLLM: A mock LLM for testing purposes.
-    2. LocalLLM: For running models locally (identified by 'local' in the model_id).
-    3. APILLM: For API-based models (default if not matching other types).
-
-    Args:
-        model_id (str): Identifier for the model to use. Special cases:
-                        - "dummy" for DummyLLM
-                        - "local-{model_name}" for LocalLLM
-                        - Any other string for APILLM
-        *args: Variable length argument list passed to the LLM constructor.
-        **kwargs: Arbitrary keyword arguments passed to the LLM constructor.
-
-    Returns:
-        An instance of DummyLLM, LocalLLM, or APILLM based on the model_id.
-    """
-    if model_id == "dummy":
-        return DummyLLM(*args, **kwargs)
-    if "local" in model_id:
-        model_id = "-".join(model_id.split("-")[1:])
-        return LocalLLM(model_id, *args, **kwargs)
-    return APILLM(model_id, *args, **kwargs)
-
-
- -
- - -
- - - -

- api_llm - - -

- -
- - - -
- - - - - - - - -
- - - -

- APILLM - - -

- - -
- - -

A class to interface with various language models through their respective APIs.

-

This class supports Claude (Anthropic), GPT (OpenAI), and LLaMA (DeepInfra) models. -It handles API key management, model initialization, and provides methods for -both synchronous and asynchronous inference.

- - -

Attributes:

- - - - - - - - - - - - - - - -
NameTypeDescription
model - -
-

The initialized language model instance.

-
-
- - -

Methods:

- - - - - - - - - - - - - - - - - -
NameDescription
get_response -
-

Synchronously get responses for a list of prompts.

-
-
_get_response -
-

Asynchronously get responses for a list of prompts.

-
-
- -
- Source code in promptolution\llms\api_llm.py -
class APILLM:
-    """
-    A class to interface with various language models through their respective APIs.
-
-    This class supports Claude (Anthropic), GPT (OpenAI), and LLaMA (DeepInfra) models.
-    It handles API key management, model initialization, and provides methods for
-    both synchronous and asynchronous inference.
-
-    Attributes:
-        model: The initialized language model instance.
-
-    Methods:
-        get_response: Synchronously get responses for a list of prompts.
-        _get_response: Asynchronously get responses for a list of prompts.
-    """
-    def __init__(self, model_id: str):
-        """
-        Initialize the APILLM with a specific model.
-
-        Args:
-            model_id (str): Identifier for the model to use.
-
-        Raises:
-            ValueError: If an unknown model identifier is provided.
-        """
-        if "claude" in model_id:
-            ANTHROPIC_API_KEY = open("anthropictoken.txt", "r").read()
-            self.model = ChatAnthropic(model=model_id, api_key=ANTHROPIC_API_KEY)
-        elif "gpt" in model_id:
-            OPENAI_API_KEY = open("openaitoken.txt", "r").read()
-            self.model = ChatOpenAI(model=model_id, api_key=OPENAI_API_KEY)
-        elif "llama" in model_id:
-            DEEPINFRA_API_KEY = open("deepinfratoken.txt", "r").read()
-            self.model = ChatDeepInfra(model_name=model_id, deepinfra_api_token=DEEPINFRA_API_KEY)
-        else:
-            raise ValueError(f"Unknown model: {model_id}")
-
-    def get_response(self, prompts: List[str]) -> List[str]:
-        """
-        Synchronously get responses for a list of prompts.
-
-        This method includes retry logic for handling connection errors and rate limits.
-
-        Args:
-            prompts (list[str]): List of input prompts.
-
-        Returns:
-            list[str]: List of model responses.
-
-        Raises:
-            requests.exceptions.ConnectionError: If max retries are exceeded.
-        """
-        max_retries = 100
-        delay = 3
-        attempts = 0
-
-        while attempts < max_retries:
-            try:
-                responses = asyncio.run(self._get_response(prompts))
-                return responses
-            except requests.exceptions.ConnectionError as e:
-                attempts += 1
-                logger.critical(
-                    f"Connection error: {e}. Attempt {attempts}/{max_retries}. Retrying in {delay} seconds..."
-                )
-                time.sleep(delay)
-            except openai.RateLimitError as e:
-                attempts += 1
-                logger.critical(
-                    f"Rate limit error: {e}. Attempt {attempts}/{max_retries}. Retrying in {delay} seconds..."
-                )
-                time.sleep(delay)
-
-        # If the loop exits, it means max retries were reached
-        raise requests.exceptions.ConnectionError("Max retries exceeded. Connection could not be established.")
-
-    async def _get_response(
-        self, prompts: list[str], max_concurrent_calls=200
-    ) -> list[str]:  
-        """
-        Asynchronously get responses for a list of prompts.
-
-        This method uses a semaphore to limit the number of concurrent API calls.
-
-        Args:
-            prompts (list[str]): List of input prompts.
-            max_concurrent_calls (int): Maximum number of concurrent API calls allowed.
-
-        Returns:
-            list[str]: List of model responses.
-        """
-        semaphore = asyncio.Semaphore(max_concurrent_calls)  # Limit the number of concurrent calls
-        tasks = []
-
-        for prompt in prompts:
-            tasks.append(invoke_model(prompt, self.model, semaphore))
-
-        responses = await asyncio.gather(*tasks)
-        return responses
-
- - - -
- - - - - - - - - -
- - -

- __init__(model_id) - -

- - -
- -

Initialize the APILLM with a specific model.

- - -

Parameters:

- - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
model_id - str - -
-

Identifier for the model to use.

-
-
- required -
- - -

Raises:

- - - - - - - - - - - - - -
TypeDescription
- ValueError - -
-

If an unknown model identifier is provided.

-
-
- -
- Source code in promptolution\llms\api_llm.py -
def __init__(self, model_id: str):
-    """
-    Initialize the APILLM with a specific model.
-
-    Args:
-        model_id (str): Identifier for the model to use.
-
-    Raises:
-        ValueError: If an unknown model identifier is provided.
-    """
-    if "claude" in model_id:
-        ANTHROPIC_API_KEY = open("anthropictoken.txt", "r").read()
-        self.model = ChatAnthropic(model=model_id, api_key=ANTHROPIC_API_KEY)
-    elif "gpt" in model_id:
-        OPENAI_API_KEY = open("openaitoken.txt", "r").read()
-        self.model = ChatOpenAI(model=model_id, api_key=OPENAI_API_KEY)
-    elif "llama" in model_id:
-        DEEPINFRA_API_KEY = open("deepinfratoken.txt", "r").read()
-        self.model = ChatDeepInfra(model_name=model_id, deepinfra_api_token=DEEPINFRA_API_KEY)
-    else:
-        raise ValueError(f"Unknown model: {model_id}")
-
-
- -
- -
- - -

- get_response(prompts) - -

- - -
- -

Synchronously get responses for a list of prompts.

-

This method includes retry logic for handling connection errors and rate limits.

- - -

Parameters:

- - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompts - list[str] - -
-

List of input prompts.

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- List[str] - -
-

list[str]: List of model responses.

-
-
- - -

Raises:

- - - - - - - - - - - - - -
TypeDescription
- ConnectionError - -
-

If max retries are exceeded.

-
-
- -
- Source code in promptolution\llms\api_llm.py -
def get_response(self, prompts: List[str]) -> List[str]:
-    """
-    Synchronously get responses for a list of prompts.
-
-    This method includes retry logic for handling connection errors and rate limits.
-
-    Args:
-        prompts (list[str]): List of input prompts.
-
-    Returns:
-        list[str]: List of model responses.
-
-    Raises:
-        requests.exceptions.ConnectionError: If max retries are exceeded.
-    """
-    max_retries = 100
-    delay = 3
-    attempts = 0
-
-    while attempts < max_retries:
-        try:
-            responses = asyncio.run(self._get_response(prompts))
-            return responses
-        except requests.exceptions.ConnectionError as e:
-            attempts += 1
-            logger.critical(
-                f"Connection error: {e}. Attempt {attempts}/{max_retries}. Retrying in {delay} seconds..."
-            )
-            time.sleep(delay)
-        except openai.RateLimitError as e:
-            attempts += 1
-            logger.critical(
-                f"Rate limit error: {e}. Attempt {attempts}/{max_retries}. Retrying in {delay} seconds..."
-            )
-            time.sleep(delay)
-
-    # If the loop exits, it means max retries were reached
-    raise requests.exceptions.ConnectionError("Max retries exceeded. Connection could not be established.")
-
-
- -
- - - -
- -
- -
- - -
- - -

- invoke_model(prompt, model, semaphore) - - - async - - -

- - -
- -

Asynchronously invoke a language model with retry logic.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompt - str - -
-

The input prompt for the model.

-
-
- required -
model - -
-

The language model to invoke.

-
-
- required -
semaphore - Semaphore - -
-

Semaphore to limit concurrent calls.

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
Name TypeDescription
str - -
-

The model's response content.

-
-
- - -

Raises:

- - - - - - - - - - - - - -
TypeDescription
- ChatDeepInfraException - -
-

If all retry attempts fail.

-
-
- -
- Source code in promptolution\llms\api_llm.py -
async def invoke_model(prompt, model, semaphore):
-    """
-    Asynchronously invoke a language model with retry logic.
-
-    Args:
-        prompt (str): The input prompt for the model.
-        model: The language model to invoke.
-        semaphore (asyncio.Semaphore): Semaphore to limit concurrent calls.
-
-    Returns:
-        str: The model's response content.
-
-    Raises:
-        ChatDeepInfraException: If all retry attempts fail.
-    """
-    async with semaphore:
-        max_retries = 100
-        delay = 3
-        attempts = 0
-
-        while attempts < max_retries:
-            try:
-                response = await asyncio.to_thread(model.invoke, [HumanMessage(content=prompt)])
-                return response.content
-            except ChatDeepInfraException as e:
-                print(f"DeepInfra error: {e}. Attempt {attempts}/{max_retries}. Retrying in {delay} seconds...")
-                attempts += 1
-                time.sleep(delay)
-
-
- -
- - - -
- -
- -
- -
- - - -

- base_llm - - -

- -
- - - -
- - - - - - - - -
- - - -

- BaseLLM - - -

- - -
-

- Bases: ABC

- - -

Abstract base class for Language Models in the promptolution library.

-

This class defines the interface that all concrete LLM implementations should follow.

- - -

Methods:

- - - - - - - - - - - - - -
NameDescription
get_response -
-

An abstract method that should be implemented by subclasses - to generate responses for given prompts.

-
-
- -
- Source code in promptolution\llms\base_llm.py -
class BaseLLM(ABC):
-    """
-    Abstract base class for Language Models in the promptolution library.
-
-    This class defines the interface that all concrete LLM implementations should follow.
-
-    Methods:
-        get_response: An abstract method that should be implemented by subclasses
-                      to generate responses for given prompts.
-    """
-    def __init__(self, *args, **kwargs):
-        pass
-
-    @abstractmethod
-    def get_response(self, prompts: List[str]) -> List[str]:
-        """
-        Generate responses for the given prompts.
-
-        This method should be implemented by subclasses to define how
-        the LLM generates responses.
-
-        Args:
-            prompts (List[str]): A list of input prompts.
-
-        Returns:
-            List[str]: A list of generated responses corresponding to the input prompts.
-        """
-        pass
-
- - - -
- - - - - - - - - -
- - -

- get_response(prompts) - - - abstractmethod - - -

- - -
- -

Generate responses for the given prompts.

-

This method should be implemented by subclasses to define how -the LLM generates responses.

- - -

Parameters:

- - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompts - List[str] - -
-

A list of input prompts.

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- List[str] - -
-

List[str]: A list of generated responses corresponding to the input prompts.

-
-
- -
- Source code in promptolution\llms\base_llm.py -
@abstractmethod
-def get_response(self, prompts: List[str]) -> List[str]:
-    """
-    Generate responses for the given prompts.
-
-    This method should be implemented by subclasses to define how
-    the LLM generates responses.
-
-    Args:
-        prompts (List[str]): A list of input prompts.
-
-    Returns:
-        List[str]: A list of generated responses corresponding to the input prompts.
-    """
-    pass
-
-
- -
- - - -
- -
- -
- -
- - - -

- DummyLLM - - -

- - -
-

- Bases: BaseLLM

- - -

A dummy implementation of the BaseLLM for testing purposes.

-

This class generates random responses for given prompts, simulating -the behavior of a language model without actually performing any -complex natural language processing.

- -
- Source code in promptolution\llms\base_llm.py -
class DummyLLM(BaseLLM):
-    """
-    A dummy implementation of the BaseLLM for testing purposes.
-
-    This class generates random responses for given prompts, simulating
-    the behavior of a language model without actually performing any
-    complex natural language processing.
-    """
-    def __init__(self, *args, **kwargs):
-        pass
-
-    def get_response(self, prompts: str) -> str:
-        """
-        Generate random responses for the given prompts.
-
-        This method creates silly, random responses enclosed in <prompt> tags.
-        It's designed for testing and demonstration purposes.
-
-        Args:
-            prompts (str or List[str]): Input prompt(s). If a single string is provided,
-                                        it's converted to a list containing that string.
-
-        Returns:
-            List[str]: A list of randomly generated responses, one for each input prompt.
-        """
-        if isinstance(prompts, str):
-            prompts = [prompts]
-        results = []
-        for _ in prompts:
-            r = np.random.rand()
-            if r < 0.3:
-                results += [f"Joooo wazzuppp <prompt>hier gehts los {r} </prompt>"]
-            if 0.3 <= r < 0.6:
-                results += [f"was das hier? <prompt>peter lustig{r}</prompt>"]
-            else:
-                results += [f"hier ist ein <prompt>test{r}</prompt>"]
-
-        return results
-
- - - -
- - - - - - - - - -
- - -

- get_response(prompts) - -

- - -
- -

Generate random responses for the given prompts.

-

This method creates silly, random responses enclosed in tags. -It's designed for testing and demonstration purposes.

- - -

Parameters:

- - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompts - str or List[str] - -
-

Input prompt(s). If a single string is provided, - it's converted to a list containing that string.

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- str - -
-

List[str]: A list of randomly generated responses, one for each input prompt.

-
-
- -
- Source code in promptolution\llms\base_llm.py -
def get_response(self, prompts: str) -> str:
-    """
-    Generate random responses for the given prompts.
-
-    This method creates silly, random responses enclosed in <prompt> tags.
-    It's designed for testing and demonstration purposes.
-
-    Args:
-        prompts (str or List[str]): Input prompt(s). If a single string is provided,
-                                    it's converted to a list containing that string.
-
-    Returns:
-        List[str]: A list of randomly generated responses, one for each input prompt.
-    """
-    if isinstance(prompts, str):
-        prompts = [prompts]
-    results = []
-    for _ in prompts:
-        r = np.random.rand()
-        if r < 0.3:
-            results += [f"Joooo wazzuppp <prompt>hier gehts los {r} </prompt>"]
-        if 0.3 <= r < 0.6:
-            results += [f"was das hier? <prompt>peter lustig{r}</prompt>"]
-        else:
-            results += [f"hier ist ein <prompt>test{r}</prompt>"]
-
-    return results
-
-
- -
- - - -
- -
- -
- - - - -
- -
- -
- -
- - - -

- deepinfra - - -

- -
- - - -
- - - - - - - - -
- - - -

- ChatDeepInfra - - -

- - -
-

- Bases: BaseChatModel

- - -

A chat model that uses the DeepInfra API.

- -
- Source code in promptolution\llms\deepinfra.py -
class ChatDeepInfra(BaseChatModel):
-    """A chat model that uses the DeepInfra API."""
-
-    # client: Any  #: :meta private:
-    model_name: str = Field(alias="model")
-    """The model name to use for the chat model."""
-    deepinfra_api_token: Optional[str] = None
-    request_timeout: Optional[float] = Field(default=None, alias="timeout")
-    temperature: Optional[float] = 1
-    model_kwargs: Dict[str, Any] = Field(default_factory=dict)
-    """Run inference with this temperature. Must be in the closed
-       interval [0.0, 1.0]."""
-    top_p: Optional[float] = None
-    """Decode using nucleus sampling: consider the smallest set of tokens whose
-       probability sum is at least top_p. Must be in the closed interval [0.0, 1.0]."""
-    top_k: Optional[int] = None
-    """Decode using top-k sampling: consider the set of top_k most probable tokens.
-       Must be positive."""
-    n: int = 1
-    """Number of chat completions to generate for each prompt. Note that the API may
-       not return the full n completions if duplicates are generated."""
-    max_tokens: int = 256
-    streaming: bool = False
-    max_retries: int = 1
-
-    def __init__(self, model_name: str, **kwargs: Any):
-        super().__init__(model=model_name, **kwargs)
-
-    @property
-    def _default_params(self) -> Dict[str, Any]:
-        """Get the default parameters for calling OpenAI API."""
-        return {
-            "model": self.model_name,
-            "max_tokens": self.max_tokens,
-            "stream": self.streaming,
-            "n": self.n,
-            "temperature": self.temperature,
-            "request_timeout": self.request_timeout,
-            **self.model_kwargs,
-        }
-
-    @property
-    def _client_params(self) -> Dict[str, Any]:
-        """Get the parameters used for the openai client."""
-        return {**self._default_params}
-
-    def completion_with_retry(self, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any) -> Any:
-        """Use tenacity to retry the completion call."""
-        retry_decorator = _create_retry_decorator(self, run_manager=run_manager)
-
-        @retry_decorator
-        def _completion_with_retry(**kwargs: Any) -> Any:
-            try:
-                request_timeout = kwargs.pop("request_timeout")
-                request = Requests(headers=self._headers())
-                response = request.post(url=self._url(), data=self._body(kwargs), timeout=request_timeout)
-                self._handle_status(response.status_code, response.text)
-                return response
-            except Exception as e:
-                # import pdb; pdb.set_trace()
-                print("EX", e)  # noqa: T201
-                raise
-
-        return _completion_with_retry(**kwargs)
-
-    async def acompletion_with_retry(
-        self,
-        run_manager: Optional[AsyncCallbackManagerForLLMRun] = None,
-        **kwargs: Any,
-    ) -> Any:
-        """Use tenacity to retry the async completion call."""
-        retry_decorator = _create_retry_decorator(self, run_manager=run_manager)
-
-        @retry_decorator
-        async def _completion_with_retry(**kwargs: Any) -> Any:
-            try:
-                request_timeout = kwargs.pop("request_timeout")
-                request = Requests(headers=self._headers())
-                async with request.apost(url=self._url(), data=self._body(kwargs), timeout=request_timeout) as response:
-                    self._handle_status(response.status, response.text)
-                    return await response.json()
-            except Exception as e:
-                print("EX", e)  # noqa: T201
-                raise
-
-        return await _completion_with_retry(**kwargs)
-
-    @root_validator(pre=True)
-    def init_defaults(cls, values: Dict) -> Dict:
-        """Validate api key, python package exists, temperature, top_p, and top_k."""
-        # For compatibility with LiteLLM
-        api_key = get_from_dict_or_env(
-            values,
-            "deepinfra_api_key",
-            "DEEPINFRA_API_KEY",
-            default="",
-        )
-        values["deepinfra_api_token"] = get_from_dict_or_env(
-            values,
-            "deepinfra_api_token",
-            "DEEPINFRA_API_TOKEN",
-            default=api_key,
-        )
-        # set model id
-        # values["model_name"] = get_from_dict_or_env(
-        #     values,
-        #     "model_name",
-        #     "DEEPINFRA_MODEL_NAME",
-        #     default="",
-        # )
-        return values
-
-    @root_validator(pre=False, skip_on_failure=True)
-    def validate_environment(cls, values: Dict) -> Dict:
-        if values["temperature"] is not None and not 0 <= values["temperature"] <= 1:
-            raise ValueError("temperature must be in the range [0.0, 1.0]")
-
-        if values["top_p"] is not None and not 0 <= values["top_p"] <= 1:
-            raise ValueError("top_p must be in the range [0.0, 1.0]")
-
-        if values["top_k"] is not None and values["top_k"] <= 0:
-            raise ValueError("top_k must be positive")
-
-        return values
-
-    def _generate(
-        self,
-        messages: List[BaseMessage],
-        stop: Optional[List[str]] = None,
-        run_manager: Optional[CallbackManagerForLLMRun] = None,
-        stream: Optional[bool] = None,
-        **kwargs: Any,
-    ) -> ChatResult:
-        should_stream = stream if stream is not None else self.streaming
-        if should_stream:
-            stream_iter = self._stream(messages, stop=stop, run_manager=run_manager, **kwargs)
-            return generate_from_stream(stream_iter)
-
-        message_dicts, params = self._create_message_dicts(messages, stop)
-        params = {**params, **kwargs}
-        response = self.completion_with_retry(messages=message_dicts, run_manager=run_manager, **params)
-        return self._create_chat_result(response.json())
-
-    def _create_chat_result(self, response: Mapping[str, Any]) -> ChatResult:
-        generations = []
-        for res in response["choices"]:
-            message = _convert_dict_to_message(res["message"])
-            gen = ChatGeneration(
-                message=message,
-                generation_info=dict(finish_reason=res.get("finish_reason")),
-            )
-            generations.append(gen)
-        token_usage = response.get("usage", {})
-        llm_output = {"token_usage": token_usage, "model": self.model_name}
-        res = ChatResult(generations=generations, llm_output=llm_output)
-        return res
-
-    def _create_message_dicts(
-        self, messages: List[BaseMessage], stop: Optional[List[str]]
-    ) -> Tuple[List[Dict[str, Any]], Dict[str, Any]]:
-        params = self._client_params
-        if stop is not None:
-            if "stop" in params:
-                raise ValueError("`stop` found in both the input and default params.")
-            params["stop"] = stop
-        message_dicts = [_convert_message_to_dict(m) for m in messages]
-        return message_dicts, params
-
-    def _stream(
-        self,
-        messages: List[BaseMessage],
-        stop: Optional[List[str]] = None,
-        run_manager: Optional[CallbackManagerForLLMRun] = None,
-        **kwargs: Any,
-    ) -> Iterator[ChatGenerationChunk]:
-        message_dicts, params = self._create_message_dicts(messages, stop)
-        params = {**params, **kwargs, "stream": True}
-
-        response = self.completion_with_retry(messages=message_dicts, run_manager=run_manager, **params)
-        for line in _parse_stream(response.iter_lines()):
-            chunk = _handle_sse_line(line)
-            if chunk:
-                cg_chunk = ChatGenerationChunk(message=chunk, generation_info=None)
-                if run_manager:
-                    run_manager.on_llm_new_token(str(chunk.content), chunk=cg_chunk)
-                yield cg_chunk
-
-    async def _astream(
-        self,
-        messages: List[BaseMessage],
-        stop: Optional[List[str]] = None,
-        run_manager: Optional[AsyncCallbackManagerForLLMRun] = None,
-        **kwargs: Any,
-    ) -> AsyncIterator[ChatGenerationChunk]:
-        message_dicts, params = self._create_message_dicts(messages, stop)
-        params = {"messages": message_dicts, "stream": True, **params, **kwargs}
-
-        request_timeout = params.pop("request_timeout")
-        request = Requests(headers=self._headers())
-        async with request.apost(url=self._url(), data=self._body(params), timeout=request_timeout) as response:
-            async for line in _parse_stream_async(response.content):
-                chunk = _handle_sse_line(line)
-                if chunk:
-                    cg_chunk = ChatGenerationChunk(message=chunk, generation_info=None)
-                    if run_manager:
-                        await run_manager.on_llm_new_token(str(chunk.content), chunk=cg_chunk)
-                    yield cg_chunk
-
-    async def _agenerate(
-        self,
-        messages: List[BaseMessage],
-        stop: Optional[List[str]] = None,
-        run_manager: Optional[AsyncCallbackManagerForLLMRun] = None,
-        stream: Optional[bool] = None,
-        **kwargs: Any,
-    ) -> ChatResult:
-        should_stream = stream if stream is not None else self.streaming
-        if should_stream:
-            stream_iter = self._astream(messages, stop=stop, run_manager=run_manager, **kwargs)
-            return await agenerate_from_stream(stream_iter)
-
-        message_dicts, params = self._create_message_dicts(messages, stop)
-        params = {"messages": message_dicts, **params, **kwargs}
-
-        res = await self.acompletion_with_retry(run_manager=run_manager, **params)
-        return self._create_chat_result(res)
-
-    @property
-    def _identifying_params(self) -> Dict[str, Any]:
-        """Get the identifying parameters."""
-        return {
-            "model": self.model_name,
-            "temperature": self.temperature,
-            "top_p": self.top_p,
-            "top_k": self.top_k,
-            "n": self.n,
-        }
-
-    @property
-    def _llm_type(self) -> str:
-        return "deepinfra-chat"
-
-    def _handle_status(self, code: int, text: Any) -> None:
-        if code >= 500:
-            raise ChatDeepInfraException(f"DeepInfra Server: Error {code}")
-        elif code >= 400:
-            raise ValueError(f"DeepInfra received an invalid payload: {text}")
-        elif code != 200:
-            raise Exception(f"DeepInfra returned an unexpected response with status " f"{code}: {text}")
-
-    def _url(self) -> str:
-        return "https://stage.api.deepinfra.com/v1/openai/chat/completions"
-
-    def _headers(self) -> Dict:
-        return {
-            "Authorization": f"bearer {self.deepinfra_api_token}",
-            "Content-Type": "application/json",
-        }
-
-    def _body(self, kwargs: Any) -> Dict:
-        return kwargs
-
-    def bind_tools(
-        self,
-        tools: Sequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]],
-        **kwargs: Any,
-    ) -> Runnable[LanguageModelInput, BaseMessage]:
-        """Bind tool-like objects to this chat model.
-
-        Assumes model is compatible with OpenAI tool-calling API.
-
-        Args:
-            tools: A list of tool definitions to bind to this chat model.
-                Can be  a dictionary, pydantic model, callable, or BaseTool. Pydantic
-                models, callables, and BaseTools will be automatically converted to
-                their schema dictionary representation.
-            **kwargs: Any additional parameters to pass to the
-                :class:`~langchain.runnable.Runnable` constructor.
-        """
-
-        formatted_tools = [convert_to_openai_tool(tool) for tool in tools]
-        return super().bind(tools=formatted_tools, **kwargs)
-
- - - -
- - - - - - - -
- - - -

- model_kwargs: Dict[str, Any] = Field(default_factory=dict) - - - class-attribute - instance-attribute - - -

- - -
- -

Run inference with this temperature. Must be in the closed -interval [0.0, 1.0].

-
- -
- -
- - - -

- model_name: str = Field(alias='model') - - - class-attribute - instance-attribute - - -

- - -
- -

The model name to use for the chat model.

-
- -
- -
- - - -

- n: int = 1 - - - class-attribute - instance-attribute - - -

- - -
- -

Number of chat completions to generate for each prompt. Note that the API may -not return the full n completions if duplicates are generated.

-
- -
- -
- - - -

- top_k: Optional[int] = None - - - class-attribute - instance-attribute - - -

- - -
- -

Decode using top-k sampling: consider the set of top_k most probable tokens. -Must be positive.

-
- -
- -
- - - -

- top_p: Optional[float] = None - - - class-attribute - instance-attribute - - -

- - -
- -

Decode using nucleus sampling: consider the smallest set of tokens whose -probability sum is at least top_p. Must be in the closed interval [0.0, 1.0].

-
- -
- - - -
- - -

- acompletion_with_retry(run_manager=None, **kwargs) - - - async - - -

- - -
- -

Use tenacity to retry the async completion call.

- -
- Source code in promptolution\llms\deepinfra.py -
async def acompletion_with_retry(
-    self,
-    run_manager: Optional[AsyncCallbackManagerForLLMRun] = None,
-    **kwargs: Any,
-) -> Any:
-    """Use tenacity to retry the async completion call."""
-    retry_decorator = _create_retry_decorator(self, run_manager=run_manager)
-
-    @retry_decorator
-    async def _completion_with_retry(**kwargs: Any) -> Any:
-        try:
-            request_timeout = kwargs.pop("request_timeout")
-            request = Requests(headers=self._headers())
-            async with request.apost(url=self._url(), data=self._body(kwargs), timeout=request_timeout) as response:
-                self._handle_status(response.status, response.text)
-                return await response.json()
-        except Exception as e:
-            print("EX", e)  # noqa: T201
-            raise
-
-    return await _completion_with_retry(**kwargs)
-
-
- -
- -
- - -

- bind_tools(tools, **kwargs) - -

- - -
- -

Bind tool-like objects to this chat model.

-

Assumes model is compatible with OpenAI tool-calling API.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
tools - Sequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]] - -
-

A list of tool definitions to bind to this chat model. -Can be a dictionary, pydantic model, callable, or BaseTool. Pydantic -models, callables, and BaseTools will be automatically converted to -their schema dictionary representation.

-
-
- required -
**kwargs - Any - -
-

Any additional parameters to pass to the -:class:~langchain.runnable.Runnable constructor.

-
-
- {} -
- -
- Source code in promptolution\llms\deepinfra.py -
def bind_tools(
-    self,
-    tools: Sequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]],
-    **kwargs: Any,
-) -> Runnable[LanguageModelInput, BaseMessage]:
-    """Bind tool-like objects to this chat model.
-
-    Assumes model is compatible with OpenAI tool-calling API.
-
-    Args:
-        tools: A list of tool definitions to bind to this chat model.
-            Can be  a dictionary, pydantic model, callable, or BaseTool. Pydantic
-            models, callables, and BaseTools will be automatically converted to
-            their schema dictionary representation.
-        **kwargs: Any additional parameters to pass to the
-            :class:`~langchain.runnable.Runnable` constructor.
-    """
-
-    formatted_tools = [convert_to_openai_tool(tool) for tool in tools]
-    return super().bind(tools=formatted_tools, **kwargs)
-
-
- -
- -
- - -

- completion_with_retry(run_manager=None, **kwargs) - -

- - -
- -

Use tenacity to retry the completion call.

- -
- Source code in promptolution\llms\deepinfra.py -
def completion_with_retry(self, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any) -> Any:
-    """Use tenacity to retry the completion call."""
-    retry_decorator = _create_retry_decorator(self, run_manager=run_manager)
-
-    @retry_decorator
-    def _completion_with_retry(**kwargs: Any) -> Any:
-        try:
-            request_timeout = kwargs.pop("request_timeout")
-            request = Requests(headers=self._headers())
-            response = request.post(url=self._url(), data=self._body(kwargs), timeout=request_timeout)
-            self._handle_status(response.status_code, response.text)
-            return response
-        except Exception as e:
-            # import pdb; pdb.set_trace()
-            print("EX", e)  # noqa: T201
-            raise
-
-    return _completion_with_retry(**kwargs)
-
-
- -
- -
- - -

- init_defaults(values) - -

- - -
- -

Validate api key, python package exists, temperature, top_p, and top_k.

- -
- Source code in promptolution\llms\deepinfra.py -
@root_validator(pre=True)
-def init_defaults(cls, values: Dict) -> Dict:
-    """Validate api key, python package exists, temperature, top_p, and top_k."""
-    # For compatibility with LiteLLM
-    api_key = get_from_dict_or_env(
-        values,
-        "deepinfra_api_key",
-        "DEEPINFRA_API_KEY",
-        default="",
-    )
-    values["deepinfra_api_token"] = get_from_dict_or_env(
-        values,
-        "deepinfra_api_token",
-        "DEEPINFRA_API_TOKEN",
-        default=api_key,
-    )
-    # set model id
-    # values["model_name"] = get_from_dict_or_env(
-    #     values,
-    #     "model_name",
-    #     "DEEPINFRA_MODEL_NAME",
-    #     default="",
-    # )
-    return values
-
-
- -
- - - -
- -
- -
- - - - -
- -
- -
- -
- - - -

- local_llm - - -

- -
- - - -
- - - - - - - - -
- - - -

- LocalLLM - - -

- - -
- - -

A class for running language models locally using the Hugging Face Transformers library.

-

This class sets up a text generation pipeline with specified model parameters -and provides a method to generate responses for given prompts.

- - -

Attributes:

- - - - - - - - - - - - - - - -
NameTypeDescription
pipeline - Pipeline - -
-

The text generation pipeline.

-
-
- - -

Methods:

- - - - - - - - - - - - - -
NameDescription
get_response -
-

Generate responses for a list of prompts.

-
-
- -
- Source code in promptolution\llms\local_llm.py -
class LocalLLM:
-    """
-    A class for running language models locally using the Hugging Face Transformers library.
-
-    This class sets up a text generation pipeline with specified model parameters
-    and provides a method to generate responses for given prompts.
-
-    Attributes:
-        pipeline (transformers.Pipeline): The text generation pipeline.
-
-    Methods:
-        get_response: Generate responses for a list of prompts.
-    """
-    def __init__(self, model_id: str, batch_size=8):
-        """
-        Initialize the LocalLLM with a specific model.
-
-        Args:
-            model_id (str): The identifier of the model to use (e.g., "gpt2", "facebook/opt-1.3b").
-            batch_size (int, optional): The batch size for text generation. Defaults to 8.
-
-        Note:
-            This method sets up a text generation pipeline with bfloat16 precision,
-            automatic device mapping, and specific generation parameters.
-        """
-        self.pipeline = transformers.pipeline(
-            "text-generation",
-            model=model_id,
-            model_kwargs={"torch_dtype": torch.bfloat16},
-            device_map="auto",
-            max_new_tokens=256,
-            batch_size=batch_size,
-            num_return_sequences=1,
-            return_full_text=False,
-        )
-        self.pipeline.tokenizer.pad_token_id = self.pipeline.tokenizer.eos_token_id
-        self.pipeline.tokenizer.padding_side = "left"
-
-    def get_response(self, prompts: list[str]):
-        """
-        Generate responses for a list of prompts using the local language model.
-
-        Args:
-            prompts (list[str]): A list of input prompts.
-
-        Returns:
-            list[str]: A list of generated responses corresponding to the input prompts.
-
-        Note:
-            This method uses torch.no_grad() for inference to reduce memory usage.
-            It handles both single and batch inputs, ensuring consistent output format.
-        """
-        with torch.no_grad():
-            response = self.pipeline(prompts, pad_token_id=self.pipeline.tokenizer.eos_token_id)
-
-        if len(response) != 1:
-            response = [r[0] if isinstance(r, list) else r for r in response]
-
-        response = [r["generated_text"] for r in response]
-        return response
-
-    def __del__(self):
-        try:
-            del self.pipeline
-            torch.cuda.empty_cache()
-        except Exception as e:
-            logger.warning(f"Error during LocalLLM cleanup: {e}")
-
- - - -
- - - - - - - - - -
- - -

- __init__(model_id, batch_size=8) - -

- - -
- -

Initialize the LocalLLM with a specific model.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
model_id - str - -
-

The identifier of the model to use (e.g., "gpt2", "facebook/opt-1.3b").

-
-
- required -
batch_size - int - -
-

The batch size for text generation. Defaults to 8.

-
-
- 8 -
- - -
- Note -

This method sets up a text generation pipeline with bfloat16 precision, -automatic device mapping, and specific generation parameters.

-
-
- Source code in promptolution\llms\local_llm.py -
def __init__(self, model_id: str, batch_size=8):
-    """
-    Initialize the LocalLLM with a specific model.
-
-    Args:
-        model_id (str): The identifier of the model to use (e.g., "gpt2", "facebook/opt-1.3b").
-        batch_size (int, optional): The batch size for text generation. Defaults to 8.
-
-    Note:
-        This method sets up a text generation pipeline with bfloat16 precision,
-        automatic device mapping, and specific generation parameters.
-    """
-    self.pipeline = transformers.pipeline(
-        "text-generation",
-        model=model_id,
-        model_kwargs={"torch_dtype": torch.bfloat16},
-        device_map="auto",
-        max_new_tokens=256,
-        batch_size=batch_size,
-        num_return_sequences=1,
-        return_full_text=False,
-    )
-    self.pipeline.tokenizer.pad_token_id = self.pipeline.tokenizer.eos_token_id
-    self.pipeline.tokenizer.padding_side = "left"
-
-
- -
- -
- - -

- get_response(prompts) - -

- - -
- -

Generate responses for a list of prompts using the local language model.

- - -

Parameters:

- - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompts - list[str] - -
-

A list of input prompts.

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- -
-

list[str]: A list of generated responses corresponding to the input prompts.

-
-
- - -
- Note -

This method uses torch.no_grad() for inference to reduce memory usage. -It handles both single and batch inputs, ensuring consistent output format.

-
-
- Source code in promptolution\llms\local_llm.py -
def get_response(self, prompts: list[str]):
-    """
-    Generate responses for a list of prompts using the local language model.
-
-    Args:
-        prompts (list[str]): A list of input prompts.
-
-    Returns:
-        list[str]: A list of generated responses corresponding to the input prompts.
-
-    Note:
-        This method uses torch.no_grad() for inference to reduce memory usage.
-        It handles both single and batch inputs, ensuring consistent output format.
-    """
-    with torch.no_grad():
-        response = self.pipeline(prompts, pad_token_id=self.pipeline.tokenizer.eos_token_id)
-
-    if len(response) != 1:
-        response = [r[0] if isinstance(r, list) else r for r in response]
-
-    response = [r["generated_text"] for r in response]
-    return response
-
-
- -
- - - -
- -
- -
- - - - -
- -
- -
- - -
- -
- -

API LLM

- - -
- - - - -
- - - -
- - - - - - - - -
- - - -

- APILLM - - -

- - -
- - -

A class to interface with various language models through their respective APIs.

-

This class supports Claude (Anthropic), GPT (OpenAI), and LLaMA (DeepInfra) models. -It handles API key management, model initialization, and provides methods for -both synchronous and asynchronous inference.

- - -

Attributes:

- - - - - - - - - - - - - - - -
NameTypeDescription
model - -
-

The initialized language model instance.

-
-
- - -

Methods:

- - - - - - - - - - - - - - - - - -
NameDescription
get_response -
-

Synchronously get responses for a list of prompts.

-
-
_get_response -
-

Asynchronously get responses for a list of prompts.

-
-
- -
- Source code in promptolution\llms\api_llm.py -
class APILLM:
-    """
-    A class to interface with various language models through their respective APIs.
-
-    This class supports Claude (Anthropic), GPT (OpenAI), and LLaMA (DeepInfra) models.
-    It handles API key management, model initialization, and provides methods for
-    both synchronous and asynchronous inference.
-
-    Attributes:
-        model: The initialized language model instance.
-
-    Methods:
-        get_response: Synchronously get responses for a list of prompts.
-        _get_response: Asynchronously get responses for a list of prompts.
-    """
-    def __init__(self, model_id: str):
-        """
-        Initialize the APILLM with a specific model.
-
-        Args:
-            model_id (str): Identifier for the model to use.
-
-        Raises:
-            ValueError: If an unknown model identifier is provided.
-        """
-        if "claude" in model_id:
-            ANTHROPIC_API_KEY = open("anthropictoken.txt", "r").read()
-            self.model = ChatAnthropic(model=model_id, api_key=ANTHROPIC_API_KEY)
-        elif "gpt" in model_id:
-            OPENAI_API_KEY = open("openaitoken.txt", "r").read()
-            self.model = ChatOpenAI(model=model_id, api_key=OPENAI_API_KEY)
-        elif "llama" in model_id:
-            DEEPINFRA_API_KEY = open("deepinfratoken.txt", "r").read()
-            self.model = ChatDeepInfra(model_name=model_id, deepinfra_api_token=DEEPINFRA_API_KEY)
-        else:
-            raise ValueError(f"Unknown model: {model_id}")
-
-    def get_response(self, prompts: List[str]) -> List[str]:
-        """
-        Synchronously get responses for a list of prompts.
-
-        This method includes retry logic for handling connection errors and rate limits.
-
-        Args:
-            prompts (list[str]): List of input prompts.
-
-        Returns:
-            list[str]: List of model responses.
-
-        Raises:
-            requests.exceptions.ConnectionError: If max retries are exceeded.
-        """
-        max_retries = 100
-        delay = 3
-        attempts = 0
-
-        while attempts < max_retries:
-            try:
-                responses = asyncio.run(self._get_response(prompts))
-                return responses
-            except requests.exceptions.ConnectionError as e:
-                attempts += 1
-                logger.critical(
-                    f"Connection error: {e}. Attempt {attempts}/{max_retries}. Retrying in {delay} seconds..."
-                )
-                time.sleep(delay)
-            except openai.RateLimitError as e:
-                attempts += 1
-                logger.critical(
-                    f"Rate limit error: {e}. Attempt {attempts}/{max_retries}. Retrying in {delay} seconds..."
-                )
-                time.sleep(delay)
-
-        # If the loop exits, it means max retries were reached
-        raise requests.exceptions.ConnectionError("Max retries exceeded. Connection could not be established.")
-
-    async def _get_response(
-        self, prompts: list[str], max_concurrent_calls=200
-    ) -> list[str]:  
-        """
-        Asynchronously get responses for a list of prompts.
-
-        This method uses a semaphore to limit the number of concurrent API calls.
-
-        Args:
-            prompts (list[str]): List of input prompts.
-            max_concurrent_calls (int): Maximum number of concurrent API calls allowed.
-
-        Returns:
-            list[str]: List of model responses.
-        """
-        semaphore = asyncio.Semaphore(max_concurrent_calls)  # Limit the number of concurrent calls
-        tasks = []
-
-        for prompt in prompts:
-            tasks.append(invoke_model(prompt, self.model, semaphore))
-
-        responses = await asyncio.gather(*tasks)
-        return responses
-
- - - -
- - - - - - - - - -
- - -

- __init__(model_id) - -

- - -
- -

Initialize the APILLM with a specific model.

- - -

Parameters:

- - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
model_id - str - -
-

Identifier for the model to use.

-
-
- required -
- - -

Raises:

- - - - - - - - - - - - - -
TypeDescription
- ValueError - -
-

If an unknown model identifier is provided.

-
-
- -
- Source code in promptolution\llms\api_llm.py -
def __init__(self, model_id: str):
-    """
-    Initialize the APILLM with a specific model.
-
-    Args:
-        model_id (str): Identifier for the model to use.
-
-    Raises:
-        ValueError: If an unknown model identifier is provided.
-    """
-    if "claude" in model_id:
-        ANTHROPIC_API_KEY = open("anthropictoken.txt", "r").read()
-        self.model = ChatAnthropic(model=model_id, api_key=ANTHROPIC_API_KEY)
-    elif "gpt" in model_id:
-        OPENAI_API_KEY = open("openaitoken.txt", "r").read()
-        self.model = ChatOpenAI(model=model_id, api_key=OPENAI_API_KEY)
-    elif "llama" in model_id:
-        DEEPINFRA_API_KEY = open("deepinfratoken.txt", "r").read()
-        self.model = ChatDeepInfra(model_name=model_id, deepinfra_api_token=DEEPINFRA_API_KEY)
-    else:
-        raise ValueError(f"Unknown model: {model_id}")
-
-
- -
- -
- - -

- get_response(prompts) - -

- - -
- -

Synchronously get responses for a list of prompts.

-

This method includes retry logic for handling connection errors and rate limits.

- - -

Parameters:

- - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompts - list[str] - -
-

List of input prompts.

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- List[str] - -
-

list[str]: List of model responses.

-
-
- - -

Raises:

- - - - - - - - - - - - - -
TypeDescription
- ConnectionError - -
-

If max retries are exceeded.

-
-
- -
- Source code in promptolution\llms\api_llm.py -
def get_response(self, prompts: List[str]) -> List[str]:
-    """
-    Synchronously get responses for a list of prompts.
-
-    This method includes retry logic for handling connection errors and rate limits.
-
-    Args:
-        prompts (list[str]): List of input prompts.
-
-    Returns:
-        list[str]: List of model responses.
-
-    Raises:
-        requests.exceptions.ConnectionError: If max retries are exceeded.
-    """
-    max_retries = 100
-    delay = 3
-    attempts = 0
-
-    while attempts < max_retries:
-        try:
-            responses = asyncio.run(self._get_response(prompts))
-            return responses
-        except requests.exceptions.ConnectionError as e:
-            attempts += 1
-            logger.critical(
-                f"Connection error: {e}. Attempt {attempts}/{max_retries}. Retrying in {delay} seconds..."
-            )
-            time.sleep(delay)
-        except openai.RateLimitError as e:
-            attempts += 1
-            logger.critical(
-                f"Rate limit error: {e}. Attempt {attempts}/{max_retries}. Retrying in {delay} seconds..."
-            )
-            time.sleep(delay)
-
-    # If the loop exits, it means max retries were reached
-    raise requests.exceptions.ConnectionError("Max retries exceeded. Connection could not be established.")
-
-
- -
- - - -
- -
- -
- - -
- - -

- invoke_model(prompt, model, semaphore) - - - async - - -

- - -
- -

Asynchronously invoke a language model with retry logic.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompt - str - -
-

The input prompt for the model.

-
-
- required -
model - -
-

The language model to invoke.

-
-
- required -
semaphore - Semaphore - -
-

Semaphore to limit concurrent calls.

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
Name TypeDescription
str - -
-

The model's response content.

-
-
- - -

Raises:

- - - - - - - - - - - - - -
TypeDescription
- ChatDeepInfraException - -
-

If all retry attempts fail.

-
-
- -
- Source code in promptolution\llms\api_llm.py -
async def invoke_model(prompt, model, semaphore):
-    """
-    Asynchronously invoke a language model with retry logic.
-
-    Args:
-        prompt (str): The input prompt for the model.
-        model: The language model to invoke.
-        semaphore (asyncio.Semaphore): Semaphore to limit concurrent calls.
-
-    Returns:
-        str: The model's response content.
-
-    Raises:
-        ChatDeepInfraException: If all retry attempts fail.
-    """
-    async with semaphore:
-        max_retries = 100
-        delay = 3
-        attempts = 0
-
-        while attempts < max_retries:
-            try:
-                response = await asyncio.to_thread(model.invoke, [HumanMessage(content=prompt)])
-                return response.content
-            except ChatDeepInfraException as e:
-                print(f"DeepInfra error: {e}. Attempt {attempts}/{max_retries}. Retrying in {delay} seconds...")
-                attempts += 1
-                time.sleep(delay)
-
-
- -
- - - -
- -
- -

Base LLM

- - -
- - - - -
- - - -
- - - - - - - - -
- - - -

- BaseLLM - - -

- - -
-

- Bases: ABC

- - -

Abstract base class for Language Models in the promptolution library.

-

This class defines the interface that all concrete LLM implementations should follow.

- - -

Methods:

- - - - - - - - - - - - - -
NameDescription
get_response -
-

An abstract method that should be implemented by subclasses - to generate responses for given prompts.

-
-
- -
- Source code in promptolution\llms\base_llm.py -
class BaseLLM(ABC):
-    """
-    Abstract base class for Language Models in the promptolution library.
-
-    This class defines the interface that all concrete LLM implementations should follow.
-
-    Methods:
-        get_response: An abstract method that should be implemented by subclasses
-                      to generate responses for given prompts.
-    """
-    def __init__(self, *args, **kwargs):
-        pass
-
-    @abstractmethod
-    def get_response(self, prompts: List[str]) -> List[str]:
-        """
-        Generate responses for the given prompts.
-
-        This method should be implemented by subclasses to define how
-        the LLM generates responses.
-
-        Args:
-            prompts (List[str]): A list of input prompts.
-
-        Returns:
-            List[str]: A list of generated responses corresponding to the input prompts.
-        """
-        pass
-
- - - -
- - - - - - - - - -
- - -

- get_response(prompts) - - - abstractmethod - - -

- - -
- -

Generate responses for the given prompts.

-

This method should be implemented by subclasses to define how -the LLM generates responses.

- - -

Parameters:

- - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompts - List[str] - -
-

A list of input prompts.

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- List[str] - -
-

List[str]: A list of generated responses corresponding to the input prompts.

-
-
- -
- Source code in promptolution\llms\base_llm.py -
@abstractmethod
-def get_response(self, prompts: List[str]) -> List[str]:
-    """
-    Generate responses for the given prompts.
-
-    This method should be implemented by subclasses to define how
-    the LLM generates responses.
-
-    Args:
-        prompts (List[str]): A list of input prompts.
-
-    Returns:
-        List[str]: A list of generated responses corresponding to the input prompts.
-    """
-    pass
-
-
- -
- - - -
- -
- -
- -
- - - -

- DummyLLM - - -

- - -
-

- Bases: BaseLLM

- - -

A dummy implementation of the BaseLLM for testing purposes.

-

This class generates random responses for given prompts, simulating -the behavior of a language model without actually performing any -complex natural language processing.

- -
- Source code in promptolution\llms\base_llm.py -
class DummyLLM(BaseLLM):
-    """
-    A dummy implementation of the BaseLLM for testing purposes.
-
-    This class generates random responses for given prompts, simulating
-    the behavior of a language model without actually performing any
-    complex natural language processing.
-    """
-    def __init__(self, *args, **kwargs):
-        pass
-
-    def get_response(self, prompts: str) -> str:
-        """
-        Generate random responses for the given prompts.
-
-        This method creates silly, random responses enclosed in <prompt> tags.
-        It's designed for testing and demonstration purposes.
-
-        Args:
-            prompts (str or List[str]): Input prompt(s). If a single string is provided,
-                                        it's converted to a list containing that string.
-
-        Returns:
-            List[str]: A list of randomly generated responses, one for each input prompt.
-        """
-        if isinstance(prompts, str):
-            prompts = [prompts]
-        results = []
-        for _ in prompts:
-            r = np.random.rand()
-            if r < 0.3:
-                results += [f"Joooo wazzuppp <prompt>hier gehts los {r} </prompt>"]
-            if 0.3 <= r < 0.6:
-                results += [f"was das hier? <prompt>peter lustig{r}</prompt>"]
-            else:
-                results += [f"hier ist ein <prompt>test{r}</prompt>"]
-
-        return results
-
- - - -
- - - - - - - - - -
- - -

- get_response(prompts) - -

- - -
- -

Generate random responses for the given prompts.

-

This method creates silly, random responses enclosed in tags. -It's designed for testing and demonstration purposes.

- - -

Parameters:

- - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompts - str or List[str] - -
-

Input prompt(s). If a single string is provided, - it's converted to a list containing that string.

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- str - -
-

List[str]: A list of randomly generated responses, one for each input prompt.

-
-
- -
- Source code in promptolution\llms\base_llm.py -
def get_response(self, prompts: str) -> str:
-    """
-    Generate random responses for the given prompts.
-
-    This method creates silly, random responses enclosed in <prompt> tags.
-    It's designed for testing and demonstration purposes.
-
-    Args:
-        prompts (str or List[str]): Input prompt(s). If a single string is provided,
-                                    it's converted to a list containing that string.
-
-    Returns:
-        List[str]: A list of randomly generated responses, one for each input prompt.
-    """
-    if isinstance(prompts, str):
-        prompts = [prompts]
-    results = []
-    for _ in prompts:
-        r = np.random.rand()
-        if r < 0.3:
-            results += [f"Joooo wazzuppp <prompt>hier gehts los {r} </prompt>"]
-        if 0.3 <= r < 0.6:
-            results += [f"was das hier? <prompt>peter lustig{r}</prompt>"]
-        else:
-            results += [f"hier ist ein <prompt>test{r}</prompt>"]
-
-    return results
-
-
- -
- - - -
- -
- -
- - - - -
- -
- -

DeepInfra LLM

- - -
- - - - -
- - - -
- - - - - - - - -
- - - -

- ChatDeepInfra - - -

- - -
-

- Bases: BaseChatModel

- - -

A chat model that uses the DeepInfra API.

- -
- Source code in promptolution\llms\deepinfra.py -
class ChatDeepInfra(BaseChatModel):
-    """A chat model that uses the DeepInfra API."""
-
-    # client: Any  #: :meta private:
-    model_name: str = Field(alias="model")
-    """The model name to use for the chat model."""
-    deepinfra_api_token: Optional[str] = None
-    request_timeout: Optional[float] = Field(default=None, alias="timeout")
-    temperature: Optional[float] = 1
-    model_kwargs: Dict[str, Any] = Field(default_factory=dict)
-    """Run inference with this temperature. Must be in the closed
-       interval [0.0, 1.0]."""
-    top_p: Optional[float] = None
-    """Decode using nucleus sampling: consider the smallest set of tokens whose
-       probability sum is at least top_p. Must be in the closed interval [0.0, 1.0]."""
-    top_k: Optional[int] = None
-    """Decode using top-k sampling: consider the set of top_k most probable tokens.
-       Must be positive."""
-    n: int = 1
-    """Number of chat completions to generate for each prompt. Note that the API may
-       not return the full n completions if duplicates are generated."""
-    max_tokens: int = 256
-    streaming: bool = False
-    max_retries: int = 1
-
-    def __init__(self, model_name: str, **kwargs: Any):
-        super().__init__(model=model_name, **kwargs)
-
-    @property
-    def _default_params(self) -> Dict[str, Any]:
-        """Get the default parameters for calling OpenAI API."""
-        return {
-            "model": self.model_name,
-            "max_tokens": self.max_tokens,
-            "stream": self.streaming,
-            "n": self.n,
-            "temperature": self.temperature,
-            "request_timeout": self.request_timeout,
-            **self.model_kwargs,
-        }
-
-    @property
-    def _client_params(self) -> Dict[str, Any]:
-        """Get the parameters used for the openai client."""
-        return {**self._default_params}
-
-    def completion_with_retry(self, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any) -> Any:
-        """Use tenacity to retry the completion call."""
-        retry_decorator = _create_retry_decorator(self, run_manager=run_manager)
-
-        @retry_decorator
-        def _completion_with_retry(**kwargs: Any) -> Any:
-            try:
-                request_timeout = kwargs.pop("request_timeout")
-                request = Requests(headers=self._headers())
-                response = request.post(url=self._url(), data=self._body(kwargs), timeout=request_timeout)
-                self._handle_status(response.status_code, response.text)
-                return response
-            except Exception as e:
-                # import pdb; pdb.set_trace()
-                print("EX", e)  # noqa: T201
-                raise
-
-        return _completion_with_retry(**kwargs)
-
-    async def acompletion_with_retry(
-        self,
-        run_manager: Optional[AsyncCallbackManagerForLLMRun] = None,
-        **kwargs: Any,
-    ) -> Any:
-        """Use tenacity to retry the async completion call."""
-        retry_decorator = _create_retry_decorator(self, run_manager=run_manager)
-
-        @retry_decorator
-        async def _completion_with_retry(**kwargs: Any) -> Any:
-            try:
-                request_timeout = kwargs.pop("request_timeout")
-                request = Requests(headers=self._headers())
-                async with request.apost(url=self._url(), data=self._body(kwargs), timeout=request_timeout) as response:
-                    self._handle_status(response.status, response.text)
-                    return await response.json()
-            except Exception as e:
-                print("EX", e)  # noqa: T201
-                raise
-
-        return await _completion_with_retry(**kwargs)
-
-    @root_validator(pre=True)
-    def init_defaults(cls, values: Dict) -> Dict:
-        """Validate api key, python package exists, temperature, top_p, and top_k."""
-        # For compatibility with LiteLLM
-        api_key = get_from_dict_or_env(
-            values,
-            "deepinfra_api_key",
-            "DEEPINFRA_API_KEY",
-            default="",
-        )
-        values["deepinfra_api_token"] = get_from_dict_or_env(
-            values,
-            "deepinfra_api_token",
-            "DEEPINFRA_API_TOKEN",
-            default=api_key,
-        )
-        # set model id
-        # values["model_name"] = get_from_dict_or_env(
-        #     values,
-        #     "model_name",
-        #     "DEEPINFRA_MODEL_NAME",
-        #     default="",
-        # )
-        return values
-
-    @root_validator(pre=False, skip_on_failure=True)
-    def validate_environment(cls, values: Dict) -> Dict:
-        if values["temperature"] is not None and not 0 <= values["temperature"] <= 1:
-            raise ValueError("temperature must be in the range [0.0, 1.0]")
-
-        if values["top_p"] is not None and not 0 <= values["top_p"] <= 1:
-            raise ValueError("top_p must be in the range [0.0, 1.0]")
-
-        if values["top_k"] is not None and values["top_k"] <= 0:
-            raise ValueError("top_k must be positive")
-
-        return values
-
-    def _generate(
-        self,
-        messages: List[BaseMessage],
-        stop: Optional[List[str]] = None,
-        run_manager: Optional[CallbackManagerForLLMRun] = None,
-        stream: Optional[bool] = None,
-        **kwargs: Any,
-    ) -> ChatResult:
-        should_stream = stream if stream is not None else self.streaming
-        if should_stream:
-            stream_iter = self._stream(messages, stop=stop, run_manager=run_manager, **kwargs)
-            return generate_from_stream(stream_iter)
-
-        message_dicts, params = self._create_message_dicts(messages, stop)
-        params = {**params, **kwargs}
-        response = self.completion_with_retry(messages=message_dicts, run_manager=run_manager, **params)
-        return self._create_chat_result(response.json())
-
-    def _create_chat_result(self, response: Mapping[str, Any]) -> ChatResult:
-        generations = []
-        for res in response["choices"]:
-            message = _convert_dict_to_message(res["message"])
-            gen = ChatGeneration(
-                message=message,
-                generation_info=dict(finish_reason=res.get("finish_reason")),
-            )
-            generations.append(gen)
-        token_usage = response.get("usage", {})
-        llm_output = {"token_usage": token_usage, "model": self.model_name}
-        res = ChatResult(generations=generations, llm_output=llm_output)
-        return res
-
-    def _create_message_dicts(
-        self, messages: List[BaseMessage], stop: Optional[List[str]]
-    ) -> Tuple[List[Dict[str, Any]], Dict[str, Any]]:
-        params = self._client_params
-        if stop is not None:
-            if "stop" in params:
-                raise ValueError("`stop` found in both the input and default params.")
-            params["stop"] = stop
-        message_dicts = [_convert_message_to_dict(m) for m in messages]
-        return message_dicts, params
-
-    def _stream(
-        self,
-        messages: List[BaseMessage],
-        stop: Optional[List[str]] = None,
-        run_manager: Optional[CallbackManagerForLLMRun] = None,
-        **kwargs: Any,
-    ) -> Iterator[ChatGenerationChunk]:
-        message_dicts, params = self._create_message_dicts(messages, stop)
-        params = {**params, **kwargs, "stream": True}
-
-        response = self.completion_with_retry(messages=message_dicts, run_manager=run_manager, **params)
-        for line in _parse_stream(response.iter_lines()):
-            chunk = _handle_sse_line(line)
-            if chunk:
-                cg_chunk = ChatGenerationChunk(message=chunk, generation_info=None)
-                if run_manager:
-                    run_manager.on_llm_new_token(str(chunk.content), chunk=cg_chunk)
-                yield cg_chunk
-
-    async def _astream(
-        self,
-        messages: List[BaseMessage],
-        stop: Optional[List[str]] = None,
-        run_manager: Optional[AsyncCallbackManagerForLLMRun] = None,
-        **kwargs: Any,
-    ) -> AsyncIterator[ChatGenerationChunk]:
-        message_dicts, params = self._create_message_dicts(messages, stop)
-        params = {"messages": message_dicts, "stream": True, **params, **kwargs}
-
-        request_timeout = params.pop("request_timeout")
-        request = Requests(headers=self._headers())
-        async with request.apost(url=self._url(), data=self._body(params), timeout=request_timeout) as response:
-            async for line in _parse_stream_async(response.content):
-                chunk = _handle_sse_line(line)
-                if chunk:
-                    cg_chunk = ChatGenerationChunk(message=chunk, generation_info=None)
-                    if run_manager:
-                        await run_manager.on_llm_new_token(str(chunk.content), chunk=cg_chunk)
-                    yield cg_chunk
-
-    async def _agenerate(
-        self,
-        messages: List[BaseMessage],
-        stop: Optional[List[str]] = None,
-        run_manager: Optional[AsyncCallbackManagerForLLMRun] = None,
-        stream: Optional[bool] = None,
-        **kwargs: Any,
-    ) -> ChatResult:
-        should_stream = stream if stream is not None else self.streaming
-        if should_stream:
-            stream_iter = self._astream(messages, stop=stop, run_manager=run_manager, **kwargs)
-            return await agenerate_from_stream(stream_iter)
-
-        message_dicts, params = self._create_message_dicts(messages, stop)
-        params = {"messages": message_dicts, **params, **kwargs}
-
-        res = await self.acompletion_with_retry(run_manager=run_manager, **params)
-        return self._create_chat_result(res)
-
-    @property
-    def _identifying_params(self) -> Dict[str, Any]:
-        """Get the identifying parameters."""
-        return {
-            "model": self.model_name,
-            "temperature": self.temperature,
-            "top_p": self.top_p,
-            "top_k": self.top_k,
-            "n": self.n,
-        }
-
-    @property
-    def _llm_type(self) -> str:
-        return "deepinfra-chat"
-
-    def _handle_status(self, code: int, text: Any) -> None:
-        if code >= 500:
-            raise ChatDeepInfraException(f"DeepInfra Server: Error {code}")
-        elif code >= 400:
-            raise ValueError(f"DeepInfra received an invalid payload: {text}")
-        elif code != 200:
-            raise Exception(f"DeepInfra returned an unexpected response with status " f"{code}: {text}")
-
-    def _url(self) -> str:
-        return "https://stage.api.deepinfra.com/v1/openai/chat/completions"
-
-    def _headers(self) -> Dict:
-        return {
-            "Authorization": f"bearer {self.deepinfra_api_token}",
-            "Content-Type": "application/json",
-        }
-
-    def _body(self, kwargs: Any) -> Dict:
-        return kwargs
-
-    def bind_tools(
-        self,
-        tools: Sequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]],
-        **kwargs: Any,
-    ) -> Runnable[LanguageModelInput, BaseMessage]:
-        """Bind tool-like objects to this chat model.
-
-        Assumes model is compatible with OpenAI tool-calling API.
-
-        Args:
-            tools: A list of tool definitions to bind to this chat model.
-                Can be  a dictionary, pydantic model, callable, or BaseTool. Pydantic
-                models, callables, and BaseTools will be automatically converted to
-                their schema dictionary representation.
-            **kwargs: Any additional parameters to pass to the
-                :class:`~langchain.runnable.Runnable` constructor.
-        """
-
-        formatted_tools = [convert_to_openai_tool(tool) for tool in tools]
-        return super().bind(tools=formatted_tools, **kwargs)
-
- - - -
- - - - - - - -
- - - -

- model_kwargs: Dict[str, Any] = Field(default_factory=dict) - - - class-attribute - instance-attribute - - -

- - -
- -

Run inference with this temperature. Must be in the closed -interval [0.0, 1.0].

-
- -
- -
- - - -

- model_name: str = Field(alias='model') - - - class-attribute - instance-attribute - - -

- - -
- -

The model name to use for the chat model.

-
- -
- -
- - - -

- n: int = 1 - - - class-attribute - instance-attribute - - -

- - -
- -

Number of chat completions to generate for each prompt. Note that the API may -not return the full n completions if duplicates are generated.

-
- -
- -
- - - -

- top_k: Optional[int] = None - - - class-attribute - instance-attribute - - -

- - -
- -

Decode using top-k sampling: consider the set of top_k most probable tokens. -Must be positive.

-
- -
- -
- - - -

- top_p: Optional[float] = None - - - class-attribute - instance-attribute - - -

- - -
- -

Decode using nucleus sampling: consider the smallest set of tokens whose -probability sum is at least top_p. Must be in the closed interval [0.0, 1.0].

-
- -
- - - -
- - -

- acompletion_with_retry(run_manager=None, **kwargs) - - - async - - -

- - -
- -

Use tenacity to retry the async completion call.

- -
- Source code in promptolution\llms\deepinfra.py -
async def acompletion_with_retry(
-    self,
-    run_manager: Optional[AsyncCallbackManagerForLLMRun] = None,
-    **kwargs: Any,
-) -> Any:
-    """Use tenacity to retry the async completion call."""
-    retry_decorator = _create_retry_decorator(self, run_manager=run_manager)
-
-    @retry_decorator
-    async def _completion_with_retry(**kwargs: Any) -> Any:
-        try:
-            request_timeout = kwargs.pop("request_timeout")
-            request = Requests(headers=self._headers())
-            async with request.apost(url=self._url(), data=self._body(kwargs), timeout=request_timeout) as response:
-                self._handle_status(response.status, response.text)
-                return await response.json()
-        except Exception as e:
-            print("EX", e)  # noqa: T201
-            raise
-
-    return await _completion_with_retry(**kwargs)
-
-
- -
- -
- - -

- bind_tools(tools, **kwargs) - -

- - -
- -

Bind tool-like objects to this chat model.

-

Assumes model is compatible with OpenAI tool-calling API.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
tools - Sequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]] - -
-

A list of tool definitions to bind to this chat model. -Can be a dictionary, pydantic model, callable, or BaseTool. Pydantic -models, callables, and BaseTools will be automatically converted to -their schema dictionary representation.

-
-
- required -
**kwargs - Any - -
-

Any additional parameters to pass to the -:class:~langchain.runnable.Runnable constructor.

-
-
- {} -
- -
- Source code in promptolution\llms\deepinfra.py -
def bind_tools(
-    self,
-    tools: Sequence[Union[Dict[str, Any], Type[BaseModel], Callable, BaseTool]],
-    **kwargs: Any,
-) -> Runnable[LanguageModelInput, BaseMessage]:
-    """Bind tool-like objects to this chat model.
-
-    Assumes model is compatible with OpenAI tool-calling API.
-
-    Args:
-        tools: A list of tool definitions to bind to this chat model.
-            Can be  a dictionary, pydantic model, callable, or BaseTool. Pydantic
-            models, callables, and BaseTools will be automatically converted to
-            their schema dictionary representation.
-        **kwargs: Any additional parameters to pass to the
-            :class:`~langchain.runnable.Runnable` constructor.
-    """
-
-    formatted_tools = [convert_to_openai_tool(tool) for tool in tools]
-    return super().bind(tools=formatted_tools, **kwargs)
-
-
- -
- -
- - -

- completion_with_retry(run_manager=None, **kwargs) - -

- - -
- -

Use tenacity to retry the completion call.

- -
- Source code in promptolution\llms\deepinfra.py -
def completion_with_retry(self, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any) -> Any:
-    """Use tenacity to retry the completion call."""
-    retry_decorator = _create_retry_decorator(self, run_manager=run_manager)
-
-    @retry_decorator
-    def _completion_with_retry(**kwargs: Any) -> Any:
-        try:
-            request_timeout = kwargs.pop("request_timeout")
-            request = Requests(headers=self._headers())
-            response = request.post(url=self._url(), data=self._body(kwargs), timeout=request_timeout)
-            self._handle_status(response.status_code, response.text)
-            return response
-        except Exception as e:
-            # import pdb; pdb.set_trace()
-            print("EX", e)  # noqa: T201
-            raise
-
-    return _completion_with_retry(**kwargs)
-
-
- -
- -
- - -

- init_defaults(values) - -

- - -
- -

Validate api key, python package exists, temperature, top_p, and top_k.

- -
- Source code in promptolution\llms\deepinfra.py -
@root_validator(pre=True)
-def init_defaults(cls, values: Dict) -> Dict:
-    """Validate api key, python package exists, temperature, top_p, and top_k."""
-    # For compatibility with LiteLLM
-    api_key = get_from_dict_or_env(
-        values,
-        "deepinfra_api_key",
-        "DEEPINFRA_API_KEY",
-        default="",
-    )
-    values["deepinfra_api_token"] = get_from_dict_or_env(
-        values,
-        "deepinfra_api_token",
-        "DEEPINFRA_API_TOKEN",
-        default=api_key,
-    )
-    # set model id
-    # values["model_name"] = get_from_dict_or_env(
-    #     values,
-    #     "model_name",
-    #     "DEEPINFRA_MODEL_NAME",
-    #     default="",
-    # )
-    return values
-
-
- -
- - - -
- -
- -
- - - - -
- -
- -

Local LLM

- - -
- - - - -
- - - -
- - - - - - - - -
- - - -

- LocalLLM - - -

- - -
- - -

A class for running language models locally using the Hugging Face Transformers library.

-

This class sets up a text generation pipeline with specified model parameters -and provides a method to generate responses for given prompts.

- - -

Attributes:

- - - - - - - - - - - - - - - -
NameTypeDescription
pipeline - Pipeline - -
-

The text generation pipeline.

-
-
- - -

Methods:

- - - - - - - - - - - - - -
NameDescription
get_response -
-

Generate responses for a list of prompts.

-
-
- -
- Source code in promptolution\llms\local_llm.py -
class LocalLLM:
-    """
-    A class for running language models locally using the Hugging Face Transformers library.
-
-    This class sets up a text generation pipeline with specified model parameters
-    and provides a method to generate responses for given prompts.
-
-    Attributes:
-        pipeline (transformers.Pipeline): The text generation pipeline.
-
-    Methods:
-        get_response: Generate responses for a list of prompts.
-    """
-    def __init__(self, model_id: str, batch_size=8):
-        """
-        Initialize the LocalLLM with a specific model.
-
-        Args:
-            model_id (str): The identifier of the model to use (e.g., "gpt2", "facebook/opt-1.3b").
-            batch_size (int, optional): The batch size for text generation. Defaults to 8.
-
-        Note:
-            This method sets up a text generation pipeline with bfloat16 precision,
-            automatic device mapping, and specific generation parameters.
-        """
-        self.pipeline = transformers.pipeline(
-            "text-generation",
-            model=model_id,
-            model_kwargs={"torch_dtype": torch.bfloat16},
-            device_map="auto",
-            max_new_tokens=256,
-            batch_size=batch_size,
-            num_return_sequences=1,
-            return_full_text=False,
-        )
-        self.pipeline.tokenizer.pad_token_id = self.pipeline.tokenizer.eos_token_id
-        self.pipeline.tokenizer.padding_side = "left"
-
-    def get_response(self, prompts: list[str]):
-        """
-        Generate responses for a list of prompts using the local language model.
-
-        Args:
-            prompts (list[str]): A list of input prompts.
-
-        Returns:
-            list[str]: A list of generated responses corresponding to the input prompts.
-
-        Note:
-            This method uses torch.no_grad() for inference to reduce memory usage.
-            It handles both single and batch inputs, ensuring consistent output format.
-        """
-        with torch.no_grad():
-            response = self.pipeline(prompts, pad_token_id=self.pipeline.tokenizer.eos_token_id)
-
-        if len(response) != 1:
-            response = [r[0] if isinstance(r, list) else r for r in response]
-
-        response = [r["generated_text"] for r in response]
-        return response
-
-    def __del__(self):
-        try:
-            del self.pipeline
-            torch.cuda.empty_cache()
-        except Exception as e:
-            logger.warning(f"Error during LocalLLM cleanup: {e}")
-
- - - -
- - - - - - - - - -
- - -

- __init__(model_id, batch_size=8) - -

- - -
- -

Initialize the LocalLLM with a specific model.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
model_id - str - -
-

The identifier of the model to use (e.g., "gpt2", "facebook/opt-1.3b").

-
-
- required -
batch_size - int - -
-

The batch size for text generation. Defaults to 8.

-
-
- 8 -
- - -
- Note -

This method sets up a text generation pipeline with bfloat16 precision, -automatic device mapping, and specific generation parameters.

-
-
- Source code in promptolution\llms\local_llm.py -
def __init__(self, model_id: str, batch_size=8):
-    """
-    Initialize the LocalLLM with a specific model.
-
-    Args:
-        model_id (str): The identifier of the model to use (e.g., "gpt2", "facebook/opt-1.3b").
-        batch_size (int, optional): The batch size for text generation. Defaults to 8.
-
-    Note:
-        This method sets up a text generation pipeline with bfloat16 precision,
-        automatic device mapping, and specific generation parameters.
-    """
-    self.pipeline = transformers.pipeline(
-        "text-generation",
-        model=model_id,
-        model_kwargs={"torch_dtype": torch.bfloat16},
-        device_map="auto",
-        max_new_tokens=256,
-        batch_size=batch_size,
-        num_return_sequences=1,
-        return_full_text=False,
-    )
-    self.pipeline.tokenizer.pad_token_id = self.pipeline.tokenizer.eos_token_id
-    self.pipeline.tokenizer.padding_side = "left"
-
-
- -
- -
- - -

- get_response(prompts) - -

- - -
- -

Generate responses for a list of prompts using the local language model.

- - -

Parameters:

- - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompts - list[str] - -
-

A list of input prompts.

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- -
-

list[str]: A list of generated responses corresponding to the input prompts.

-
-
- - -
- Note -

This method uses torch.no_grad() for inference to reduce memory usage. -It handles both single and batch inputs, ensuring consistent output format.

-
-
- Source code in promptolution\llms\local_llm.py -
def get_response(self, prompts: list[str]):
-    """
-    Generate responses for a list of prompts using the local language model.
-
-    Args:
-        prompts (list[str]): A list of input prompts.
-
-    Returns:
-        list[str]: A list of generated responses corresponding to the input prompts.
-
-    Note:
-        This method uses torch.no_grad() for inference to reduce memory usage.
-        It handles both single and batch inputs, ensuring consistent output format.
-    """
-    with torch.no_grad():
-        response = self.pipeline(prompts, pad_token_id=self.pipeline.tokenizer.eos_token_id)
-
-    if len(response) != 1:
-        response = [r[0] if isinstance(r, list) else r for r in response]
-
-    response = [r["generated_text"] for r in response]
-    return response
-
-
- -
- - - -
- -
- -
- - - - -
- -
- -
-
-
- - - - - - - - - - - diff --git a/site/api/optimizers/index.html b/site/api/optimizers/index.html deleted file mode 100644 index 61c9dcc..0000000 --- a/site/api/optimizers/index.html +++ /dev/null @@ -1,3405 +0,0 @@ - - - - - - - - - - - Optimizers - Promptolution Documentation - - - - - - - - - - - - - - - - -
-
-
-
- -

Optimizers

-

This module contains various optimization algorithms for prompt tuning.

- - -
- - - - -
- - - -
- - - - - - - - - -
- - -

- get_optimizer(config, *args, **kwargs) - -

- - -
- -

Factory function to create and return an optimizer instance based on the provided configuration.

-

This function selects and instantiates the appropriate optimizer class based on the -'optimizer' field in the config object. It supports three types of optimizers: -'dummy', 'evopromptde', and 'evopromptga'.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
config - -
-

A configuration object that must have an 'optimizer' attribute. - For 'evopromptde', it should also have a 'donor_random' attribute. - For 'evopromptga', it should also have a 'selection_mode' attribute.

-
-
- required -
*args - -
-

Variable length argument list passed to the optimizer constructor.

-
-
- () -
**kwargs - -
-

Arbitrary keyword arguments passed to the optimizer constructor.

-
-
- {} -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- -
-

An instance of the specified optimizer class.

-
-
- - -

Raises:

- - - - - - - - - - - - - -
TypeDescription
- ValueError - -
-

If an unknown optimizer type is specified in the config.

-
-
- -
- Source code in promptolution\optimizers\__init__.py -
def get_optimizer(config, *args, **kwargs):
-    """
-    Factory function to create and return an optimizer instance based on the provided configuration.
-
-    This function selects and instantiates the appropriate optimizer class based on the
-    'optimizer' field in the config object. It supports three types of optimizers:
-    'dummy', 'evopromptde', and 'evopromptga'.
-
-    Args:
-        config: A configuration object that must have an 'optimizer' attribute.
-                For 'evopromptde', it should also have a 'donor_random' attribute.
-                For 'evopromptga', it should also have a 'selection_mode' attribute.
-        *args: Variable length argument list passed to the optimizer constructor.
-        **kwargs: Arbitrary keyword arguments passed to the optimizer constructor.
-
-    Returns:
-        An instance of the specified optimizer class.
-
-    Raises:
-        ValueError: If an unknown optimizer type is specified in the config.
-    """
-    if config.optimizer == "dummy":
-        return DummyOptimizer(*args, **kwargs)
-    if config.optimizer == "evopromptde":
-        return EvoPromptDE(donor_random=config.donor_random, *args, **kwargs)
-    if config.optimizer == "evopromptga":
-        return EvoPromptGA(selection_mode=config.selection_mode, *args, **kwargs)
-    raise ValueError(f"Unknown optimizer: {config.optimizer}")
-
-
- -
- - -
- - - -

- base_optimizer - - -

- -
- - - -
- - - - - - - - -
- - - -

- BaseOptimizer - - -

- - -
-

- Bases: ABC

- - -

Abstract base class for prompt optimizers.

-

This class defines the basic structure and interface for prompt optimization algorithms. -Concrete optimizer implementations should inherit from this class and implement -the optimize method.

- - -

Attributes:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
prompts - List[str] - -
-

List of current prompts being optimized.

-
-
task - BaseTask - -
-

The task object used for evaluating prompts.

-
-
callbacks - List[Callable] - -
-

List of callback functions to be called during optimization.

-
-
predictor - -
-

The predictor used for prompt evaluation (if applicable).

-
-
- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
initial_prompts - List[str] - -
-

Initial set of prompts to start optimization with.

-
-
- required -
task - BaseTask - -
-

Task object for prompt evaluation.

-
-
- required -
callbacks - List[Callable] - -
-

List of callback functions. Defaults to an empty list.

-
-
- [] -
predictor - optional - -
-

Predictor for prompt evaluation. Defaults to None.

-
-
- None -
- -
- Source code in promptolution\optimizers\base_optimizer.py -
class BaseOptimizer(ABC):    
-    """
-    Abstract base class for prompt optimizers.
-
-    This class defines the basic structure and interface for prompt optimization algorithms.
-    Concrete optimizer implementations should inherit from this class and implement
-    the `optimize` method.
-
-    Attributes:
-        prompts (List[str]): List of current prompts being optimized.
-        task (BaseTask): The task object used for evaluating prompts.
-        callbacks (List[Callable]): List of callback functions to be called during optimization.
-        predictor: The predictor used for prompt evaluation (if applicable).
-
-    Args:
-        initial_prompts (List[str]): Initial set of prompts to start optimization with.
-        task (BaseTask): Task object for prompt evaluation.
-        callbacks (List[Callable], optional): List of callback functions. Defaults to an empty list.
-        predictor (optional): Predictor for prompt evaluation. Defaults to None.
-    """
-    def __init__(self, initial_prompts: list[str], task: BaseTask, callbacks: list[Callable] = [], predictor=None):
-        self.prompts = initial_prompts
-        self.task = task
-        self.callbacks = callbacks
-        self.predictor = predictor
-
-    @abstractmethod
-    def optimize(self, n_steps: int) -> List[str]:
-        """
-        Abstract method to perform the optimization process.
-
-        This method should be implemented by concrete optimizer classes to define
-        the specific optimization algorithm.
-
-        Args:
-            n_steps (int): Number of optimization steps to perform.
-
-        Returns:
-            List[str]: The optimized list of prompts after all steps.
-
-        Raises:
-            NotImplementedError: If not implemented by a concrete class.
-        """
-        raise NotImplementedError
-
-    def _on_step_end(self):
-        """
-        Call all registered callbacks at the end of each optimization step.
-        """
-        for callback in self.callbacks:
-            callback.on_step_end(self)
-
-    def _on_epoch_end(self):
-        """
-        Call all registered callbacks at the end of each optimization epoch.
-        """
-        for callback in self.callbacks:
-            callback.on_epoch_end(self)
-
-    def _on_train_end(self):
-        """
-        Call all registered callbacks at the end of the entire optimization process.
-        """
-        for callback in self.callbacks:
-            callback.on_train_end(self)
-
- - - -
- - - - - - - - - -
- - -

- optimize(n_steps) - - - abstractmethod - - -

- - -
- -

Abstract method to perform the optimization process.

-

This method should be implemented by concrete optimizer classes to define -the specific optimization algorithm.

- - -

Parameters:

- - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
n_steps - int - -
-

Number of optimization steps to perform.

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- List[str] - -
-

List[str]: The optimized list of prompts after all steps.

-
-
- - -

Raises:

- - - - - - - - - - - - - -
TypeDescription
- NotImplementedError - -
-

If not implemented by a concrete class.

-
-
- -
- Source code in promptolution\optimizers\base_optimizer.py -
@abstractmethod
-def optimize(self, n_steps: int) -> List[str]:
-    """
-    Abstract method to perform the optimization process.
-
-    This method should be implemented by concrete optimizer classes to define
-    the specific optimization algorithm.
-
-    Args:
-        n_steps (int): Number of optimization steps to perform.
-
-    Returns:
-        List[str]: The optimized list of prompts after all steps.
-
-    Raises:
-        NotImplementedError: If not implemented by a concrete class.
-    """
-    raise NotImplementedError
-
-
- -
- - - -
- -
- -
- -
- - - -

- DummyOptimizer - - -

- - -
-

- Bases: BaseOptimizer

- - -

A dummy optimizer that doesn't perform any actual optimization.

-

This optimizer simply returns the initial prompts without modification. -It's useful for testing or as a baseline comparison.

- - -

Attributes:

- - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
prompts - List[str] - -
-

List of prompts (unchanged from initialization).

-
-
callbacks - List[Callable] - -
-

Empty list of callbacks.

-
-
- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
initial_prompts - List[str] - -
-

Initial set of prompts.

-
-
- required -
*args - -
-

Variable length argument list (unused).

-
-
- () -
**kwargs - -
-

Arbitrary keyword arguments (unused).

-
-
- {} -
- -
- Source code in promptolution\optimizers\base_optimizer.py -
class DummyOptimizer(BaseOptimizer):
-    """
-    A dummy optimizer that doesn't perform any actual optimization.
-
-    This optimizer simply returns the initial prompts without modification.
-    It's useful for testing or as a baseline comparison.
-
-    Attributes:
-        prompts (List[str]): List of prompts (unchanged from initialization).
-        callbacks (List[Callable]): Empty list of callbacks.
-
-    Args:
-        initial_prompts (List[str]): Initial set of prompts.
-        *args: Variable length argument list (unused).
-        **kwargs: Arbitrary keyword arguments (unused).
-    """
-    def __init__(self, initial_prompts, *args, **kwargs):
-        self.callbacks = []
-        self.prompts = initial_prompts
-
-    def optimize(self, n_steps) -> list[str]:
-        """
-        Simulate an optimization process without actually modifying the prompts.
-
-        This method calls the callback methods to simulate a complete optimization
-        cycle, but returns the initial prompts unchanged.
-
-        Args:
-            n_steps (int): Number of optimization steps (unused in this implementation).
-
-        Returns:
-            List[str]: The original list of prompts, unchanged.
-        """
-        self._on_step_end()
-        self._on_epoch_end()
-        self._on_train_end()
-        return self.prompts
-
- - - -
- - - - - - - - - -
- - -

- optimize(n_steps) - -

- - -
- -

Simulate an optimization process without actually modifying the prompts.

-

This method calls the callback methods to simulate a complete optimization -cycle, but returns the initial prompts unchanged.

- - -

Parameters:

- - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
n_steps - int - -
-

Number of optimization steps (unused in this implementation).

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- list[str] - -
-

List[str]: The original list of prompts, unchanged.

-
-
- -
- Source code in promptolution\optimizers\base_optimizer.py -
def optimize(self, n_steps) -> list[str]:
-    """
-    Simulate an optimization process without actually modifying the prompts.
-
-    This method calls the callback methods to simulate a complete optimization
-    cycle, but returns the initial prompts unchanged.
-
-    Args:
-        n_steps (int): Number of optimization steps (unused in this implementation).
-
-    Returns:
-        List[str]: The original list of prompts, unchanged.
-    """
-    self._on_step_end()
-    self._on_epoch_end()
-    self._on_train_end()
-    return self.prompts
-
-
- -
- - - -
- -
- -
- - - - -
- -
- -
- -
- - - -

- evoprompt_de - - -

- -
- - - -
- - - - - - - - -
- - - -

- EvoPromptDE - - -

- - -
-

- Bases: BaseOptimizer

- - -

EvoPromptDE: Differential Evolution-based Prompt Optimizer

-

This class implements a differential evolution algorithm for optimizing prompts in large language models. -It is adapted from the paper "Connecting Large Language Models with Evolutionary Algorithms -Yields Powerful Prompt Optimizers" by Guo et al., 2023.

-

The optimizer uses a differential evolution strategy to generate new prompts from existing ones, -with an option to use the current best prompt as a donor.

- - -

Attributes:

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
prompt_template - str - -
-

Template for generating meta-prompts during evolution.

-
-
donor_random - bool - -
-

If False, uses the current best prompt as a donor; if True, uses a random prompt.

-
-
meta_llm - -
-

Language model used for generating child prompts from meta-prompts.

-
-
- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompt_template - str - -
-

Template for meta-prompts.

-
-
- required -
meta_llm - -
-

Language model for child prompt generation.

-
-
- required -
donor_random - bool - -
-

Whether to use a random donor. Defaults to False.

-
-
- False -
**args - -
-

Additional arguments passed to the BaseOptimizer.

-
-
- {} -
- -
- Source code in promptolution\optimizers\evoprompt_de.py -
class EvoPromptDE(BaseOptimizer):
-    """
-    EvoPromptDE: Differential Evolution-based Prompt Optimizer
-
-    This class implements a differential evolution algorithm for optimizing prompts in large language models.
-    It is adapted from the paper "Connecting Large Language Models with Evolutionary Algorithms
-    Yields Powerful Prompt Optimizers" by Guo et al., 2023.
-
-    The optimizer uses a differential evolution strategy to generate new prompts from existing ones,
-    with an option to use the current best prompt as a donor.
-
-    Attributes:
-        prompt_template (str): Template for generating meta-prompts during evolution.
-        donor_random (bool): If False, uses the current best prompt as a donor; if True, uses a random prompt.
-        meta_llm: Language model used for generating child prompts from meta-prompts.
-
-    Args:
-        prompt_template (str): Template for meta-prompts.
-        meta_llm: Language model for child prompt generation.
-        donor_random (bool, optional): Whether to use a random donor. Defaults to False.
-        **args: Additional arguments passed to the BaseOptimizer.
-    """
-    def __init__(self, prompt_template, meta_llm, donor_random=False, **args):
-        self.prompt_template = prompt_template
-        self.donor_random = donor_random
-        self.meta_llm = meta_llm
-        super().__init__(**args)
-
-    def optimize(self, n_steps: int) -> List[str]:
-        """
-        Perform the optimization process for a specified number of steps.
-
-        This method iteratively improves the prompts using a differential evolution strategy.
-        It evaluates prompts, generates new prompts using the DE algorithm, and replaces
-        prompts if the new ones perform better.
-
-        Args:
-            n_steps (int): Number of optimization steps to perform.
-
-        Returns:
-            List[str]: The optimized list of prompts after all steps.
-        """
-        self.scores = self.task.evaluate(self.prompts, self.predictor)
-        self.prompts = [prompt for _, prompt in sorted(zip(self.scores, self.prompts), reverse=True)]
-        self.scores = sorted(self.scores, reverse=True)
-
-        for _ in range(n_steps):
-            cur_best = self.prompts[0]
-            meta_prompts = []
-            for i in range(len(self.prompts)):
-                # create meta prompts
-                old_prompt = self.prompts[i]
-
-                candidates = [prompt for prompt in self.prompts if prompt != old_prompt]
-                a, b, c = np.random.choice(candidates, size=3, replace=False)
-
-                if not self.donor_random:
-                    c = cur_best
-
-                meta_prompt = (
-                    self.prompt_template.replace("<prompt0>", old_prompt)
-                    .replace("<prompt1>", a)
-                    .replace("<prompt2>", b)
-                    .replace("<prompt3>", c)
-                )
-
-                meta_prompts.append(meta_prompt)
-
-            child_prompts = self.meta_llm.get_response(meta_prompts)
-            child_prompts = [prompt.split("<prompt>")[-1].split("</prompt>")[0].strip() for prompt in child_prompts]
-
-            child_scores = self.task.evaluate(child_prompts, self.predictor)
-
-            for i in range(len(self.prompts)):
-                if child_scores[i] > self.scores[i]:
-                    self.prompts[i] = child_prompts[i]
-                    self.scores[i] = child_scores[i]
-
-            self._on_step_end()
-
-        self._on_train_end()
-        return self.prompts
-
- - - -
- - - - - - - - - -
- - -

- optimize(n_steps) - -

- - -
- -

Perform the optimization process for a specified number of steps.

-

This method iteratively improves the prompts using a differential evolution strategy. -It evaluates prompts, generates new prompts using the DE algorithm, and replaces -prompts if the new ones perform better.

- - -

Parameters:

- - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
n_steps - int - -
-

Number of optimization steps to perform.

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- List[str] - -
-

List[str]: The optimized list of prompts after all steps.

-
-
- -
- Source code in promptolution\optimizers\evoprompt_de.py -
def optimize(self, n_steps: int) -> List[str]:
-    """
-    Perform the optimization process for a specified number of steps.
-
-    This method iteratively improves the prompts using a differential evolution strategy.
-    It evaluates prompts, generates new prompts using the DE algorithm, and replaces
-    prompts if the new ones perform better.
-
-    Args:
-        n_steps (int): Number of optimization steps to perform.
-
-    Returns:
-        List[str]: The optimized list of prompts after all steps.
-    """
-    self.scores = self.task.evaluate(self.prompts, self.predictor)
-    self.prompts = [prompt for _, prompt in sorted(zip(self.scores, self.prompts), reverse=True)]
-    self.scores = sorted(self.scores, reverse=True)
-
-    for _ in range(n_steps):
-        cur_best = self.prompts[0]
-        meta_prompts = []
-        for i in range(len(self.prompts)):
-            # create meta prompts
-            old_prompt = self.prompts[i]
-
-            candidates = [prompt for prompt in self.prompts if prompt != old_prompt]
-            a, b, c = np.random.choice(candidates, size=3, replace=False)
-
-            if not self.donor_random:
-                c = cur_best
-
-            meta_prompt = (
-                self.prompt_template.replace("<prompt0>", old_prompt)
-                .replace("<prompt1>", a)
-                .replace("<prompt2>", b)
-                .replace("<prompt3>", c)
-            )
-
-            meta_prompts.append(meta_prompt)
-
-        child_prompts = self.meta_llm.get_response(meta_prompts)
-        child_prompts = [prompt.split("<prompt>")[-1].split("</prompt>")[0].strip() for prompt in child_prompts]
-
-        child_scores = self.task.evaluate(child_prompts, self.predictor)
-
-        for i in range(len(self.prompts)):
-            if child_scores[i] > self.scores[i]:
-                self.prompts[i] = child_prompts[i]
-                self.scores[i] = child_scores[i]
-
-        self._on_step_end()
-
-    self._on_train_end()
-    return self.prompts
-
-
- -
- - - -
- -
- -
- - - - -
- -
- -
- -
- - - -

- evoprompt_ga - - -

- -
- - - -
- - - - - - - - -
- - - -

- EvoPromptGA - - -

- - -
-

- Bases: BaseOptimizer

- - -

EvoPromptGA: Genetic Algorithm-based Prompt Optimizer

-

This class implements a genetic algorithm for optimizing prompts in large language models. -It is adapted from the paper "Connecting Large Language Models with Evolutionary Algorithms -Yields Powerful Prompt Optimizers" by Guo et al., 2023.

-

The optimizer uses crossover operations to generate new prompts from existing ones, -with different selection methods available for choosing parent prompts.

- - -

Attributes:

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
prompt_template - str - -
-

Template for generating meta-prompts during crossover.

-
-
meta_llm - -
-

Language model used for generating child prompts from meta-prompts.

-
-
selection_mode - str - -
-

Method for selecting parent prompts ('random', 'wheel', or 'tour').

-
-
- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompt_template - str - -
-

Template for meta-prompts.

-
-
- required -
meta_llm - -
-

Language model for child prompt generation.

-
-
- required -
selection_mode - str - -
-

Parent selection method. Defaults to "wheel".

-
-
- 'wheel' -
**args - -
-

Additional arguments passed to the BaseOptimizer.

-
-
- {} -
- - -

Raises:

- - - - - - - - - - - - - -
TypeDescription
- AssertionError - -
-

If an invalid selection mode is provided.

-
-
- -
- Source code in promptolution\optimizers\evoprompt_ga.py -
class EvoPromptGA(BaseOptimizer):
-    """
-    EvoPromptGA: Genetic Algorithm-based Prompt Optimizer
-
-    This class implements a genetic algorithm for optimizing prompts in large language models.
-    It is adapted from the paper "Connecting Large Language Models with Evolutionary Algorithms
-    Yields Powerful Prompt Optimizers" by Guo et al., 2023.
-
-    The optimizer uses crossover operations to generate new prompts from existing ones,
-    with different selection methods available for choosing parent prompts.
-
-    Attributes:
-        prompt_template (str): Template for generating meta-prompts during crossover.
-        meta_llm: Language model used for generating child prompts from meta-prompts.
-        selection_mode (str): Method for selecting parent prompts ('random', 'wheel', or 'tour').
-
-    Args:
-        prompt_template (str): Template for meta-prompts.
-        meta_llm: Language model for child prompt generation.
-        selection_mode (str, optional): Parent selection method. Defaults to "wheel".
-        **args: Additional arguments passed to the BaseOptimizer.
-
-    Raises:
-        AssertionError: If an invalid selection mode is provided.
-    """
-    def __init__(self, prompt_template, meta_llm, selection_mode="wheel", **args):
-        self.prompt_template = prompt_template
-        self.meta_llm = meta_llm
-        assert selection_mode in ["random", "wheel", "tour"], "Invalid selection mode."
-        self.selection_mode = selection_mode
-        super().__init__(**args)
-
-    def optimize(self, n_steps: int) -> List[str]:
-        """
-        Perform the optimization process for a specified number of steps.
-
-        This method iteratively improves the prompts using genetic algorithm techniques.
-        It evaluates prompts, performs crossover to generate new prompts, and selects
-        the best prompts for the next generation.
-
-        Args:
-            n_steps (int): Number of optimization steps to perform.
-
-        Returns:
-            List[str]: The optimized list of prompts after all steps.
-        """
-        # get scores from task
-        self.scores = self.task.evaluate(self.prompts, self.predictor).tolist()
-        # sort prompts by score
-        self.prompts = [prompt for _, prompt in sorted(zip(self.scores, self.prompts), reverse=True)]
-        self.scores = sorted(self.scores, reverse=True)
-
-        for _ in range(n_steps):
-            new_prompts = self._crossover(self.prompts, self.scores)
-            prompts = self.prompts + new_prompts
-            scores = self.scores + self.task.evaluate(new_prompts, self.predictor).tolist()
-
-            # sort scores and prompts
-            self.prompts = [prompt for _, prompt in sorted(zip(scores, prompts), reverse=True)][: len(self.prompts)]
-            self.scores = sorted(scores, reverse=True)[: len(self.prompts)]
-
-            self._on_step_end()
-        return self.prompts
-
-    def _crossover(self, prompts, scores) -> str:
-        """
-        Perform crossover operation to generate new child prompts.
-
-        This method selects parent prompts based on the chosen selection mode,
-        creates meta-prompts using the prompt template, and generates new child
-        prompts using the meta language model.
-
-        Args:
-            prompts (List[str]): List of current prompts.
-            scores (List[float]): Corresponding scores for the prompts.
-
-        Returns:
-            List[str]: Newly generated child prompts.
-        """
-        # parent selection
-        if self.selection_mode == "wheel":
-            wheel_idx = np.random.choice(
-                np.arange(0, len(prompts)),
-                size=len(prompts),
-                replace=True,
-                p=np.array(scores) / np.sum(scores) if np.sum(scores) > 0 else np.ones(len(scores)) / len(scores),
-            ).tolist()
-            parent_pop = [self.prompts[idx] for idx in wheel_idx]
-
-        elif self.selection_mode in ["random", "tour"]:
-            parent_pop = self.prompts
-
-        # crossover
-        meta_prompts = []
-        for _ in self.prompts:
-            if self.selection_mode in ["random", "wheel"]:
-                parent_1, parent_2 = np.random.choice(parent_pop, size=2, replace=False)
-            elif self.selection_mode == "tour":
-                group_1 = np.random.choice(parent_pop, size=2, replace=False)
-                group_2 = np.random.choice(parent_pop, size=2, replace=False)
-                # use the best of each group based on scores
-                parent_1 = group_1[np.argmax([self.scores[self.prompts.index(p)] for p in group_1])]
-                parent_2 = group_2[np.argmax([self.scores[self.prompts.index(p)] for p in group_2])]
-
-            meta_prompt = self.prompt_template.replace("<prompt1>", parent_1).replace("<prompt2>", parent_2)
-            meta_prompts.append(meta_prompt)
-
-        child_prompts = self.meta_llm.get_response(meta_prompts)
-        child_prompts = [prompt.split("<prompt>")[-1].split("</prompt>")[0].strip() for prompt in child_prompts]
-
-        return child_prompts
-
- - - -
- - - - - - - - - -
- - -

- optimize(n_steps) - -

- - -
- -

Perform the optimization process for a specified number of steps.

-

This method iteratively improves the prompts using genetic algorithm techniques. -It evaluates prompts, performs crossover to generate new prompts, and selects -the best prompts for the next generation.

- - -

Parameters:

- - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
n_steps - int - -
-

Number of optimization steps to perform.

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- List[str] - -
-

List[str]: The optimized list of prompts after all steps.

-
-
- -
- Source code in promptolution\optimizers\evoprompt_ga.py -
def optimize(self, n_steps: int) -> List[str]:
-    """
-    Perform the optimization process for a specified number of steps.
-
-    This method iteratively improves the prompts using genetic algorithm techniques.
-    It evaluates prompts, performs crossover to generate new prompts, and selects
-    the best prompts for the next generation.
-
-    Args:
-        n_steps (int): Number of optimization steps to perform.
-
-    Returns:
-        List[str]: The optimized list of prompts after all steps.
-    """
-    # get scores from task
-    self.scores = self.task.evaluate(self.prompts, self.predictor).tolist()
-    # sort prompts by score
-    self.prompts = [prompt for _, prompt in sorted(zip(self.scores, self.prompts), reverse=True)]
-    self.scores = sorted(self.scores, reverse=True)
-
-    for _ in range(n_steps):
-        new_prompts = self._crossover(self.prompts, self.scores)
-        prompts = self.prompts + new_prompts
-        scores = self.scores + self.task.evaluate(new_prompts, self.predictor).tolist()
-
-        # sort scores and prompts
-        self.prompts = [prompt for _, prompt in sorted(zip(scores, prompts), reverse=True)][: len(self.prompts)]
-        self.scores = sorted(scores, reverse=True)[: len(self.prompts)]
-
-        self._on_step_end()
-    return self.prompts
-
-
- -
- - - -
- -
- -
- - - - -
- -
- -
- - -
- -
- -

Base Optimizer

- - -
- - - - -
- - - -
- - - - - - - - -
- - - -

- BaseOptimizer - - -

- - -
-

- Bases: ABC

- - -

Abstract base class for prompt optimizers.

-

This class defines the basic structure and interface for prompt optimization algorithms. -Concrete optimizer implementations should inherit from this class and implement -the optimize method.

- - -

Attributes:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
prompts - List[str] - -
-

List of current prompts being optimized.

-
-
task - BaseTask - -
-

The task object used for evaluating prompts.

-
-
callbacks - List[Callable] - -
-

List of callback functions to be called during optimization.

-
-
predictor - -
-

The predictor used for prompt evaluation (if applicable).

-
-
- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
initial_prompts - List[str] - -
-

Initial set of prompts to start optimization with.

-
-
- required -
task - BaseTask - -
-

Task object for prompt evaluation.

-
-
- required -
callbacks - List[Callable] - -
-

List of callback functions. Defaults to an empty list.

-
-
- [] -
predictor - optional - -
-

Predictor for prompt evaluation. Defaults to None.

-
-
- None -
- -
- Source code in promptolution\optimizers\base_optimizer.py -
class BaseOptimizer(ABC):    
-    """
-    Abstract base class for prompt optimizers.
-
-    This class defines the basic structure and interface for prompt optimization algorithms.
-    Concrete optimizer implementations should inherit from this class and implement
-    the `optimize` method.
-
-    Attributes:
-        prompts (List[str]): List of current prompts being optimized.
-        task (BaseTask): The task object used for evaluating prompts.
-        callbacks (List[Callable]): List of callback functions to be called during optimization.
-        predictor: The predictor used for prompt evaluation (if applicable).
-
-    Args:
-        initial_prompts (List[str]): Initial set of prompts to start optimization with.
-        task (BaseTask): Task object for prompt evaluation.
-        callbacks (List[Callable], optional): List of callback functions. Defaults to an empty list.
-        predictor (optional): Predictor for prompt evaluation. Defaults to None.
-    """
-    def __init__(self, initial_prompts: list[str], task: BaseTask, callbacks: list[Callable] = [], predictor=None):
-        self.prompts = initial_prompts
-        self.task = task
-        self.callbacks = callbacks
-        self.predictor = predictor
-
-    @abstractmethod
-    def optimize(self, n_steps: int) -> List[str]:
-        """
-        Abstract method to perform the optimization process.
-
-        This method should be implemented by concrete optimizer classes to define
-        the specific optimization algorithm.
-
-        Args:
-            n_steps (int): Number of optimization steps to perform.
-
-        Returns:
-            List[str]: The optimized list of prompts after all steps.
-
-        Raises:
-            NotImplementedError: If not implemented by a concrete class.
-        """
-        raise NotImplementedError
-
-    def _on_step_end(self):
-        """
-        Call all registered callbacks at the end of each optimization step.
-        """
-        for callback in self.callbacks:
-            callback.on_step_end(self)
-
-    def _on_epoch_end(self):
-        """
-        Call all registered callbacks at the end of each optimization epoch.
-        """
-        for callback in self.callbacks:
-            callback.on_epoch_end(self)
-
-    def _on_train_end(self):
-        """
-        Call all registered callbacks at the end of the entire optimization process.
-        """
-        for callback in self.callbacks:
-            callback.on_train_end(self)
-
- - - -
- - - - - - - - - -
- - -

- optimize(n_steps) - - - abstractmethod - - -

- - -
- -

Abstract method to perform the optimization process.

-

This method should be implemented by concrete optimizer classes to define -the specific optimization algorithm.

- - -

Parameters:

- - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
n_steps - int - -
-

Number of optimization steps to perform.

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- List[str] - -
-

List[str]: The optimized list of prompts after all steps.

-
-
- - -

Raises:

- - - - - - - - - - - - - -
TypeDescription
- NotImplementedError - -
-

If not implemented by a concrete class.

-
-
- -
- Source code in promptolution\optimizers\base_optimizer.py -
@abstractmethod
-def optimize(self, n_steps: int) -> List[str]:
-    """
-    Abstract method to perform the optimization process.
-
-    This method should be implemented by concrete optimizer classes to define
-    the specific optimization algorithm.
-
-    Args:
-        n_steps (int): Number of optimization steps to perform.
-
-    Returns:
-        List[str]: The optimized list of prompts after all steps.
-
-    Raises:
-        NotImplementedError: If not implemented by a concrete class.
-    """
-    raise NotImplementedError
-
-
- -
- - - -
- -
- -
- -
- - - -

- DummyOptimizer - - -

- - -
-

- Bases: BaseOptimizer

- - -

A dummy optimizer that doesn't perform any actual optimization.

-

This optimizer simply returns the initial prompts without modification. -It's useful for testing or as a baseline comparison.

- - -

Attributes:

- - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
prompts - List[str] - -
-

List of prompts (unchanged from initialization).

-
-
callbacks - List[Callable] - -
-

Empty list of callbacks.

-
-
- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
initial_prompts - List[str] - -
-

Initial set of prompts.

-
-
- required -
*args - -
-

Variable length argument list (unused).

-
-
- () -
**kwargs - -
-

Arbitrary keyword arguments (unused).

-
-
- {} -
- -
- Source code in promptolution\optimizers\base_optimizer.py -
class DummyOptimizer(BaseOptimizer):
-    """
-    A dummy optimizer that doesn't perform any actual optimization.
-
-    This optimizer simply returns the initial prompts without modification.
-    It's useful for testing or as a baseline comparison.
-
-    Attributes:
-        prompts (List[str]): List of prompts (unchanged from initialization).
-        callbacks (List[Callable]): Empty list of callbacks.
-
-    Args:
-        initial_prompts (List[str]): Initial set of prompts.
-        *args: Variable length argument list (unused).
-        **kwargs: Arbitrary keyword arguments (unused).
-    """
-    def __init__(self, initial_prompts, *args, **kwargs):
-        self.callbacks = []
-        self.prompts = initial_prompts
-
-    def optimize(self, n_steps) -> list[str]:
-        """
-        Simulate an optimization process without actually modifying the prompts.
-
-        This method calls the callback methods to simulate a complete optimization
-        cycle, but returns the initial prompts unchanged.
-
-        Args:
-            n_steps (int): Number of optimization steps (unused in this implementation).
-
-        Returns:
-            List[str]: The original list of prompts, unchanged.
-        """
-        self._on_step_end()
-        self._on_epoch_end()
-        self._on_train_end()
-        return self.prompts
-
- - - -
- - - - - - - - - -
- - -

- optimize(n_steps) - -

- - -
- -

Simulate an optimization process without actually modifying the prompts.

-

This method calls the callback methods to simulate a complete optimization -cycle, but returns the initial prompts unchanged.

- - -

Parameters:

- - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
n_steps - int - -
-

Number of optimization steps (unused in this implementation).

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- list[str] - -
-

List[str]: The original list of prompts, unchanged.

-
-
- -
- Source code in promptolution\optimizers\base_optimizer.py -
def optimize(self, n_steps) -> list[str]:
-    """
-    Simulate an optimization process without actually modifying the prompts.
-
-    This method calls the callback methods to simulate a complete optimization
-    cycle, but returns the initial prompts unchanged.
-
-    Args:
-        n_steps (int): Number of optimization steps (unused in this implementation).
-
-    Returns:
-        List[str]: The original list of prompts, unchanged.
-    """
-    self._on_step_end()
-    self._on_epoch_end()
-    self._on_train_end()
-    return self.prompts
-
-
- -
- - - -
- -
- -
- - - - -
- -
- -

EvoPrompt DE

- - -
- - - - -
- - - -
- - - - - - - - -
- - - -

- EvoPromptDE - - -

- - -
-

- Bases: BaseOptimizer

- - -

EvoPromptDE: Differential Evolution-based Prompt Optimizer

-

This class implements a differential evolution algorithm for optimizing prompts in large language models. -It is adapted from the paper "Connecting Large Language Models with Evolutionary Algorithms -Yields Powerful Prompt Optimizers" by Guo et al., 2023.

-

The optimizer uses a differential evolution strategy to generate new prompts from existing ones, -with an option to use the current best prompt as a donor.

- - -

Attributes:

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
prompt_template - str - -
-

Template for generating meta-prompts during evolution.

-
-
donor_random - bool - -
-

If False, uses the current best prompt as a donor; if True, uses a random prompt.

-
-
meta_llm - -
-

Language model used for generating child prompts from meta-prompts.

-
-
- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompt_template - str - -
-

Template for meta-prompts.

-
-
- required -
meta_llm - -
-

Language model for child prompt generation.

-
-
- required -
donor_random - bool - -
-

Whether to use a random donor. Defaults to False.

-
-
- False -
**args - -
-

Additional arguments passed to the BaseOptimizer.

-
-
- {} -
- -
- Source code in promptolution\optimizers\evoprompt_de.py -
class EvoPromptDE(BaseOptimizer):
-    """
-    EvoPromptDE: Differential Evolution-based Prompt Optimizer
-
-    This class implements a differential evolution algorithm for optimizing prompts in large language models.
-    It is adapted from the paper "Connecting Large Language Models with Evolutionary Algorithms
-    Yields Powerful Prompt Optimizers" by Guo et al., 2023.
-
-    The optimizer uses a differential evolution strategy to generate new prompts from existing ones,
-    with an option to use the current best prompt as a donor.
-
-    Attributes:
-        prompt_template (str): Template for generating meta-prompts during evolution.
-        donor_random (bool): If False, uses the current best prompt as a donor; if True, uses a random prompt.
-        meta_llm: Language model used for generating child prompts from meta-prompts.
-
-    Args:
-        prompt_template (str): Template for meta-prompts.
-        meta_llm: Language model for child prompt generation.
-        donor_random (bool, optional): Whether to use a random donor. Defaults to False.
-        **args: Additional arguments passed to the BaseOptimizer.
-    """
-    def __init__(self, prompt_template, meta_llm, donor_random=False, **args):
-        self.prompt_template = prompt_template
-        self.donor_random = donor_random
-        self.meta_llm = meta_llm
-        super().__init__(**args)
-
-    def optimize(self, n_steps: int) -> List[str]:
-        """
-        Perform the optimization process for a specified number of steps.
-
-        This method iteratively improves the prompts using a differential evolution strategy.
-        It evaluates prompts, generates new prompts using the DE algorithm, and replaces
-        prompts if the new ones perform better.
-
-        Args:
-            n_steps (int): Number of optimization steps to perform.
-
-        Returns:
-            List[str]: The optimized list of prompts after all steps.
-        """
-        self.scores = self.task.evaluate(self.prompts, self.predictor)
-        self.prompts = [prompt for _, prompt in sorted(zip(self.scores, self.prompts), reverse=True)]
-        self.scores = sorted(self.scores, reverse=True)
-
-        for _ in range(n_steps):
-            cur_best = self.prompts[0]
-            meta_prompts = []
-            for i in range(len(self.prompts)):
-                # create meta prompts
-                old_prompt = self.prompts[i]
-
-                candidates = [prompt for prompt in self.prompts if prompt != old_prompt]
-                a, b, c = np.random.choice(candidates, size=3, replace=False)
-
-                if not self.donor_random:
-                    c = cur_best
-
-                meta_prompt = (
-                    self.prompt_template.replace("<prompt0>", old_prompt)
-                    .replace("<prompt1>", a)
-                    .replace("<prompt2>", b)
-                    .replace("<prompt3>", c)
-                )
-
-                meta_prompts.append(meta_prompt)
-
-            child_prompts = self.meta_llm.get_response(meta_prompts)
-            child_prompts = [prompt.split("<prompt>")[-1].split("</prompt>")[0].strip() for prompt in child_prompts]
-
-            child_scores = self.task.evaluate(child_prompts, self.predictor)
-
-            for i in range(len(self.prompts)):
-                if child_scores[i] > self.scores[i]:
-                    self.prompts[i] = child_prompts[i]
-                    self.scores[i] = child_scores[i]
-
-            self._on_step_end()
-
-        self._on_train_end()
-        return self.prompts
-
- - - -
- - - - - - - - - -
- - -

- optimize(n_steps) - -

- - -
- -

Perform the optimization process for a specified number of steps.

-

This method iteratively improves the prompts using a differential evolution strategy. -It evaluates prompts, generates new prompts using the DE algorithm, and replaces -prompts if the new ones perform better.

- - -

Parameters:

- - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
n_steps - int - -
-

Number of optimization steps to perform.

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- List[str] - -
-

List[str]: The optimized list of prompts after all steps.

-
-
- -
- Source code in promptolution\optimizers\evoprompt_de.py -
def optimize(self, n_steps: int) -> List[str]:
-    """
-    Perform the optimization process for a specified number of steps.
-
-    This method iteratively improves the prompts using a differential evolution strategy.
-    It evaluates prompts, generates new prompts using the DE algorithm, and replaces
-    prompts if the new ones perform better.
-
-    Args:
-        n_steps (int): Number of optimization steps to perform.
-
-    Returns:
-        List[str]: The optimized list of prompts after all steps.
-    """
-    self.scores = self.task.evaluate(self.prompts, self.predictor)
-    self.prompts = [prompt for _, prompt in sorted(zip(self.scores, self.prompts), reverse=True)]
-    self.scores = sorted(self.scores, reverse=True)
-
-    for _ in range(n_steps):
-        cur_best = self.prompts[0]
-        meta_prompts = []
-        for i in range(len(self.prompts)):
-            # create meta prompts
-            old_prompt = self.prompts[i]
-
-            candidates = [prompt for prompt in self.prompts if prompt != old_prompt]
-            a, b, c = np.random.choice(candidates, size=3, replace=False)
-
-            if not self.donor_random:
-                c = cur_best
-
-            meta_prompt = (
-                self.prompt_template.replace("<prompt0>", old_prompt)
-                .replace("<prompt1>", a)
-                .replace("<prompt2>", b)
-                .replace("<prompt3>", c)
-            )
-
-            meta_prompts.append(meta_prompt)
-
-        child_prompts = self.meta_llm.get_response(meta_prompts)
-        child_prompts = [prompt.split("<prompt>")[-1].split("</prompt>")[0].strip() for prompt in child_prompts]
-
-        child_scores = self.task.evaluate(child_prompts, self.predictor)
-
-        for i in range(len(self.prompts)):
-            if child_scores[i] > self.scores[i]:
-                self.prompts[i] = child_prompts[i]
-                self.scores[i] = child_scores[i]
-
-        self._on_step_end()
-
-    self._on_train_end()
-    return self.prompts
-
-
- -
- - - -
- -
- -
- - - - -
- -
- -

EvoPrompt GA

- - -
- - - - -
- - - -
- - - - - - - - -
- - - -

- EvoPromptGA - - -

- - -
-

- Bases: BaseOptimizer

- - -

EvoPromptGA: Genetic Algorithm-based Prompt Optimizer

-

This class implements a genetic algorithm for optimizing prompts in large language models. -It is adapted from the paper "Connecting Large Language Models with Evolutionary Algorithms -Yields Powerful Prompt Optimizers" by Guo et al., 2023.

-

The optimizer uses crossover operations to generate new prompts from existing ones, -with different selection methods available for choosing parent prompts.

- - -

Attributes:

- - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
prompt_template - str - -
-

Template for generating meta-prompts during crossover.

-
-
meta_llm - -
-

Language model used for generating child prompts from meta-prompts.

-
-
selection_mode - str - -
-

Method for selecting parent prompts ('random', 'wheel', or 'tour').

-
-
- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompt_template - str - -
-

Template for meta-prompts.

-
-
- required -
meta_llm - -
-

Language model for child prompt generation.

-
-
- required -
selection_mode - str - -
-

Parent selection method. Defaults to "wheel".

-
-
- 'wheel' -
**args - -
-

Additional arguments passed to the BaseOptimizer.

-
-
- {} -
- - -

Raises:

- - - - - - - - - - - - - -
TypeDescription
- AssertionError - -
-

If an invalid selection mode is provided.

-
-
- -
- Source code in promptolution\optimizers\evoprompt_ga.py -
class EvoPromptGA(BaseOptimizer):
-    """
-    EvoPromptGA: Genetic Algorithm-based Prompt Optimizer
-
-    This class implements a genetic algorithm for optimizing prompts in large language models.
-    It is adapted from the paper "Connecting Large Language Models with Evolutionary Algorithms
-    Yields Powerful Prompt Optimizers" by Guo et al., 2023.
-
-    The optimizer uses crossover operations to generate new prompts from existing ones,
-    with different selection methods available for choosing parent prompts.
-
-    Attributes:
-        prompt_template (str): Template for generating meta-prompts during crossover.
-        meta_llm: Language model used for generating child prompts from meta-prompts.
-        selection_mode (str): Method for selecting parent prompts ('random', 'wheel', or 'tour').
-
-    Args:
-        prompt_template (str): Template for meta-prompts.
-        meta_llm: Language model for child prompt generation.
-        selection_mode (str, optional): Parent selection method. Defaults to "wheel".
-        **args: Additional arguments passed to the BaseOptimizer.
-
-    Raises:
-        AssertionError: If an invalid selection mode is provided.
-    """
-    def __init__(self, prompt_template, meta_llm, selection_mode="wheel", **args):
-        self.prompt_template = prompt_template
-        self.meta_llm = meta_llm
-        assert selection_mode in ["random", "wheel", "tour"], "Invalid selection mode."
-        self.selection_mode = selection_mode
-        super().__init__(**args)
-
-    def optimize(self, n_steps: int) -> List[str]:
-        """
-        Perform the optimization process for a specified number of steps.
-
-        This method iteratively improves the prompts using genetic algorithm techniques.
-        It evaluates prompts, performs crossover to generate new prompts, and selects
-        the best prompts for the next generation.
-
-        Args:
-            n_steps (int): Number of optimization steps to perform.
-
-        Returns:
-            List[str]: The optimized list of prompts after all steps.
-        """
-        # get scores from task
-        self.scores = self.task.evaluate(self.prompts, self.predictor).tolist()
-        # sort prompts by score
-        self.prompts = [prompt for _, prompt in sorted(zip(self.scores, self.prompts), reverse=True)]
-        self.scores = sorted(self.scores, reverse=True)
-
-        for _ in range(n_steps):
-            new_prompts = self._crossover(self.prompts, self.scores)
-            prompts = self.prompts + new_prompts
-            scores = self.scores + self.task.evaluate(new_prompts, self.predictor).tolist()
-
-            # sort scores and prompts
-            self.prompts = [prompt for _, prompt in sorted(zip(scores, prompts), reverse=True)][: len(self.prompts)]
-            self.scores = sorted(scores, reverse=True)[: len(self.prompts)]
-
-            self._on_step_end()
-        return self.prompts
-
-    def _crossover(self, prompts, scores) -> str:
-        """
-        Perform crossover operation to generate new child prompts.
-
-        This method selects parent prompts based on the chosen selection mode,
-        creates meta-prompts using the prompt template, and generates new child
-        prompts using the meta language model.
-
-        Args:
-            prompts (List[str]): List of current prompts.
-            scores (List[float]): Corresponding scores for the prompts.
-
-        Returns:
-            List[str]: Newly generated child prompts.
-        """
-        # parent selection
-        if self.selection_mode == "wheel":
-            wheel_idx = np.random.choice(
-                np.arange(0, len(prompts)),
-                size=len(prompts),
-                replace=True,
-                p=np.array(scores) / np.sum(scores) if np.sum(scores) > 0 else np.ones(len(scores)) / len(scores),
-            ).tolist()
-            parent_pop = [self.prompts[idx] for idx in wheel_idx]
-
-        elif self.selection_mode in ["random", "tour"]:
-            parent_pop = self.prompts
-
-        # crossover
-        meta_prompts = []
-        for _ in self.prompts:
-            if self.selection_mode in ["random", "wheel"]:
-                parent_1, parent_2 = np.random.choice(parent_pop, size=2, replace=False)
-            elif self.selection_mode == "tour":
-                group_1 = np.random.choice(parent_pop, size=2, replace=False)
-                group_2 = np.random.choice(parent_pop, size=2, replace=False)
-                # use the best of each group based on scores
-                parent_1 = group_1[np.argmax([self.scores[self.prompts.index(p)] for p in group_1])]
-                parent_2 = group_2[np.argmax([self.scores[self.prompts.index(p)] for p in group_2])]
-
-            meta_prompt = self.prompt_template.replace("<prompt1>", parent_1).replace("<prompt2>", parent_2)
-            meta_prompts.append(meta_prompt)
-
-        child_prompts = self.meta_llm.get_response(meta_prompts)
-        child_prompts = [prompt.split("<prompt>")[-1].split("</prompt>")[0].strip() for prompt in child_prompts]
-
-        return child_prompts
-
- - - -
- - - - - - - - - -
- - -

- optimize(n_steps) - -

- - -
- -

Perform the optimization process for a specified number of steps.

-

This method iteratively improves the prompts using genetic algorithm techniques. -It evaluates prompts, performs crossover to generate new prompts, and selects -the best prompts for the next generation.

- - -

Parameters:

- - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
n_steps - int - -
-

Number of optimization steps to perform.

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- List[str] - -
-

List[str]: The optimized list of prompts after all steps.

-
-
- -
- Source code in promptolution\optimizers\evoprompt_ga.py -
def optimize(self, n_steps: int) -> List[str]:
-    """
-    Perform the optimization process for a specified number of steps.
-
-    This method iteratively improves the prompts using genetic algorithm techniques.
-    It evaluates prompts, performs crossover to generate new prompts, and selects
-    the best prompts for the next generation.
-
-    Args:
-        n_steps (int): Number of optimization steps to perform.
-
-    Returns:
-        List[str]: The optimized list of prompts after all steps.
-    """
-    # get scores from task
-    self.scores = self.task.evaluate(self.prompts, self.predictor).tolist()
-    # sort prompts by score
-    self.prompts = [prompt for _, prompt in sorted(zip(self.scores, self.prompts), reverse=True)]
-    self.scores = sorted(self.scores, reverse=True)
-
-    for _ in range(n_steps):
-        new_prompts = self._crossover(self.prompts, self.scores)
-        prompts = self.prompts + new_prompts
-        scores = self.scores + self.task.evaluate(new_prompts, self.predictor).tolist()
-
-        # sort scores and prompts
-        self.prompts = [prompt for _, prompt in sorted(zip(scores, prompts), reverse=True)][: len(self.prompts)]
-        self.scores = sorted(scores, reverse=True)[: len(self.prompts)]
-
-        self._on_step_end()
-    return self.prompts
-
-
- -
- - - -
- -
- -
- - - - -
- -
- -
-
-
- - - - - - - - - - - diff --git a/site/api/predictors/index.html b/site/api/predictors/index.html deleted file mode 100644 index fd06ce1..0000000 --- a/site/api/predictors/index.html +++ /dev/null @@ -1,2480 +0,0 @@ - - - - - - - - - - - Predictors - Promptolution Documentation - - - - - - - - - - - - - - - - -
-
-
-
- -

Predictors

-

This module contains predictor implementations for various tasks.

- - -
- - - - -
- - - -
- - - - - - - - - -
- - -

- get_predictor(name, *args, **kwargs) - -

- - -
- -

Factory function to create and return a predictor instance based on the provided name.

-

This function supports two types of predictors: -1. DummyPredictor: A mock predictor for testing purposes. -2. Classificator: A real predictor using a language model for classification tasks.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
name - str - -
-

Identifier for the predictor to use. Special case: - - "dummy" for DummyPredictor - - Any other string for Classificator with the specified LLM

-
-
- required -
*args - -
-

Variable length argument list passed to the predictor constructor.

-
-
- () -
**kwargs - -
-

Arbitrary keyword arguments passed to the predictor constructor.

-
-
- {} -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- -
-

An instance of DummyPredictor or Classificator based on the name.

-
-
- - -
- Notes -
    -
  • For non-dummy predictors, this function calls get_llm to obtain the language model.
  • -
  • The batch_size for the language model is currently commented out and not used.
  • -
-
- -

Examples:

-
>>> dummy_pred = get_predictor("dummy", classes=["A", "B", "C"])
->>> real_pred = get_predictor("gpt-3.5-turbo", classes=["positive", "negative"])
- -
- Source code in promptolution\predictors\__init__.py -
def get_predictor(name, *args, **kwargs):
-    """
-    Factory function to create and return a predictor instance based on the provided name.
-
-    This function supports two types of predictors:
-    1. DummyPredictor: A mock predictor for testing purposes.
-    2. Classificator: A real predictor using a language model for classification tasks.
-
-    Args:
-        name (str): Identifier for the predictor to use. Special case:
-                    - "dummy" for DummyPredictor
-                    - Any other string for Classificator with the specified LLM
-        *args: Variable length argument list passed to the predictor constructor.
-        **kwargs: Arbitrary keyword arguments passed to the predictor constructor.
-
-    Returns:
-        An instance of DummyPredictor or Classificator based on the name.
-
-    Notes:
-        - For non-dummy predictors, this function calls get_llm to obtain the language model.
-        - The batch_size for the language model is currently commented out and not used.
-
-    Examples:
-        >>> dummy_pred = get_predictor("dummy", classes=["A", "B", "C"])
-        >>> real_pred = get_predictor("gpt-3.5-turbo", classes=["positive", "negative"])
-    """
-    if name == "dummy":
-        return DummyPredictor("", *args, **kwargs)
-
-    downstream_llm = get_llm(name)  # , batch_size=config.downstream_bs)
-
-    return Classificator(downstream_llm, *args, **kwargs)
-
-
- -
- - -
- - - -

- base_predictor - - -

- -
- - - -
- - - - - - - - -
- - - -

- BasePredictor - - -

- - -
- - -

Abstract base class for predictors in the promptolution library.

-

This class defines the interface that all concrete predictor implementations should follow.

- - -

Attributes:

- - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
model_id - str - -
-

Identifier for the model used by the predictor.

-
-
classes - List[str] - -
-

List of possible class labels for classification tasks.

-
-
- - -

Methods:

- - - - - - - - - - - - - -
NameDescription
predict -
-

An abstract method that should be implemented by subclasses - to make predictions based on prompts and input data.

-
-
- -
- Source code in promptolution\predictors\base_predictor.py -
class BasePredictor:
-    """
-    Abstract base class for predictors in the promptolution library.
-
-    This class defines the interface that all concrete predictor implementations should follow.
-
-    Attributes:
-        model_id (str): Identifier for the model used by the predictor.
-        classes (List[str]): List of possible class labels for classification tasks.
-
-    Methods:
-        predict: An abstract method that should be implemented by subclasses
-                 to make predictions based on prompts and input data.
-    """
-    def __init__(self, model_id, classes, *args, **kwargs):
-        """
-        Initialize the BasePredictor.
-
-        Args:
-            model_id (str): Identifier for the model to use.
-            classes (List[str]): List of possible class labels.
-            *args: Variable length argument list.
-            **kwargs: Arbitrary keyword arguments.
-        """
-        self.model_id = model_id
-        self.classes = classes
-
-    @abstractmethod
-    def predict(
-        self,
-        prompts: List[str],
-        xs: np.ndarray,
-    ) -> np.ndarray:
-        """
-        Abstract method to make predictions based on prompts and input data.
-
-        Args:
-            prompts (List[str]): List of prompts to use for prediction.
-            xs (np.ndarray): Array of input data.
-
-        Returns:
-            np.ndarray: Array of predictions.
-
-        Raises:
-            NotImplementedError: If not implemented by a subclass.
-        """
-        raise NotImplementedError
-
- - - -
- - - - - - - - - -
- - -

- __init__(model_id, classes, *args, **kwargs) - -

- - -
- -

Initialize the BasePredictor.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
model_id - str - -
-

Identifier for the model to use.

-
-
- required -
classes - List[str] - -
-

List of possible class labels.

-
-
- required -
*args - -
-

Variable length argument list.

-
-
- () -
**kwargs - -
-

Arbitrary keyword arguments.

-
-
- {} -
- -
- Source code in promptolution\predictors\base_predictor.py -
def __init__(self, model_id, classes, *args, **kwargs):
-    """
-    Initialize the BasePredictor.
-
-    Args:
-        model_id (str): Identifier for the model to use.
-        classes (List[str]): List of possible class labels.
-        *args: Variable length argument list.
-        **kwargs: Arbitrary keyword arguments.
-    """
-    self.model_id = model_id
-    self.classes = classes
-
-
- -
- -
- - -

- predict(prompts, xs) - - - abstractmethod - - -

- - -
- -

Abstract method to make predictions based on prompts and input data.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompts - List[str] - -
-

List of prompts to use for prediction.

-
-
- required -
xs - ndarray - -
-

Array of input data.

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- ndarray - -
-

np.ndarray: Array of predictions.

-
-
- - -

Raises:

- - - - - - - - - - - - - -
TypeDescription
- NotImplementedError - -
-

If not implemented by a subclass.

-
-
- -
- Source code in promptolution\predictors\base_predictor.py -
@abstractmethod
-def predict(
-    self,
-    prompts: List[str],
-    xs: np.ndarray,
-) -> np.ndarray:
-    """
-    Abstract method to make predictions based on prompts and input data.
-
-    Args:
-        prompts (List[str]): List of prompts to use for prediction.
-        xs (np.ndarray): Array of input data.
-
-    Returns:
-        np.ndarray: Array of predictions.
-
-    Raises:
-        NotImplementedError: If not implemented by a subclass.
-    """
-    raise NotImplementedError
-
-
- -
- - - -
- -
- -
- -
- - - -

- DummyPredictor - - -

- - -
-

- Bases: BasePredictor

- - -

A dummy predictor implementation for testing purposes.

-

This predictor generates random predictions from the list of possible classes.

- - -

Attributes:

- - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
model_id - str - -
-

Always set to "dummy".

-
-
classes - List[str] - -
-

List of possible class labels.

-
-
- - -

Methods:

- - - - - - - - - - - - - -
NameDescription
predict -
-

Generates random predictions for the given prompts and input data.

-
-
- -
- Source code in promptolution\predictors\base_predictor.py -
class DummyPredictor(BasePredictor):
-    """
-    A dummy predictor implementation for testing purposes.
-
-    This predictor generates random predictions from the list of possible classes.
-
-    Attributes:
-        model_id (str): Always set to "dummy".
-        classes (List[str]): List of possible class labels.
-
-    Methods:
-        predict: Generates random predictions for the given prompts and input data.
-    """
-    def __init__(self, model_id, classes, *args, **kwargs):
-        self.model_id = "dummy"
-        self.classes = classes
-
-    def predict(
-        self,
-        prompts: List[str],
-        xs: np.ndarray,
-    ) -> np.ndarray:
-        """
-        Generate random predictions for the given prompts and input data.
-
-        Args:
-            prompts (List[str]): List of prompts (ignored in this implementation).
-            xs (np.ndarray): Array of input data (only the length is used).
-
-        Returns:
-            np.ndarray: 2D array of random predictions, shape (len(prompts), len(xs)).
-        """
-        return np.array([np.random.choice(self.classes, len(xs)) for _ in prompts])
-
- - - -
- - - - - - - - - -
- - -

- predict(prompts, xs) - -

- - -
- -

Generate random predictions for the given prompts and input data.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompts - List[str] - -
-

List of prompts (ignored in this implementation).

-
-
- required -
xs - ndarray - -
-

Array of input data (only the length is used).

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- ndarray - -
-

np.ndarray: 2D array of random predictions, shape (len(prompts), len(xs)).

-
-
- -
- Source code in promptolution\predictors\base_predictor.py -
def predict(
-    self,
-    prompts: List[str],
-    xs: np.ndarray,
-) -> np.ndarray:
-    """
-    Generate random predictions for the given prompts and input data.
-
-    Args:
-        prompts (List[str]): List of prompts (ignored in this implementation).
-        xs (np.ndarray): Array of input data (only the length is used).
-
-    Returns:
-        np.ndarray: 2D array of random predictions, shape (len(prompts), len(xs)).
-    """
-    return np.array([np.random.choice(self.classes, len(xs)) for _ in prompts])
-
-
- -
- - - -
- -
- -
- - - - -
- -
- -
- -
- - - -

- classificator - - -

- -
- - - -
- - - - - - - - -
- - - -

- Classificator - - -

- - -
-

- Bases: BasePredictor

- - -

A predictor class for classification tasks using language models.

-

This class takes a language model and a list of classes, and provides a method -to predict classes for given prompts and input data.

- - -

Attributes:

- - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
llm - -
-

The language model used for generating predictions.

-
-
classes - List[str] - -
-

The list of valid class labels.

-
-
- - -
- Inherits from -

BasePredictor: The base class for predictors in the promptolution library.

-
-
- Source code in promptolution\predictors\classificator.py -
class Classificator(BasePredictor):
-    """
-    A predictor class for classification tasks using language models.
-
-    This class takes a language model and a list of classes, and provides a method
-    to predict classes for given prompts and input data.
-
-    Attributes:
-        llm: The language model used for generating predictions.
-        classes (List[str]): The list of valid class labels.
-
-    Inherits from:
-        BasePredictor: The base class for predictors in the promptolution library.
-    """
-    def __init__(self, llm, classes, *args, **kwargs):
-        """
-        Initialize the Classificator.
-
-        Args:
-            llm: The language model to use for predictions.
-            classes (List[str]): The list of valid class labels.
-        """
-        self.llm = llm
-        self.classes = classes
-
-    def predict(
-        self,
-        prompts: List[str],
-        xs: np.ndarray,
-    ) -> np.ndarray:
-        """
-        Predict classes for given prompts and input data.
-
-        This method generates predictions using the language model and then
-        extracts the predicted class from the model's output.
-
-        Args:
-            prompts (List[str]): The list of prompts to use for prediction.
-            xs (np.ndarray): The input data array.
-
-        Returns:
-            np.ndarray: A 2D array of predicted classes, with shape (len(prompts), len(xs)).
-
-        Note:
-            The method concatenates each prompt with each input data point,
-            passes it to the language model, and then extracts the first word
-            in the response that matches a class in self.classes.
-        """
-        if isinstance(prompts, str):
-            prompts = [prompts]
-
-        preds = self.llm.get_response([prompt + "\n" + x for prompt in prompts for x in xs])
-
-        response = []
-        for pred in preds:
-            predicted_class = ""
-            for word in pred.split(" "):
-                word = "".join([c for c in word if c.isalpha()])
-                if word in self.classes:
-                    predicted_class = word
-                    break
-
-            response.append(predicted_class)
-
-        response = np.array(response).reshape(len(prompts), len(xs))
-        return response
-
- - - -
- - - - - - - - - -
- - -

- __init__(llm, classes, *args, **kwargs) - -

- - -
- -

Initialize the Classificator.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
llm - -
-

The language model to use for predictions.

-
-
- required -
classes - List[str] - -
-

The list of valid class labels.

-
-
- required -
- -
- Source code in promptolution\predictors\classificator.py -
def __init__(self, llm, classes, *args, **kwargs):
-    """
-    Initialize the Classificator.
-
-    Args:
-        llm: The language model to use for predictions.
-        classes (List[str]): The list of valid class labels.
-    """
-    self.llm = llm
-    self.classes = classes
-
-
- -
- -
- - -

- predict(prompts, xs) - -

- - -
- -

Predict classes for given prompts and input data.

-

This method generates predictions using the language model and then -extracts the predicted class from the model's output.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompts - List[str] - -
-

The list of prompts to use for prediction.

-
-
- required -
xs - ndarray - -
-

The input data array.

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- ndarray - -
-

np.ndarray: A 2D array of predicted classes, with shape (len(prompts), len(xs)).

-
-
- - -
- Note -

The method concatenates each prompt with each input data point, -passes it to the language model, and then extracts the first word -in the response that matches a class in self.classes.

-
-
- Source code in promptolution\predictors\classificator.py -
def predict(
-    self,
-    prompts: List[str],
-    xs: np.ndarray,
-) -> np.ndarray:
-    """
-    Predict classes for given prompts and input data.
-
-    This method generates predictions using the language model and then
-    extracts the predicted class from the model's output.
-
-    Args:
-        prompts (List[str]): The list of prompts to use for prediction.
-        xs (np.ndarray): The input data array.
-
-    Returns:
-        np.ndarray: A 2D array of predicted classes, with shape (len(prompts), len(xs)).
-
-    Note:
-        The method concatenates each prompt with each input data point,
-        passes it to the language model, and then extracts the first word
-        in the response that matches a class in self.classes.
-    """
-    if isinstance(prompts, str):
-        prompts = [prompts]
-
-    preds = self.llm.get_response([prompt + "\n" + x for prompt in prompts for x in xs])
-
-    response = []
-    for pred in preds:
-        predicted_class = ""
-        for word in pred.split(" "):
-            word = "".join([c for c in word if c.isalpha()])
-            if word in self.classes:
-                predicted_class = word
-                break
-
-        response.append(predicted_class)
-
-    response = np.array(response).reshape(len(prompts), len(xs))
-    return response
-
-
- -
- - - -
- -
- -
- - - - -
- -
- -
- - -
- -
- -

Base Predictor

- - -
- - - - -
- - - -
- - - - - - - - -
- - - -

- BasePredictor - - -

- - -
- - -

Abstract base class for predictors in the promptolution library.

-

This class defines the interface that all concrete predictor implementations should follow.

- - -

Attributes:

- - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
model_id - str - -
-

Identifier for the model used by the predictor.

-
-
classes - List[str] - -
-

List of possible class labels for classification tasks.

-
-
- - -

Methods:

- - - - - - - - - - - - - -
NameDescription
predict -
-

An abstract method that should be implemented by subclasses - to make predictions based on prompts and input data.

-
-
- -
- Source code in promptolution\predictors\base_predictor.py -
class BasePredictor:
-    """
-    Abstract base class for predictors in the promptolution library.
-
-    This class defines the interface that all concrete predictor implementations should follow.
-
-    Attributes:
-        model_id (str): Identifier for the model used by the predictor.
-        classes (List[str]): List of possible class labels for classification tasks.
-
-    Methods:
-        predict: An abstract method that should be implemented by subclasses
-                 to make predictions based on prompts and input data.
-    """
-    def __init__(self, model_id, classes, *args, **kwargs):
-        """
-        Initialize the BasePredictor.
-
-        Args:
-            model_id (str): Identifier for the model to use.
-            classes (List[str]): List of possible class labels.
-            *args: Variable length argument list.
-            **kwargs: Arbitrary keyword arguments.
-        """
-        self.model_id = model_id
-        self.classes = classes
-
-    @abstractmethod
-    def predict(
-        self,
-        prompts: List[str],
-        xs: np.ndarray,
-    ) -> np.ndarray:
-        """
-        Abstract method to make predictions based on prompts and input data.
-
-        Args:
-            prompts (List[str]): List of prompts to use for prediction.
-            xs (np.ndarray): Array of input data.
-
-        Returns:
-            np.ndarray: Array of predictions.
-
-        Raises:
-            NotImplementedError: If not implemented by a subclass.
-        """
-        raise NotImplementedError
-
- - - -
- - - - - - - - - -
- - -

- __init__(model_id, classes, *args, **kwargs) - -

- - -
- -

Initialize the BasePredictor.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
model_id - str - -
-

Identifier for the model to use.

-
-
- required -
classes - List[str] - -
-

List of possible class labels.

-
-
- required -
*args - -
-

Variable length argument list.

-
-
- () -
**kwargs - -
-

Arbitrary keyword arguments.

-
-
- {} -
- -
- Source code in promptolution\predictors\base_predictor.py -
def __init__(self, model_id, classes, *args, **kwargs):
-    """
-    Initialize the BasePredictor.
-
-    Args:
-        model_id (str): Identifier for the model to use.
-        classes (List[str]): List of possible class labels.
-        *args: Variable length argument list.
-        **kwargs: Arbitrary keyword arguments.
-    """
-    self.model_id = model_id
-    self.classes = classes
-
-
- -
- -
- - -

- predict(prompts, xs) - - - abstractmethod - - -

- - -
- -

Abstract method to make predictions based on prompts and input data.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompts - List[str] - -
-

List of prompts to use for prediction.

-
-
- required -
xs - ndarray - -
-

Array of input data.

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- ndarray - -
-

np.ndarray: Array of predictions.

-
-
- - -

Raises:

- - - - - - - - - - - - - -
TypeDescription
- NotImplementedError - -
-

If not implemented by a subclass.

-
-
- -
- Source code in promptolution\predictors\base_predictor.py -
@abstractmethod
-def predict(
-    self,
-    prompts: List[str],
-    xs: np.ndarray,
-) -> np.ndarray:
-    """
-    Abstract method to make predictions based on prompts and input data.
-
-    Args:
-        prompts (List[str]): List of prompts to use for prediction.
-        xs (np.ndarray): Array of input data.
-
-    Returns:
-        np.ndarray: Array of predictions.
-
-    Raises:
-        NotImplementedError: If not implemented by a subclass.
-    """
-    raise NotImplementedError
-
-
- -
- - - -
- -
- -
- -
- - - -

- DummyPredictor - - -

- - -
-

- Bases: BasePredictor

- - -

A dummy predictor implementation for testing purposes.

-

This predictor generates random predictions from the list of possible classes.

- - -

Attributes:

- - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
model_id - str - -
-

Always set to "dummy".

-
-
classes - List[str] - -
-

List of possible class labels.

-
-
- - -

Methods:

- - - - - - - - - - - - - -
NameDescription
predict -
-

Generates random predictions for the given prompts and input data.

-
-
- -
- Source code in promptolution\predictors\base_predictor.py -
class DummyPredictor(BasePredictor):
-    """
-    A dummy predictor implementation for testing purposes.
-
-    This predictor generates random predictions from the list of possible classes.
-
-    Attributes:
-        model_id (str): Always set to "dummy".
-        classes (List[str]): List of possible class labels.
-
-    Methods:
-        predict: Generates random predictions for the given prompts and input data.
-    """
-    def __init__(self, model_id, classes, *args, **kwargs):
-        self.model_id = "dummy"
-        self.classes = classes
-
-    def predict(
-        self,
-        prompts: List[str],
-        xs: np.ndarray,
-    ) -> np.ndarray:
-        """
-        Generate random predictions for the given prompts and input data.
-
-        Args:
-            prompts (List[str]): List of prompts (ignored in this implementation).
-            xs (np.ndarray): Array of input data (only the length is used).
-
-        Returns:
-            np.ndarray: 2D array of random predictions, shape (len(prompts), len(xs)).
-        """
-        return np.array([np.random.choice(self.classes, len(xs)) for _ in prompts])
-
- - - -
- - - - - - - - - -
- - -

- predict(prompts, xs) - -

- - -
- -

Generate random predictions for the given prompts and input data.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompts - List[str] - -
-

List of prompts (ignored in this implementation).

-
-
- required -
xs - ndarray - -
-

Array of input data (only the length is used).

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- ndarray - -
-

np.ndarray: 2D array of random predictions, shape (len(prompts), len(xs)).

-
-
- -
- Source code in promptolution\predictors\base_predictor.py -
def predict(
-    self,
-    prompts: List[str],
-    xs: np.ndarray,
-) -> np.ndarray:
-    """
-    Generate random predictions for the given prompts and input data.
-
-    Args:
-        prompts (List[str]): List of prompts (ignored in this implementation).
-        xs (np.ndarray): Array of input data (only the length is used).
-
-    Returns:
-        np.ndarray: 2D array of random predictions, shape (len(prompts), len(xs)).
-    """
-    return np.array([np.random.choice(self.classes, len(xs)) for _ in prompts])
-
-
- -
- - - -
- -
- -
- - - - -
- -
- -

Classifier

- - -
- - - - -
- - - -
- - - - - - - - -
- - - -

- Classificator - - -

- - -
-

- Bases: BasePredictor

- - -

A predictor class for classification tasks using language models.

-

This class takes a language model and a list of classes, and provides a method -to predict classes for given prompts and input data.

- - -

Attributes:

- - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
llm - -
-

The language model used for generating predictions.

-
-
classes - List[str] - -
-

The list of valid class labels.

-
-
- - -
- Inherits from -

BasePredictor: The base class for predictors in the promptolution library.

-
-
- Source code in promptolution\predictors\classificator.py -
class Classificator(BasePredictor):
-    """
-    A predictor class for classification tasks using language models.
-
-    This class takes a language model and a list of classes, and provides a method
-    to predict classes for given prompts and input data.
-
-    Attributes:
-        llm: The language model used for generating predictions.
-        classes (List[str]): The list of valid class labels.
-
-    Inherits from:
-        BasePredictor: The base class for predictors in the promptolution library.
-    """
-    def __init__(self, llm, classes, *args, **kwargs):
-        """
-        Initialize the Classificator.
-
-        Args:
-            llm: The language model to use for predictions.
-            classes (List[str]): The list of valid class labels.
-        """
-        self.llm = llm
-        self.classes = classes
-
-    def predict(
-        self,
-        prompts: List[str],
-        xs: np.ndarray,
-    ) -> np.ndarray:
-        """
-        Predict classes for given prompts and input data.
-
-        This method generates predictions using the language model and then
-        extracts the predicted class from the model's output.
-
-        Args:
-            prompts (List[str]): The list of prompts to use for prediction.
-            xs (np.ndarray): The input data array.
-
-        Returns:
-            np.ndarray: A 2D array of predicted classes, with shape (len(prompts), len(xs)).
-
-        Note:
-            The method concatenates each prompt with each input data point,
-            passes it to the language model, and then extracts the first word
-            in the response that matches a class in self.classes.
-        """
-        if isinstance(prompts, str):
-            prompts = [prompts]
-
-        preds = self.llm.get_response([prompt + "\n" + x for prompt in prompts for x in xs])
-
-        response = []
-        for pred in preds:
-            predicted_class = ""
-            for word in pred.split(" "):
-                word = "".join([c for c in word if c.isalpha()])
-                if word in self.classes:
-                    predicted_class = word
-                    break
-
-            response.append(predicted_class)
-
-        response = np.array(response).reshape(len(prompts), len(xs))
-        return response
-
- - - -
- - - - - - - - - -
- - -

- __init__(llm, classes, *args, **kwargs) - -

- - -
- -

Initialize the Classificator.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
llm - -
-

The language model to use for predictions.

-
-
- required -
classes - List[str] - -
-

The list of valid class labels.

-
-
- required -
- -
- Source code in promptolution\predictors\classificator.py -
def __init__(self, llm, classes, *args, **kwargs):
-    """
-    Initialize the Classificator.
-
-    Args:
-        llm: The language model to use for predictions.
-        classes (List[str]): The list of valid class labels.
-    """
-    self.llm = llm
-    self.classes = classes
-
-
- -
- -
- - -

- predict(prompts, xs) - -

- - -
- -

Predict classes for given prompts and input data.

-

This method generates predictions using the language model and then -extracts the predicted class from the model's output.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompts - List[str] - -
-

The list of prompts to use for prediction.

-
-
- required -
xs - ndarray - -
-

The input data array.

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- ndarray - -
-

np.ndarray: A 2D array of predicted classes, with shape (len(prompts), len(xs)).

-
-
- - -
- Note -

The method concatenates each prompt with each input data point, -passes it to the language model, and then extracts the first word -in the response that matches a class in self.classes.

-
-
- Source code in promptolution\predictors\classificator.py -
def predict(
-    self,
-    prompts: List[str],
-    xs: np.ndarray,
-) -> np.ndarray:
-    """
-    Predict classes for given prompts and input data.
-
-    This method generates predictions using the language model and then
-    extracts the predicted class from the model's output.
-
-    Args:
-        prompts (List[str]): The list of prompts to use for prediction.
-        xs (np.ndarray): The input data array.
-
-    Returns:
-        np.ndarray: A 2D array of predicted classes, with shape (len(prompts), len(xs)).
-
-    Note:
-        The method concatenates each prompt with each input data point,
-        passes it to the language model, and then extracts the first word
-        in the response that matches a class in self.classes.
-    """
-    if isinstance(prompts, str):
-        prompts = [prompts]
-
-    preds = self.llm.get_response([prompt + "\n" + x for prompt in prompts for x in xs])
-
-    response = []
-    for pred in preds:
-        predicted_class = ""
-        for word in pred.split(" "):
-            word = "".join([c for c in word if c.isalpha()])
-            if word in self.classes:
-                predicted_class = word
-                break
-
-        response.append(predicted_class)
-
-    response = np.array(response).reshape(len(prompts), len(xs))
-    return response
-
-
- -
- - - -
- -
- -
- - - - -
- -
- -
-
-
- - - - - - - - - - - diff --git a/site/api/tasks/index.html b/site/api/tasks/index.html deleted file mode 100644 index 5ef9704..0000000 --- a/site/api/tasks/index.html +++ /dev/null @@ -1,2603 +0,0 @@ - - - - - - - - - - - Tasks - Promptolution Documentation - - - - - - - - - - - - - - - - -
-
-
-
- -

Tasks

-

This module contains task-specific implementations.

- - -
- - - - -
- - - -
- - - - - - - - - -
- - -

- get_tasks(config, split='dev') - -

- - -
- -

Create and return a list of task instances based on the provided configuration.

-

This function supports creating multiple tasks, including a special 'dummy' task -for testing purposes and classification tasks based on JSON descriptions.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
config - -
-

Configuration object containing task settings. - Expected attributes: - - task_name (str): Comma-separated list of task names. - - ds_path (str): Path to the dataset directory. - - random_seed (int): Seed for random number generation.

-
-
- required -
split - Literal['dev', 'test'] - -
-

Dataset split to use. Defaults to "dev".

-
-
- 'dev' -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- List[BaseTask] - -
-

List[BaseTask]: A list of instantiated task objects.

-
-
- - -

Raises:

- - - - - - - - - - - - - - - - - -
TypeDescription
- FileNotFoundError - -
-

If the task description file is not found.

-
-
- JSONDecodeError - -
-

If the task description file is not valid JSON.

-
-
- - -
- Notes -
    -
  • The 'dummy' task is a special case that creates a DummyTask instance.
  • -
  • For all other tasks, a ClassificationTask instance is created.
  • -
  • The task description is loaded from a 'description.json' file in the dataset path.
  • -
-
-
- Source code in promptolution\tasks\__init__.py -
def get_tasks(config, split: Literal["dev", "test"] = "dev") -> List[BaseTask]:
-    """
-    Create and return a list of task instances based on the provided configuration.
-
-    This function supports creating multiple tasks, including a special 'dummy' task
-    for testing purposes and classification tasks based on JSON descriptions.
-
-    Args:
-        config: Configuration object containing task settings.
-                Expected attributes:
-                - task_name (str): Comma-separated list of task names.
-                - ds_path (str): Path to the dataset directory.
-                - random_seed (int): Seed for random number generation.
-        split (Literal["dev", "test"], optional): Dataset split to use. Defaults to "dev".
-
-    Returns:
-        List[BaseTask]: A list of instantiated task objects.
-
-    Raises:
-        FileNotFoundError: If the task description file is not found.
-        json.JSONDecodeError: If the task description file is not valid JSON.
-
-    Notes:
-        - The 'dummy' task is a special case that creates a DummyTask instance.
-        - For all other tasks, a ClassificationTask instance is created.
-        - The task description is loaded from a 'description.json' file in the dataset path.
-    """
-    task_names = config.task_name.split(",")
-
-    task_list = []
-    for task_name in task_names:
-        task_description_path = Path(config.ds_path) / Path("description.json")
-        task_description = json.loads(task_description_path.read_text())
-        if task_name == "dummy":
-            task = DummyTask()
-            task_list.append(task)
-            continue
-        task = ClassificationTask(task_name, task_description, split=split, seed=config.random_seed)
-        task_list.append(task)
-
-    return task_list
-
-
- -
- - -
- - - -

- base_task - - -

- -
- - - -
- - - - - - - - -
- - - -

- BaseTask - - -

- - -
-

- Bases: ABC

- - -

Abstract base class for tasks in the promptolution library.

-

This class defines the interface that all concrete task implementations should follow.

- - -

Methods:

- - - - - - - - - - - - - -
NameDescription
evaluate -
-

An abstract method that should be implemented by subclasses - to evaluate prompts using a given predictor.

-
-
- -
- Source code in promptolution\tasks\base_task.py -
class BaseTask(ABC):
-    """
-    Abstract base class for tasks in the promptolution library.
-
-    This class defines the interface that all concrete task implementations should follow.
-
-    Methods:
-        evaluate: An abstract method that should be implemented by subclasses
-                  to evaluate prompts using a given predictor.
-    """
-    def __init__(self, *args, **kwargs):
-        pass
-
-    @abstractmethod
-    def evaluate(self, prompts: List[str], predictor) -> np.ndarray:
-        """
-        Abstract method to evaluate prompts using a given predictor.
-
-        Args:
-            prompts (List[str]): List of prompts to evaluate.
-            predictor: The predictor to use for evaluation.
-
-        Returns:
-            np.ndarray: Array of evaluation scores for each prompt.
-
-        Raises:
-            NotImplementedError: If not implemented by a subclass.
-        """
-        raise NotImplementedError
-
- - - -
- - - - - - - - - -
- - -

- evaluate(prompts, predictor) - - - abstractmethod - - -

- - -
- -

Abstract method to evaluate prompts using a given predictor.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompts - List[str] - -
-

List of prompts to evaluate.

-
-
- required -
predictor - -
-

The predictor to use for evaluation.

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- ndarray - -
-

np.ndarray: Array of evaluation scores for each prompt.

-
-
- - -

Raises:

- - - - - - - - - - - - - -
TypeDescription
- NotImplementedError - -
-

If not implemented by a subclass.

-
-
- -
- Source code in promptolution\tasks\base_task.py -
@abstractmethod
-def evaluate(self, prompts: List[str], predictor) -> np.ndarray:
-    """
-    Abstract method to evaluate prompts using a given predictor.
-
-    Args:
-        prompts (List[str]): List of prompts to evaluate.
-        predictor: The predictor to use for evaluation.
-
-    Returns:
-        np.ndarray: Array of evaluation scores for each prompt.
-
-    Raises:
-        NotImplementedError: If not implemented by a subclass.
-    """
-    raise NotImplementedError
-
-
- -
- - - -
- -
- -
- -
- - - -

- DummyTask - - -

- - -
-

- Bases: BaseTask

- - -

A dummy task implementation for testing purposes.

-

This task generates random evaluation scores for given prompts.

- - -

Attributes:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
task_id - str - -
-

Identifier for the task, set to "dummy".

-
-
dataset_json - None - -
-

Placeholder for dataset information.

-
-
initial_population - List[str] - -
-

List of initial prompts.

-
-
description - str - -
-

Description of the dummy task.

-
-
xs - ndarray - -
-

Array of dummy input data.

-
-
ys - ndarray - -
-

Array of dummy labels.

-
-
classes - List[str] - -
-

List of possible class labels.

-
-
- -
- Source code in promptolution\tasks\base_task.py -
class DummyTask(BaseTask):
-    """
-    A dummy task implementation for testing purposes.
-
-    This task generates random evaluation scores for given prompts.
-
-    Attributes:
-        task_id (str): Identifier for the task, set to "dummy".
-        dataset_json (None): Placeholder for dataset information.
-        initial_population (List[str]): List of initial prompts.
-        description (str): Description of the dummy task.
-        xs (np.ndarray): Array of dummy input data.
-        ys (np.ndarray): Array of dummy labels.
-        classes (List[str]): List of possible class labels.
-    """
-    def __init__(self):
-        self.task_id = "dummy"
-        self.dataset_json = None
-        self.initial_population = ["Some", "initial", "prompts", "that", "will", "do", "the", "trick"]
-        self.description = "This is a dummy task for testing purposes."
-        self.xs = np.array(["This is a test", "This is another test", "This is a third test"])
-        self.ys = np.array(["positive", "negative", "positive"])
-        self.classes = ["negative", "positive"]
-
-    def evaluate(self, prompts: List[str], predictor) -> np.ndarray:
-        """
-        Generate random evaluation scores for the given prompts.
-
-        Args:
-            prompts (List[str]): List of prompts to evaluate.
-            predictor: The predictor to use for evaluation (ignored in this implementation).
-
-        Returns:
-            np.ndarray: Array of random evaluation scores, one for each prompt.
-        """
-        return np.array([np.random.rand()] * len(prompts))
-
- - - -
- - - - - - - - - -
- - -

- evaluate(prompts, predictor) - -

- - -
- -

Generate random evaluation scores for the given prompts.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompts - List[str] - -
-

List of prompts to evaluate.

-
-
- required -
predictor - -
-

The predictor to use for evaluation (ignored in this implementation).

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- ndarray - -
-

np.ndarray: Array of random evaluation scores, one for each prompt.

-
-
- -
- Source code in promptolution\tasks\base_task.py -
def evaluate(self, prompts: List[str], predictor) -> np.ndarray:
-    """
-    Generate random evaluation scores for the given prompts.
-
-    Args:
-        prompts (List[str]): List of prompts to evaluate.
-        predictor: The predictor to use for evaluation (ignored in this implementation).
-
-    Returns:
-        np.ndarray: Array of random evaluation scores, one for each prompt.
-    """
-    return np.array([np.random.rand()] * len(prompts))
-
-
- -
- - - -
- -
- -
- - - - -
- -
- -
- -
- - - -

- classification_tasks - - -

- -
- - - -
- - - - - - - - -
- - - -

- ClassificationTask - - -

- - -
-

- Bases: BaseTask

- - -

A class representing a classification task in the promptolution library.

-

This class handles the loading and management of classification datasets, -as well as the evaluation of predictors on these datasets.

- - -

Attributes:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
task_id - str - -
-

Unique identifier for the task.

-
-
dataset_json - Dict - -
-

Dictionary containing dataset information.

-
-
description - Optional[str] - -
-

Description of the task.

-
-
initial_population - Optional[List[str]] - -
-

Initial set of prompts.

-
-
xs - Optional[ndarray] - -
-

Input data for the task.

-
-
ys - Optional[ndarray] - -
-

Ground truth labels for the task.

-
-
classes - Optional[List] - -
-

List of possible class labels.

-
-
split - Literal['dev', 'test'] - -
-

Dataset split to use.

-
-
seed - int - -
-

Random seed for reproducibility.

-
-
- - -
- Inherits from -

BaseTask: The base class for tasks in the promptolution library.

-
-
- Source code in promptolution\tasks\classification_tasks.py -
class ClassificationTask(BaseTask):
-    """
-    A class representing a classification task in the promptolution library.
-
-    This class handles the loading and management of classification datasets,
-    as well as the evaluation of predictors on these datasets.
-
-    Attributes:
-        task_id (str): Unique identifier for the task.
-        dataset_json (Dict): Dictionary containing dataset information.
-        description (Optional[str]): Description of the task.
-        initial_population (Optional[List[str]]): Initial set of prompts.
-        xs (Optional[np.ndarray]): Input data for the task.
-        ys (Optional[np.ndarray]): Ground truth labels for the task.
-        classes (Optional[List]): List of possible class labels.
-        split (Literal["dev", "test"]): Dataset split to use.
-        seed (int): Random seed for reproducibility.
-
-    Inherits from:
-        BaseTask: The base class for tasks in the promptolution library.
-    """
-    def __init__(self, task_id: str, dataset_json: Dict, seed: int = 42, split: Literal["dev", "test"] = "dev"): 
-        """
-        Initialize the ClassificationTask.
-
-        Args:
-            task_id (str): Unique identifier for the task.
-            dataset_json (Dict): Dictionary containing dataset information.
-            seed (int, optional): Random seed for reproducibility. Defaults to 42.
-            split (Literal["dev", "test"], optional): Dataset split to use. Defaults to "dev".
-        """
-        self.task_id: str = task_id
-        self.dataset_json: Dict = dataset_json
-        self.description: Optional[str] = None
-        self.initial_population: Optional[List[str]] = None
-        self.xs: Optional[np.ndarray] = np.array([])
-        self.ys: Optional[np.ndarray] = None
-        self.classes: Optional[List] = None
-        self.split: Literal["dev", "test"] = split
-        self._parse_task()
-        self.reset_seed(seed)
-
-    def __str__(self):
-        return self.task_id
-
-    def _parse_task(self):
-        """
-        Parse the task data from the provided dataset JSON.
-
-        This method loads the task description, classes, initial prompts,
-        and the dataset split (dev or test) into the class attributes.
-        """
-        task_path = Path(self.dataset_json["path"])
-        self.description = self.dataset_json["description"]
-        self.classes = self.dataset_json["classes"]
-
-        with open(task_path / Path(self.dataset_json["init_prompts"]), "r", encoding="utf-8") as file:
-            lines = file.readlines()
-        self.initial_population = [line.strip() for line in lines]
-
-        seed = Path(self.dataset_json["seed"])
-        split = Path(self.split + ".txt")
-
-        with open(task_path / seed / split, "r", encoding="utf-8") as file:
-            lines = file.readlines()
-        lines = [line.strip() for line in lines]
-
-        xs = []
-        ys = []
-
-        for line in lines:
-            x, y = line.split("\t")
-            xs.append(x)
-            ys.append(self.classes[int(y)])
-
-        self.xs = np.array(xs)
-        self.ys = np.array(ys)
-
-    def evaluate(
-        self, prompts: List[str], predictor: BasePredictor, n_samples: int = 20, subsample: bool = True
-    ) -> np.ndarray: 
-        """
-        Evaluate a set of prompts using a given predictor.
-
-        Args:
-            prompts (List[str]): List of prompts to evaluate.
-            predictor (BasePredictor): Predictor to use for evaluation.
-            n_samples (int, optional): Number of samples to use if subsampling. Defaults to 20.
-            subsample (bool, optional): Whether to use subsampling. Defaults to True.
-
-        Returns:
-            np.ndarray: Array of accuracy scores for each prompt.
-        """
-        if isinstance(prompts, str):
-            prompts = [prompts]
-        # Randomly select a subsample of n_samples
-        if subsample:
-            indices = np.random.choice(len(self.xs), n_samples, replace=False)
-        else:
-            indices = np.arange(len(self.xs))
-
-        xs_subsample = self.xs[indices]
-        ys_subsample = self.ys[indices]
-
-        # Make predictions on the subsample
-        preds = predictor.predict(prompts, xs_subsample)
-
-        # Calculate accuracy: number of correct predictions / total number of predictions per prompt
-        return np.mean(preds == ys_subsample, axis=1)
-
-    def reset_seed(self, seed: int = None):
-        if seed is not None:
-            self.seed = seed
-        np.random.seed(self.seed)
-
- - - -
- - - - - - - - - -
- - -

- __init__(task_id, dataset_json, seed=42, split='dev') - -

- - -
- -

Initialize the ClassificationTask.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
task_id - str - -
-

Unique identifier for the task.

-
-
- required -
dataset_json - Dict - -
-

Dictionary containing dataset information.

-
-
- required -
seed - int - -
-

Random seed for reproducibility. Defaults to 42.

-
-
- 42 -
split - Literal['dev', 'test'] - -
-

Dataset split to use. Defaults to "dev".

-
-
- 'dev' -
- -
- Source code in promptolution\tasks\classification_tasks.py -
def __init__(self, task_id: str, dataset_json: Dict, seed: int = 42, split: Literal["dev", "test"] = "dev"): 
-    """
-    Initialize the ClassificationTask.
-
-    Args:
-        task_id (str): Unique identifier for the task.
-        dataset_json (Dict): Dictionary containing dataset information.
-        seed (int, optional): Random seed for reproducibility. Defaults to 42.
-        split (Literal["dev", "test"], optional): Dataset split to use. Defaults to "dev".
-    """
-    self.task_id: str = task_id
-    self.dataset_json: Dict = dataset_json
-    self.description: Optional[str] = None
-    self.initial_population: Optional[List[str]] = None
-    self.xs: Optional[np.ndarray] = np.array([])
-    self.ys: Optional[np.ndarray] = None
-    self.classes: Optional[List] = None
-    self.split: Literal["dev", "test"] = split
-    self._parse_task()
-    self.reset_seed(seed)
-
-
- -
- -
- - -

- evaluate(prompts, predictor, n_samples=20, subsample=True) - -

- - -
- -

Evaluate a set of prompts using a given predictor.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompts - List[str] - -
-

List of prompts to evaluate.

-
-
- required -
predictor - BasePredictor - -
-

Predictor to use for evaluation.

-
-
- required -
n_samples - int - -
-

Number of samples to use if subsampling. Defaults to 20.

-
-
- 20 -
subsample - bool - -
-

Whether to use subsampling. Defaults to True.

-
-
- True -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- ndarray - -
-

np.ndarray: Array of accuracy scores for each prompt.

-
-
- -
- Source code in promptolution\tasks\classification_tasks.py -
def evaluate(
-    self, prompts: List[str], predictor: BasePredictor, n_samples: int = 20, subsample: bool = True
-) -> np.ndarray: 
-    """
-    Evaluate a set of prompts using a given predictor.
-
-    Args:
-        prompts (List[str]): List of prompts to evaluate.
-        predictor (BasePredictor): Predictor to use for evaluation.
-        n_samples (int, optional): Number of samples to use if subsampling. Defaults to 20.
-        subsample (bool, optional): Whether to use subsampling. Defaults to True.
-
-    Returns:
-        np.ndarray: Array of accuracy scores for each prompt.
-    """
-    if isinstance(prompts, str):
-        prompts = [prompts]
-    # Randomly select a subsample of n_samples
-    if subsample:
-        indices = np.random.choice(len(self.xs), n_samples, replace=False)
-    else:
-        indices = np.arange(len(self.xs))
-
-    xs_subsample = self.xs[indices]
-    ys_subsample = self.ys[indices]
-
-    # Make predictions on the subsample
-    preds = predictor.predict(prompts, xs_subsample)
-
-    # Calculate accuracy: number of correct predictions / total number of predictions per prompt
-    return np.mean(preds == ys_subsample, axis=1)
-
-
- -
- - - -
- -
- -
- - - - -
- -
- -
- - -
- -
- -

Base Task

- - -
- - - - -
- - - -
- - - - - - - - -
- - - -

- BaseTask - - -

- - -
-

- Bases: ABC

- - -

Abstract base class for tasks in the promptolution library.

-

This class defines the interface that all concrete task implementations should follow.

- - -

Methods:

- - - - - - - - - - - - - -
NameDescription
evaluate -
-

An abstract method that should be implemented by subclasses - to evaluate prompts using a given predictor.

-
-
- -
- Source code in promptolution\tasks\base_task.py -
class BaseTask(ABC):
-    """
-    Abstract base class for tasks in the promptolution library.
-
-    This class defines the interface that all concrete task implementations should follow.
-
-    Methods:
-        evaluate: An abstract method that should be implemented by subclasses
-                  to evaluate prompts using a given predictor.
-    """
-    def __init__(self, *args, **kwargs):
-        pass
-
-    @abstractmethod
-    def evaluate(self, prompts: List[str], predictor) -> np.ndarray:
-        """
-        Abstract method to evaluate prompts using a given predictor.
-
-        Args:
-            prompts (List[str]): List of prompts to evaluate.
-            predictor: The predictor to use for evaluation.
-
-        Returns:
-            np.ndarray: Array of evaluation scores for each prompt.
-
-        Raises:
-            NotImplementedError: If not implemented by a subclass.
-        """
-        raise NotImplementedError
-
- - - -
- - - - - - - - - -
- - -

- evaluate(prompts, predictor) - - - abstractmethod - - -

- - -
- -

Abstract method to evaluate prompts using a given predictor.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompts - List[str] - -
-

List of prompts to evaluate.

-
-
- required -
predictor - -
-

The predictor to use for evaluation.

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- ndarray - -
-

np.ndarray: Array of evaluation scores for each prompt.

-
-
- - -

Raises:

- - - - - - - - - - - - - -
TypeDescription
- NotImplementedError - -
-

If not implemented by a subclass.

-
-
- -
- Source code in promptolution\tasks\base_task.py -
@abstractmethod
-def evaluate(self, prompts: List[str], predictor) -> np.ndarray:
-    """
-    Abstract method to evaluate prompts using a given predictor.
-
-    Args:
-        prompts (List[str]): List of prompts to evaluate.
-        predictor: The predictor to use for evaluation.
-
-    Returns:
-        np.ndarray: Array of evaluation scores for each prompt.
-
-    Raises:
-        NotImplementedError: If not implemented by a subclass.
-    """
-    raise NotImplementedError
-
-
- -
- - - -
- -
- -
- -
- - - -

- DummyTask - - -

- - -
-

- Bases: BaseTask

- - -

A dummy task implementation for testing purposes.

-

This task generates random evaluation scores for given prompts.

- - -

Attributes:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
task_id - str - -
-

Identifier for the task, set to "dummy".

-
-
dataset_json - None - -
-

Placeholder for dataset information.

-
-
initial_population - List[str] - -
-

List of initial prompts.

-
-
description - str - -
-

Description of the dummy task.

-
-
xs - ndarray - -
-

Array of dummy input data.

-
-
ys - ndarray - -
-

Array of dummy labels.

-
-
classes - List[str] - -
-

List of possible class labels.

-
-
- -
- Source code in promptolution\tasks\base_task.py -
class DummyTask(BaseTask):
-    """
-    A dummy task implementation for testing purposes.
-
-    This task generates random evaluation scores for given prompts.
-
-    Attributes:
-        task_id (str): Identifier for the task, set to "dummy".
-        dataset_json (None): Placeholder for dataset information.
-        initial_population (List[str]): List of initial prompts.
-        description (str): Description of the dummy task.
-        xs (np.ndarray): Array of dummy input data.
-        ys (np.ndarray): Array of dummy labels.
-        classes (List[str]): List of possible class labels.
-    """
-    def __init__(self):
-        self.task_id = "dummy"
-        self.dataset_json = None
-        self.initial_population = ["Some", "initial", "prompts", "that", "will", "do", "the", "trick"]
-        self.description = "This is a dummy task for testing purposes."
-        self.xs = np.array(["This is a test", "This is another test", "This is a third test"])
-        self.ys = np.array(["positive", "negative", "positive"])
-        self.classes = ["negative", "positive"]
-
-    def evaluate(self, prompts: List[str], predictor) -> np.ndarray:
-        """
-        Generate random evaluation scores for the given prompts.
-
-        Args:
-            prompts (List[str]): List of prompts to evaluate.
-            predictor: The predictor to use for evaluation (ignored in this implementation).
-
-        Returns:
-            np.ndarray: Array of random evaluation scores, one for each prompt.
-        """
-        return np.array([np.random.rand()] * len(prompts))
-
- - - -
- - - - - - - - - -
- - -

- evaluate(prompts, predictor) - -

- - -
- -

Generate random evaluation scores for the given prompts.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompts - List[str] - -
-

List of prompts to evaluate.

-
-
- required -
predictor - -
-

The predictor to use for evaluation (ignored in this implementation).

-
-
- required -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- ndarray - -
-

np.ndarray: Array of random evaluation scores, one for each prompt.

-
-
- -
- Source code in promptolution\tasks\base_task.py -
def evaluate(self, prompts: List[str], predictor) -> np.ndarray:
-    """
-    Generate random evaluation scores for the given prompts.
-
-    Args:
-        prompts (List[str]): List of prompts to evaluate.
-        predictor: The predictor to use for evaluation (ignored in this implementation).
-
-    Returns:
-        np.ndarray: Array of random evaluation scores, one for each prompt.
-    """
-    return np.array([np.random.rand()] * len(prompts))
-
-
- -
- - - -
- -
- -
- - - - -
- -
- -

Classification Tasks

- - -
- - - - -
- - - -
- - - - - - - - -
- - - -

- ClassificationTask - - -

- - -
-

- Bases: BaseTask

- - -

A class representing a classification task in the promptolution library.

-

This class handles the loading and management of classification datasets, -as well as the evaluation of predictors on these datasets.

- - -

Attributes:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescription
task_id - str - -
-

Unique identifier for the task.

-
-
dataset_json - Dict - -
-

Dictionary containing dataset information.

-
-
description - Optional[str] - -
-

Description of the task.

-
-
initial_population - Optional[List[str]] - -
-

Initial set of prompts.

-
-
xs - Optional[ndarray] - -
-

Input data for the task.

-
-
ys - Optional[ndarray] - -
-

Ground truth labels for the task.

-
-
classes - Optional[List] - -
-

List of possible class labels.

-
-
split - Literal['dev', 'test'] - -
-

Dataset split to use.

-
-
seed - int - -
-

Random seed for reproducibility.

-
-
- - -
- Inherits from -

BaseTask: The base class for tasks in the promptolution library.

-
-
- Source code in promptolution\tasks\classification_tasks.py -
class ClassificationTask(BaseTask):
-    """
-    A class representing a classification task in the promptolution library.
-
-    This class handles the loading and management of classification datasets,
-    as well as the evaluation of predictors on these datasets.
-
-    Attributes:
-        task_id (str): Unique identifier for the task.
-        dataset_json (Dict): Dictionary containing dataset information.
-        description (Optional[str]): Description of the task.
-        initial_population (Optional[List[str]]): Initial set of prompts.
-        xs (Optional[np.ndarray]): Input data for the task.
-        ys (Optional[np.ndarray]): Ground truth labels for the task.
-        classes (Optional[List]): List of possible class labels.
-        split (Literal["dev", "test"]): Dataset split to use.
-        seed (int): Random seed for reproducibility.
-
-    Inherits from:
-        BaseTask: The base class for tasks in the promptolution library.
-    """
-    def __init__(self, task_id: str, dataset_json: Dict, seed: int = 42, split: Literal["dev", "test"] = "dev"): 
-        """
-        Initialize the ClassificationTask.
-
-        Args:
-            task_id (str): Unique identifier for the task.
-            dataset_json (Dict): Dictionary containing dataset information.
-            seed (int, optional): Random seed for reproducibility. Defaults to 42.
-            split (Literal["dev", "test"], optional): Dataset split to use. Defaults to "dev".
-        """
-        self.task_id: str = task_id
-        self.dataset_json: Dict = dataset_json
-        self.description: Optional[str] = None
-        self.initial_population: Optional[List[str]] = None
-        self.xs: Optional[np.ndarray] = np.array([])
-        self.ys: Optional[np.ndarray] = None
-        self.classes: Optional[List] = None
-        self.split: Literal["dev", "test"] = split
-        self._parse_task()
-        self.reset_seed(seed)
-
-    def __str__(self):
-        return self.task_id
-
-    def _parse_task(self):
-        """
-        Parse the task data from the provided dataset JSON.
-
-        This method loads the task description, classes, initial prompts,
-        and the dataset split (dev or test) into the class attributes.
-        """
-        task_path = Path(self.dataset_json["path"])
-        self.description = self.dataset_json["description"]
-        self.classes = self.dataset_json["classes"]
-
-        with open(task_path / Path(self.dataset_json["init_prompts"]), "r", encoding="utf-8") as file:
-            lines = file.readlines()
-        self.initial_population = [line.strip() for line in lines]
-
-        seed = Path(self.dataset_json["seed"])
-        split = Path(self.split + ".txt")
-
-        with open(task_path / seed / split, "r", encoding="utf-8") as file:
-            lines = file.readlines()
-        lines = [line.strip() for line in lines]
-
-        xs = []
-        ys = []
-
-        for line in lines:
-            x, y = line.split("\t")
-            xs.append(x)
-            ys.append(self.classes[int(y)])
-
-        self.xs = np.array(xs)
-        self.ys = np.array(ys)
-
-    def evaluate(
-        self, prompts: List[str], predictor: BasePredictor, n_samples: int = 20, subsample: bool = True
-    ) -> np.ndarray: 
-        """
-        Evaluate a set of prompts using a given predictor.
-
-        Args:
-            prompts (List[str]): List of prompts to evaluate.
-            predictor (BasePredictor): Predictor to use for evaluation.
-            n_samples (int, optional): Number of samples to use if subsampling. Defaults to 20.
-            subsample (bool, optional): Whether to use subsampling. Defaults to True.
-
-        Returns:
-            np.ndarray: Array of accuracy scores for each prompt.
-        """
-        if isinstance(prompts, str):
-            prompts = [prompts]
-        # Randomly select a subsample of n_samples
-        if subsample:
-            indices = np.random.choice(len(self.xs), n_samples, replace=False)
-        else:
-            indices = np.arange(len(self.xs))
-
-        xs_subsample = self.xs[indices]
-        ys_subsample = self.ys[indices]
-
-        # Make predictions on the subsample
-        preds = predictor.predict(prompts, xs_subsample)
-
-        # Calculate accuracy: number of correct predictions / total number of predictions per prompt
-        return np.mean(preds == ys_subsample, axis=1)
-
-    def reset_seed(self, seed: int = None):
-        if seed is not None:
-            self.seed = seed
-        np.random.seed(self.seed)
-
- - - -
- - - - - - - - - -
- - -

- __init__(task_id, dataset_json, seed=42, split='dev') - -

- - -
- -

Initialize the ClassificationTask.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
task_id - str - -
-

Unique identifier for the task.

-
-
- required -
dataset_json - Dict - -
-

Dictionary containing dataset information.

-
-
- required -
seed - int - -
-

Random seed for reproducibility. Defaults to 42.

-
-
- 42 -
split - Literal['dev', 'test'] - -
-

Dataset split to use. Defaults to "dev".

-
-
- 'dev' -
- -
- Source code in promptolution\tasks\classification_tasks.py -
def __init__(self, task_id: str, dataset_json: Dict, seed: int = 42, split: Literal["dev", "test"] = "dev"): 
-    """
-    Initialize the ClassificationTask.
-
-    Args:
-        task_id (str): Unique identifier for the task.
-        dataset_json (Dict): Dictionary containing dataset information.
-        seed (int, optional): Random seed for reproducibility. Defaults to 42.
-        split (Literal["dev", "test"], optional): Dataset split to use. Defaults to "dev".
-    """
-    self.task_id: str = task_id
-    self.dataset_json: Dict = dataset_json
-    self.description: Optional[str] = None
-    self.initial_population: Optional[List[str]] = None
-    self.xs: Optional[np.ndarray] = np.array([])
-    self.ys: Optional[np.ndarray] = None
-    self.classes: Optional[List] = None
-    self.split: Literal["dev", "test"] = split
-    self._parse_task()
-    self.reset_seed(seed)
-
-
- -
- -
- - -

- evaluate(prompts, predictor, n_samples=20, subsample=True) - -

- - -
- -

Evaluate a set of prompts using a given predictor.

- - -

Parameters:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
NameTypeDescriptionDefault
prompts - List[str] - -
-

List of prompts to evaluate.

-
-
- required -
predictor - BasePredictor - -
-

Predictor to use for evaluation.

-
-
- required -
n_samples - int - -
-

Number of samples to use if subsampling. Defaults to 20.

-
-
- 20 -
subsample - bool - -
-

Whether to use subsampling. Defaults to True.

-
-
- True -
- - -

Returns:

- - - - - - - - - - - - - -
TypeDescription
- ndarray - -
-

np.ndarray: Array of accuracy scores for each prompt.

-
-
- -
- Source code in promptolution\tasks\classification_tasks.py -
def evaluate(
-    self, prompts: List[str], predictor: BasePredictor, n_samples: int = 20, subsample: bool = True
-) -> np.ndarray: 
-    """
-    Evaluate a set of prompts using a given predictor.
-
-    Args:
-        prompts (List[str]): List of prompts to evaluate.
-        predictor (BasePredictor): Predictor to use for evaluation.
-        n_samples (int, optional): Number of samples to use if subsampling. Defaults to 20.
-        subsample (bool, optional): Whether to use subsampling. Defaults to True.
-
-    Returns:
-        np.ndarray: Array of accuracy scores for each prompt.
-    """
-    if isinstance(prompts, str):
-        prompts = [prompts]
-    # Randomly select a subsample of n_samples
-    if subsample:
-        indices = np.random.choice(len(self.xs), n_samples, replace=False)
-    else:
-        indices = np.arange(len(self.xs))
-
-    xs_subsample = self.xs[indices]
-    ys_subsample = self.ys[indices]
-
-    # Make predictions on the subsample
-    preds = predictor.predict(prompts, xs_subsample)
-
-    # Calculate accuracy: number of correct predictions / total number of predictions per prompt
-    return np.mean(preds == ys_subsample, axis=1)
-
-
- -
- - - -
- -
- -
- - - - -
- -
- -
-
-
- - - - - - - - - - - diff --git a/site/assets/_mkdocstrings.css b/site/assets/_mkdocstrings.css deleted file mode 100644 index 85449ec..0000000 --- a/site/assets/_mkdocstrings.css +++ /dev/null @@ -1,119 +0,0 @@ - -/* Avoid breaking parameter names, etc. in table cells. */ -.doc-contents td code { - word-break: normal !important; -} - -/* No line break before first paragraph of descriptions. */ -.doc-md-description, -.doc-md-description>p:first-child { - display: inline; -} - -/* Max width for docstring sections tables. */ -.doc .md-typeset__table, -.doc .md-typeset__table table { - display: table !important; - width: 100%; -} - -.doc .md-typeset__table tr { - display: table-row; -} - -/* Defaults in Spacy table style. */ -.doc-param-default { - float: right; -} - -/* Backward-compatibility: docstring section titles in bold. */ -.doc-section-title { - font-weight: bold; -} - -/* Symbols in Navigation and ToC. */ -:root, -[data-md-color-scheme="default"] { - --doc-symbol-attribute-fg-color: #953800; - --doc-symbol-function-fg-color: #8250df; - --doc-symbol-method-fg-color: #8250df; - --doc-symbol-class-fg-color: #0550ae; - --doc-symbol-module-fg-color: #5cad0f; - - --doc-symbol-attribute-bg-color: #9538001a; - --doc-symbol-function-bg-color: #8250df1a; - --doc-symbol-method-bg-color: #8250df1a; - --doc-symbol-class-bg-color: #0550ae1a; - --doc-symbol-module-bg-color: #5cad0f1a; -} - -[data-md-color-scheme="slate"] { - --doc-symbol-attribute-fg-color: #ffa657; - --doc-symbol-function-fg-color: #d2a8ff; - --doc-symbol-method-fg-color: #d2a8ff; - --doc-symbol-class-fg-color: #79c0ff; - --doc-symbol-module-fg-color: #baff79; - - --doc-symbol-attribute-bg-color: #ffa6571a; - --doc-symbol-function-bg-color: #d2a8ff1a; - --doc-symbol-method-bg-color: #d2a8ff1a; - --doc-symbol-class-bg-color: #79c0ff1a; - --doc-symbol-module-bg-color: #baff791a; -} - -code.doc-symbol { - border-radius: .1rem; - font-size: .85em; - padding: 0 .3em; - font-weight: bold; -} - -code.doc-symbol-attribute { - color: var(--doc-symbol-attribute-fg-color); - background-color: var(--doc-symbol-attribute-bg-color); -} - -code.doc-symbol-attribute::after { - content: "attr"; -} - -code.doc-symbol-function { - color: var(--doc-symbol-function-fg-color); - background-color: var(--doc-symbol-function-bg-color); -} - -code.doc-symbol-function::after { - content: "func"; -} - -code.doc-symbol-method { - color: var(--doc-symbol-method-fg-color); - background-color: var(--doc-symbol-method-bg-color); -} - -code.doc-symbol-method::after { - content: "meth"; -} - -code.doc-symbol-class { - color: var(--doc-symbol-class-fg-color); - background-color: var(--doc-symbol-class-bg-color); -} - -code.doc-symbol-class::after { - content: "class"; -} - -code.doc-symbol-module { - color: var(--doc-symbol-module-fg-color); - background-color: var(--doc-symbol-module-bg-color); -} - -code.doc-symbol-module::after { - content: "mod"; -} - -.doc-signature .autorefs { - color: inherit; - border-bottom: 1px dotted currentcolor; -} diff --git a/site/css/base.css b/site/css/base.css deleted file mode 100644 index f5f27ba..0000000 --- a/site/css/base.css +++ /dev/null @@ -1,366 +0,0 @@ -html { - /* The nav header is 3.5rem high, plus 20px for the margin-top of the - main container. */ - scroll-padding-top: calc(3.5rem + 20px); -} - -/* Replacement for `body { background-attachment: fixed; }`, which has - performance issues when scrolling on large displays. See #1394. */ -body::before { - content: ' '; - position: fixed; - width: 100%; - height: 100%; - top: 0; - left: 0; - background-color: var(--bs-body-bg); - background: url(../img/grid.png) repeat-x; - will-change: transform; - z-index: -1; -} - -body > .container { - margin-top: 20px; - min-height: 400px; -} - -.navbar.fixed-top { - position: -webkit-sticky; - position: sticky; -} - -.source-links { - float: right; -} - -.col-md-9 img { - max-width: 100%; - display: inline-block; - padding: 4px; - line-height: 1.428571429; - background-color: var(--bs-secondary-bg-subtle); - border: 1px solid var(--bs-secondary-border-subtle); - border-radius: 4px; - margin: 20px auto 30px auto; -} - -h1 { - color: inherit; - font-weight: 400; - font-size: 42px; -} - -h2, h3, h4, h5, h6 { - color: inherit; - font-weight: 300; -} - -hr { - border-top: 1px solid #aaa; - opacity: 1; -} - -pre, .rst-content tt { - max-width: 100%; - background-color: var(--bs-body-bg); - border: solid 1px var(--bs-border-color); - color: var(--bs-body-color); - overflow-x: auto; -} - -code.code-large, .rst-content tt.code-large { - font-size: 90%; -} - -code { - padding: 2px 5px; - background-color: rgba(var(--bs-body-bg-rgb), 0.75); - border: solid 1px var(--bs-border-color); - color: var(--bs-body-color); - white-space: pre-wrap; - word-wrap: break-word; -} - -pre code { - display: block; - border: none; - white-space: pre; - word-wrap: normal; - font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; - font-size: 12px; -} - -kbd { - padding: 2px 4px; - font-size: 90%; - color: var(--bs-secondary-text-emphasis); - background-color: var(--bs-secondary-bg-subtle); - border-radius: 3px; - -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); - box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); -} - -a code { - color: inherit; -} - -a:hover code, a:focus code { - color: inherit; -} - -footer { - margin-top: 30px; - margin-bottom: 10px; - text-align: center; - font-weight: 200; -} - -.modal-dialog { - margin-top: 60px; -} - -/* - * Side navigation - * - * Scrollspy and affixed enhanced navigation to highlight sections and secondary - * sections of docs content. - */ - -.bs-sidebar.affix { - position: -webkit-sticky; - position: sticky; - /* The nav header is 3.5rem high, plus 20px for the margin-top of the - main container. */ - top: calc(3.5rem + 20px); -} - -.bs-sidebar.card { - padding: 0; - max-height: 90%; - overflow-y: auto; -} - -/* Toggle (vertically flip) sidebar collapse icon */ -.bs-sidebar .navbar-toggler span { - -moz-transform: scale(1, -1); - -webkit-transform: scale(1, -1); - -o-transform: scale(1, -1); - -ms-transform: scale(1, -1); - transform: scale(1, -1); -} - -.bs-sidebar .navbar-toggler.collapsed span { - -moz-transform: scale(1, 1); - -webkit-transform: scale(1, 1); - -o-transform: scale(1, 1); - -ms-transform: scale(1, 1); - transform: scale(1, 1); -} - -/* First level of nav */ -.bs-sidebar > .navbar-collapse > .nav { - padding-top: 10px; - padding-bottom: 10px; - border-radius: 5px; - width: 100%; -} - -/* All levels of nav */ -.bs-sidebar .nav > li > a { - display: block; - padding: 5px 20px; - z-index: 1; -} -.bs-sidebar .nav > li > a:hover, -.bs-sidebar .nav > li > a:focus { - text-decoration: none; - border-right: 1px solid; -} -.bs-sidebar .nav > li > a.active, -.bs-sidebar .nav > li > a.active:hover, -.bs-sidebar .nav > li > a.active:focus { - font-weight: bold; - background-color: transparent; - border-right: 1px solid; -} - -.bs-sidebar .nav .nav .nav { - margin-left: 1em; -} - -.bs-sidebar .nav > li > a { - font-weight: bold; -} - -.bs-sidebar .nav .nav > li > a { - font-weight: normal; -} - -.headerlink { - font-family: FontAwesome; - font-size: 14px; - display: none; - padding-left: .5em; - text-decoration: none; - vertical-align: middle; -} - -h1:hover .headerlink, h2:hover .headerlink, h3:hover .headerlink, h4:hover .headerlink, h5:hover .headerlink, h6:hover .headerlink { - display:inline-block; -} - -blockquote { - padding-left: 10px; - border-left: 4px solid #e6e6e6; -} - -.admonition, details { - padding: 15px; - margin-bottom: 20px; - border: 1px solid transparent; - border-radius: 4px; - text-align: left; -} - -.admonition.note, details.note { - color: var(--bs-primary-text-emphasis); - background-color: var(--bs-primary-bg-subtle); - border-color: var(--bs-primary-border-subtle); -} - -.admonition.note h1, .admonition.note h2, .admonition.note h3, -.admonition.note h4, .admonition.note h5, .admonition.note h6, -details.note h1, details.note h2, details.note h3, -details.note h4, details.note h5, details.note h6 { - color: var(--bs-primary-text-emphasis); -} - -.admonition.info, details.info { - color: var(--bs-info-text-emphasis); - background-color: var(--bs-info-bg-subtle); - border-color: var(--bs-info-border-subtle); -} - -.admonition.info h1, .admonition.info h2, .admonition.info h3, -.admonition.info h4, .admonition.info h5, .admonition.info h6, -details.info h1, details.info h2, details.info h3, -details.info h4, details.info h5, details.info h6 { - color: var(--bs-info-text-emphasis); -} - -.admonition.warning, details.warning { - color: var(--bs-warning-text-emphasis); - background-color: var(--bs-warning-bg-subtle); - border-color: var(--bs-warning-border-subtle); -} - -.admonition.warning h1, .admonition.warning h2, .admonition.warning h3, -.admonition.warning h4, .admonition.warning h5, .admonition.warning h6, -details.warning h1, details.warning h2, details.warning h3, -details.warning h4, details.warning h5, details.warning h6 { - color: var(--bs-warning-text-emphasis); -} - -.admonition.danger, details.danger { - color: var(--bs-danger-text-emphasis); - background-color: var(--bs-danger-bg-subtle); - border-color: var(--bs-danger-border-subtle); -} - -.admonition.danger h1, .admonition.danger h2, .admonition.danger h3, -.admonition.danger h4, .admonition.danger h5, .admonition.danger h6, -details.danger h1, details.danger h2, details.danger h3, -details.danger h4, details.danger h5, details.danger h6 { - color: var(--bs-danger-text-emphasis); -} - -.admonition, details { - color: var(--bs-light-text-emphasis); - background-color: var(--bs-light-bg-subtle); - border-color: var(--bs-light-border-subtle); -} - -.admonition h1, .admonition h2, .admonition h3, -.admonition h4, .admonition h5, .admonition h6, -details h1, details h2, details h3, -details h4, details h5, details h6 { - color: var(--bs-light-text-emphasis); -} - -.admonition-title, summary { - font-weight: bold; - text-align: left; -} - -.admonition>p:last-child, details>p:last-child { - margin-bottom: 0; -} - -@media (max-width: 991.98px) { - .navbar-collapse.show { - overflow-y: auto; - max-height: calc(100vh - 3.5rem); - } -} - -.dropdown-item.open { - color: var(--bs-dropdown-link-active-color); - background-color: var(--bs-dropdown-link-active-bg); -} - -.dropdown-submenu > .dropdown-menu { - margin: 0 0 0 1.5rem; - padding: 0; - border-width: 0; -} - -.dropdown-submenu > a::after { - display: block; - content: " "; - float: right; - width: 0; - height: 0; - border-color: transparent; - border-style: solid; - border-width: 5px 0 5px 5px; - border-left-color: var(--bs-dropdown-link-active-color); - margin-top: 5px; - margin-right: -10px; -} - -.dropdown-submenu:hover > a::after { - border-left-color: var(--bs-dropdown-link-active-color); -} - -@media (min-width: 992px) { - .dropdown-menu { - overflow-y: auto; - max-height: calc(100vh - 3.5rem); - } - - .dropdown-submenu { - position: relative; - } - - .dropdown-submenu > .dropdown-menu { - position: fixed !important; - margin-top: -9px; - margin-left: -2px; - border-width: 1px; - padding: 0.5rem 0; - } - - .dropdown-submenu.pull-left { - float: none; - } - - .dropdown-submenu.pull-left > .dropdown-menu { - left: -100%; - margin-left: 10px; - } -} - -@media print { - /* Remove sidebar when print */ - .col-md-3 { display: none; } -} diff --git a/site/css/bootstrap.min.css b/site/css/bootstrap.min.css deleted file mode 100644 index 0eed851..0000000 --- a/site/css/bootstrap.min.css +++ /dev/null @@ -1,12 +0,0 @@ -@charset "UTF-8";/*! - * Bootswatch v5.3.2 (https://bootswatch.com) - * Theme: cerulean - * Copyright 2012-2023 Thomas Park - * Licensed under MIT - * Based on Bootstrap -*//*! - * Bootstrap v5.3.2 (https://getbootstrap.com/) - * Copyright 2011-2023 The Bootstrap Authors - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root,[data-bs-theme=light]{--bs-blue:#033c73;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#e83e8c;--bs-red:#c71c22;--bs-orange:#fd7e14;--bs-yellow:#dd5600;--bs-green:#73a839;--bs-teal:#20c997;--bs-cyan:#2fa4e7;--bs-black:#000;--bs-white:#fff;--bs-gray:#868e96;--bs-gray-dark:#343a40;--bs-gray-100:#f8f9fa;--bs-gray-200:#e9ecef;--bs-gray-300:#dee2e6;--bs-gray-400:#ced4da;--bs-gray-500:#adb5bd;--bs-gray-600:#868e96;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#2fa4e7;--bs-secondary:#e9ecef;--bs-success:#73a839;--bs-info:#033c73;--bs-warning:#dd5600;--bs-danger:#c71c22;--bs-light:#f8f9fa;--bs-dark:#343a40;--bs-primary-rgb:47,164,231;--bs-secondary-rgb:233,236,239;--bs-success-rgb:115,168,57;--bs-info-rgb:3,60,115;--bs-warning-rgb:221,86,0;--bs-danger-rgb:199,28,34;--bs-light-rgb:248,249,250;--bs-dark-rgb:52,58,64;--bs-primary-text-emphasis:#13425c;--bs-secondary-text-emphasis:#5d5e60;--bs-success-text-emphasis:#2e4317;--bs-info-text-emphasis:#01182e;--bs-warning-text-emphasis:#582200;--bs-danger-text-emphasis:#500b0e;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#d5edfa;--bs-secondary-bg-subtle:#fbfbfc;--bs-success-bg-subtle:#e3eed7;--bs-info-bg-subtle:#cdd8e3;--bs-warning-bg-subtle:#f8ddcc;--bs-danger-bg-subtle:#f4d2d3;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#acdbf5;--bs-secondary-border-subtle:#f6f7f9;--bs-success-border-subtle:#c7dcb0;--bs-info-border-subtle:#9ab1c7;--bs-warning-border-subtle:#f1bb99;--bs-danger-border-subtle:#e9a4a7;--bs-light-border-subtle:#e9ecef;--bs-dark-border-subtle:#adb5bd;--bs-white-rgb:255,255,255;--bs-black-rgb:0,0,0;--bs-font-sans-serif:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--bs-font-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--bs-gradient:linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));--bs-body-font-family:var(--bs-font-sans-serif);--bs-body-font-size:1rem;--bs-body-font-weight:400;--bs-body-line-height:1.5;--bs-body-color:#495057;--bs-body-color-rgb:73,80,87;--bs-body-bg:#fff;--bs-body-bg-rgb:255,255,255;--bs-emphasis-color:#000;--bs-emphasis-color-rgb:0,0,0;--bs-secondary-color:rgba(73, 80, 87, 0.75);--bs-secondary-color-rgb:73,80,87;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(73, 80, 87, 0.5);--bs-tertiary-color-rgb:73,80,87;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:#2fa4e7;--bs-link-color:#2fa4e7;--bs-link-color-rgb:47,164,231;--bs-link-decoration:underline;--bs-link-hover-color:#2683b9;--bs-link-hover-color-rgb:38,131,185;--bs-code-color:#e83e8c;--bs-highlight-color:#495057;--bs-highlight-bg:#f8ddcc;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(0, 0, 0, 0.175);--bs-border-radius:0.375rem;--bs-border-radius-sm:0.25rem;--bs-border-radius-lg:0.5rem;--bs-border-radius-xl:1rem;--bs-border-radius-xxl:2rem;--bs-border-radius-2xl:var(--bs-border-radius-xxl);--bs-border-radius-pill:50rem;--bs-box-shadow:0 0.5rem 1rem rgba(0, 0, 0, 0.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0, 0, 0, 0.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0, 0, 0, 0.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(47, 164, 231, 0.25);--bs-form-valid-color:#73a839;--bs-form-valid-border-color:#73a839;--bs-form-invalid-color:#c71c22;--bs-form-invalid-border-color:#c71c22}[data-bs-theme=dark]{color-scheme:dark;--bs-body-color:#dee2e6;--bs-body-color-rgb:222,226,230;--bs-body-bg:#212529;--bs-body-bg-rgb:33,37,41;--bs-emphasis-color:#fff;--bs-emphasis-color-rgb:255,255,255;--bs-secondary-color:rgba(222, 226, 230, 0.75);--bs-secondary-color-rgb:222,226,230;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:rgba(222, 226, 230, 0.5);--bs-tertiary-color-rgb:222,226,230;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#82c8f1;--bs-secondary-text-emphasis:#f2f4f5;--bs-success-text-emphasis:#abcb88;--bs-info-text-emphasis:#688aab;--bs-warning-text-emphasis:#eb9a66;--bs-danger-text-emphasis:#dd777a;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#09212e;--bs-secondary-bg-subtle:#2f2f30;--bs-success-bg-subtle:#17220b;--bs-info-bg-subtle:#010c17;--bs-warning-bg-subtle:#2c1100;--bs-danger-bg-subtle:#280607;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#1c628b;--bs-secondary-border-subtle:#8c8e8f;--bs-success-border-subtle:#456522;--bs-info-border-subtle:#022445;--bs-warning-border-subtle:#853400;--bs-danger-border-subtle:#771114;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherit;--bs-link-color:#82c8f1;--bs-link-hover-color:#9bd3f4;--bs-link-color-rgb:130,200,241;--bs-link-hover-color-rgb:155,211,244;--bs-code-color:#f18bba;--bs-highlight-color:#dee2e6;--bs-highlight-bg:#582200;--bs-border-color:#495057;--bs-border-color-translucent:rgba(255, 255, 255, 0.15);--bs-form-valid-color:#abcb88;--bs-form-valid-border-color:#abcb88;--bs-form-invalid-color:#dd777a;--bs-form-invalid-border-color:#dd777a}*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:var(--bs-body-font-family);font-size:var(--bs-body-font-size);font-weight:var(--bs-body-font-weight);line-height:var(--bs-body-line-height);color:var(--bs-body-color);text-align:var(--bs-body-text-align);background-color:var(--bs-body-bg);-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;border:0;border-top:var(--bs-border-width) solid;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2;color:var(--bs-heading-color)}.h1,h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){.h1,h1{font-size:2.5rem}}.h2,h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){.h2,h2{font-size:2rem}}.h3,h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){.h3,h3{font-size:1.75rem}}.h4,h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){.h4,h4{font-size:1.5rem}}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}.small,small{font-size:.875em}.mark,mark{padding:.1875em;color:var(--bs-highlight-color);background-color:var(--bs-highlight-bg)}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,1));text-decoration:underline}a:hover{--bs-link-color-rgb:var(--bs-link-hover-color-rgb)}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:var(--bs-code-color);word-wrap:break-word}a>code{color:inherit}kbd{padding:.1875rem .375rem;font-size:.875em;color:var(--bs-body-bg);background-color:var(--bs-body-color);border-radius:.25rem}kbd kbd{padding:0;font-size:1em}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-secondary-color);text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator{display:none!important}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}::file-selector-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:calc(1.625rem + 4.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-1{font-size:5rem}}.display-2{font-size:calc(1.575rem + 3.9vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-2{font-size:4.5rem}}.display-3{font-size:calc(1.525rem + 3.3vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-3{font-size:4rem}}.display-4{font-size:calc(1.475rem + 2.7vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-4{font-size:3.5rem}}.display-5{font-size:calc(1.425rem + 2.1vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-5{font-size:3rem}}.display-6{font-size:calc(1.375rem + 1.5vw);font-weight:300;line-height:1.2}@media (min-width:1200px){.display-6{font-size:2.5rem}}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{margin-top:-1rem;margin-bottom:1rem;font-size:.875em;color:#868e96}.blockquote-footer::before{content:"β€”Β "}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:var(--bs-body-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:.875em;color:var(--bs-secondary-color)}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-right:auto;margin-left:auto}@media (min-width:576px){.container,.container-sm{max-width:540px}}@media (min-width:768px){.container,.container-md,.container-sm{max-width:720px}}@media (min-width:992px){.container,.container-lg,.container-md,.container-sm{max-width:960px}}@media (min-width:1200px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}@media (min-width:1400px){.container,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{max-width:1320px}}:root{--bs-breakpoint-xs:0;--bs-breakpoint-sm:576px;--bs-breakpoint-md:768px;--bs-breakpoint-lg:992px;--bs-breakpoint-xl:1200px;--bs-breakpoint-xxl:1400px}.row{--bs-gutter-x:1.5rem;--bs-gutter-y:0;display:flex;flex-wrap:wrap;margin-top:calc(-1 * var(--bs-gutter-y));margin-right:calc(-.5 * var(--bs-gutter-x));margin-left:calc(-.5 * var(--bs-gutter-x))}.row>*{flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--bs-gutter-x) * .5);padding-left:calc(var(--bs-gutter-x) * .5);margin-top:var(--bs-gutter-y)}.col{flex:1 0 0%}.row-cols-auto>*{flex:0 0 auto;width:auto}.row-cols-1>*{flex:0 0 auto;width:100%}.row-cols-2>*{flex:0 0 auto;width:50%}.row-cols-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-4>*{flex:0 0 auto;width:25%}.row-cols-5>*{flex:0 0 auto;width:20%}.row-cols-6>*{flex:0 0 auto;width:16.66666667%}.col-auto{flex:0 0 auto;width:auto}.col-1{flex:0 0 auto;width:8.33333333%}.col-2{flex:0 0 auto;width:16.66666667%}.col-3{flex:0 0 auto;width:25%}.col-4{flex:0 0 auto;width:33.33333333%}.col-5{flex:0 0 auto;width:41.66666667%}.col-6{flex:0 0 auto;width:50%}.col-7{flex:0 0 auto;width:58.33333333%}.col-8{flex:0 0 auto;width:66.66666667%}.col-9{flex:0 0 auto;width:75%}.col-10{flex:0 0 auto;width:83.33333333%}.col-11{flex:0 0 auto;width:91.66666667%}.col-12{flex:0 0 auto;width:100%}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}.g-0,.gx-0{--bs-gutter-x:0}.g-0,.gy-0{--bs-gutter-y:0}.g-1,.gx-1{--bs-gutter-x:0.25rem}.g-1,.gy-1{--bs-gutter-y:0.25rem}.g-2,.gx-2{--bs-gutter-x:0.5rem}.g-2,.gy-2{--bs-gutter-y:0.5rem}.g-3,.gx-3{--bs-gutter-x:1rem}.g-3,.gy-3{--bs-gutter-y:1rem}.g-4,.gx-4{--bs-gutter-x:1.5rem}.g-4,.gy-4{--bs-gutter-y:1.5rem}.g-5,.gx-5{--bs-gutter-x:3rem}.g-5,.gy-5{--bs-gutter-y:3rem}@media (min-width:576px){.col-sm{flex:1 0 0%}.row-cols-sm-auto>*{flex:0 0 auto;width:auto}.row-cols-sm-1>*{flex:0 0 auto;width:100%}.row-cols-sm-2>*{flex:0 0 auto;width:50%}.row-cols-sm-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-sm-4>*{flex:0 0 auto;width:25%}.row-cols-sm-5>*{flex:0 0 auto;width:20%}.row-cols-sm-6>*{flex:0 0 auto;width:16.66666667%}.col-sm-auto{flex:0 0 auto;width:auto}.col-sm-1{flex:0 0 auto;width:8.33333333%}.col-sm-2{flex:0 0 auto;width:16.66666667%}.col-sm-3{flex:0 0 auto;width:25%}.col-sm-4{flex:0 0 auto;width:33.33333333%}.col-sm-5{flex:0 0 auto;width:41.66666667%}.col-sm-6{flex:0 0 auto;width:50%}.col-sm-7{flex:0 0 auto;width:58.33333333%}.col-sm-8{flex:0 0 auto;width:66.66666667%}.col-sm-9{flex:0 0 auto;width:75%}.col-sm-10{flex:0 0 auto;width:83.33333333%}.col-sm-11{flex:0 0 auto;width:91.66666667%}.col-sm-12{flex:0 0 auto;width:100%}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}.g-sm-0,.gx-sm-0{--bs-gutter-x:0}.g-sm-0,.gy-sm-0{--bs-gutter-y:0}.g-sm-1,.gx-sm-1{--bs-gutter-x:0.25rem}.g-sm-1,.gy-sm-1{--bs-gutter-y:0.25rem}.g-sm-2,.gx-sm-2{--bs-gutter-x:0.5rem}.g-sm-2,.gy-sm-2{--bs-gutter-y:0.5rem}.g-sm-3,.gx-sm-3{--bs-gutter-x:1rem}.g-sm-3,.gy-sm-3{--bs-gutter-y:1rem}.g-sm-4,.gx-sm-4{--bs-gutter-x:1.5rem}.g-sm-4,.gy-sm-4{--bs-gutter-y:1.5rem}.g-sm-5,.gx-sm-5{--bs-gutter-x:3rem}.g-sm-5,.gy-sm-5{--bs-gutter-y:3rem}}@media (min-width:768px){.col-md{flex:1 0 0%}.row-cols-md-auto>*{flex:0 0 auto;width:auto}.row-cols-md-1>*{flex:0 0 auto;width:100%}.row-cols-md-2>*{flex:0 0 auto;width:50%}.row-cols-md-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-md-4>*{flex:0 0 auto;width:25%}.row-cols-md-5>*{flex:0 0 auto;width:20%}.row-cols-md-6>*{flex:0 0 auto;width:16.66666667%}.col-md-auto{flex:0 0 auto;width:auto}.col-md-1{flex:0 0 auto;width:8.33333333%}.col-md-2{flex:0 0 auto;width:16.66666667%}.col-md-3{flex:0 0 auto;width:25%}.col-md-4{flex:0 0 auto;width:33.33333333%}.col-md-5{flex:0 0 auto;width:41.66666667%}.col-md-6{flex:0 0 auto;width:50%}.col-md-7{flex:0 0 auto;width:58.33333333%}.col-md-8{flex:0 0 auto;width:66.66666667%}.col-md-9{flex:0 0 auto;width:75%}.col-md-10{flex:0 0 auto;width:83.33333333%}.col-md-11{flex:0 0 auto;width:91.66666667%}.col-md-12{flex:0 0 auto;width:100%}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}.g-md-0,.gx-md-0{--bs-gutter-x:0}.g-md-0,.gy-md-0{--bs-gutter-y:0}.g-md-1,.gx-md-1{--bs-gutter-x:0.25rem}.g-md-1,.gy-md-1{--bs-gutter-y:0.25rem}.g-md-2,.gx-md-2{--bs-gutter-x:0.5rem}.g-md-2,.gy-md-2{--bs-gutter-y:0.5rem}.g-md-3,.gx-md-3{--bs-gutter-x:1rem}.g-md-3,.gy-md-3{--bs-gutter-y:1rem}.g-md-4,.gx-md-4{--bs-gutter-x:1.5rem}.g-md-4,.gy-md-4{--bs-gutter-y:1.5rem}.g-md-5,.gx-md-5{--bs-gutter-x:3rem}.g-md-5,.gy-md-5{--bs-gutter-y:3rem}}@media (min-width:992px){.col-lg{flex:1 0 0%}.row-cols-lg-auto>*{flex:0 0 auto;width:auto}.row-cols-lg-1>*{flex:0 0 auto;width:100%}.row-cols-lg-2>*{flex:0 0 auto;width:50%}.row-cols-lg-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-lg-4>*{flex:0 0 auto;width:25%}.row-cols-lg-5>*{flex:0 0 auto;width:20%}.row-cols-lg-6>*{flex:0 0 auto;width:16.66666667%}.col-lg-auto{flex:0 0 auto;width:auto}.col-lg-1{flex:0 0 auto;width:8.33333333%}.col-lg-2{flex:0 0 auto;width:16.66666667%}.col-lg-3{flex:0 0 auto;width:25%}.col-lg-4{flex:0 0 auto;width:33.33333333%}.col-lg-5{flex:0 0 auto;width:41.66666667%}.col-lg-6{flex:0 0 auto;width:50%}.col-lg-7{flex:0 0 auto;width:58.33333333%}.col-lg-8{flex:0 0 auto;width:66.66666667%}.col-lg-9{flex:0 0 auto;width:75%}.col-lg-10{flex:0 0 auto;width:83.33333333%}.col-lg-11{flex:0 0 auto;width:91.66666667%}.col-lg-12{flex:0 0 auto;width:100%}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}.g-lg-0,.gx-lg-0{--bs-gutter-x:0}.g-lg-0,.gy-lg-0{--bs-gutter-y:0}.g-lg-1,.gx-lg-1{--bs-gutter-x:0.25rem}.g-lg-1,.gy-lg-1{--bs-gutter-y:0.25rem}.g-lg-2,.gx-lg-2{--bs-gutter-x:0.5rem}.g-lg-2,.gy-lg-2{--bs-gutter-y:0.5rem}.g-lg-3,.gx-lg-3{--bs-gutter-x:1rem}.g-lg-3,.gy-lg-3{--bs-gutter-y:1rem}.g-lg-4,.gx-lg-4{--bs-gutter-x:1.5rem}.g-lg-4,.gy-lg-4{--bs-gutter-y:1.5rem}.g-lg-5,.gx-lg-5{--bs-gutter-x:3rem}.g-lg-5,.gy-lg-5{--bs-gutter-y:3rem}}@media (min-width:1200px){.col-xl{flex:1 0 0%}.row-cols-xl-auto>*{flex:0 0 auto;width:auto}.row-cols-xl-1>*{flex:0 0 auto;width:100%}.row-cols-xl-2>*{flex:0 0 auto;width:50%}.row-cols-xl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xl-4>*{flex:0 0 auto;width:25%}.row-cols-xl-5>*{flex:0 0 auto;width:20%}.row-cols-xl-6>*{flex:0 0 auto;width:16.66666667%}.col-xl-auto{flex:0 0 auto;width:auto}.col-xl-1{flex:0 0 auto;width:8.33333333%}.col-xl-2{flex:0 0 auto;width:16.66666667%}.col-xl-3{flex:0 0 auto;width:25%}.col-xl-4{flex:0 0 auto;width:33.33333333%}.col-xl-5{flex:0 0 auto;width:41.66666667%}.col-xl-6{flex:0 0 auto;width:50%}.col-xl-7{flex:0 0 auto;width:58.33333333%}.col-xl-8{flex:0 0 auto;width:66.66666667%}.col-xl-9{flex:0 0 auto;width:75%}.col-xl-10{flex:0 0 auto;width:83.33333333%}.col-xl-11{flex:0 0 auto;width:91.66666667%}.col-xl-12{flex:0 0 auto;width:100%}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}.g-xl-0,.gx-xl-0{--bs-gutter-x:0}.g-xl-0,.gy-xl-0{--bs-gutter-y:0}.g-xl-1,.gx-xl-1{--bs-gutter-x:0.25rem}.g-xl-1,.gy-xl-1{--bs-gutter-y:0.25rem}.g-xl-2,.gx-xl-2{--bs-gutter-x:0.5rem}.g-xl-2,.gy-xl-2{--bs-gutter-y:0.5rem}.g-xl-3,.gx-xl-3{--bs-gutter-x:1rem}.g-xl-3,.gy-xl-3{--bs-gutter-y:1rem}.g-xl-4,.gx-xl-4{--bs-gutter-x:1.5rem}.g-xl-4,.gy-xl-4{--bs-gutter-y:1.5rem}.g-xl-5,.gx-xl-5{--bs-gutter-x:3rem}.g-xl-5,.gy-xl-5{--bs-gutter-y:3rem}}@media (min-width:1400px){.col-xxl{flex:1 0 0%}.row-cols-xxl-auto>*{flex:0 0 auto;width:auto}.row-cols-xxl-1>*{flex:0 0 auto;width:100%}.row-cols-xxl-2>*{flex:0 0 auto;width:50%}.row-cols-xxl-3>*{flex:0 0 auto;width:33.33333333%}.row-cols-xxl-4>*{flex:0 0 auto;width:25%}.row-cols-xxl-5>*{flex:0 0 auto;width:20%}.row-cols-xxl-6>*{flex:0 0 auto;width:16.66666667%}.col-xxl-auto{flex:0 0 auto;width:auto}.col-xxl-1{flex:0 0 auto;width:8.33333333%}.col-xxl-2{flex:0 0 auto;width:16.66666667%}.col-xxl-3{flex:0 0 auto;width:25%}.col-xxl-4{flex:0 0 auto;width:33.33333333%}.col-xxl-5{flex:0 0 auto;width:41.66666667%}.col-xxl-6{flex:0 0 auto;width:50%}.col-xxl-7{flex:0 0 auto;width:58.33333333%}.col-xxl-8{flex:0 0 auto;width:66.66666667%}.col-xxl-9{flex:0 0 auto;width:75%}.col-xxl-10{flex:0 0 auto;width:83.33333333%}.col-xxl-11{flex:0 0 auto;width:91.66666667%}.col-xxl-12{flex:0 0 auto;width:100%}.offset-xxl-0{margin-left:0}.offset-xxl-1{margin-left:8.33333333%}.offset-xxl-2{margin-left:16.66666667%}.offset-xxl-3{margin-left:25%}.offset-xxl-4{margin-left:33.33333333%}.offset-xxl-5{margin-left:41.66666667%}.offset-xxl-6{margin-left:50%}.offset-xxl-7{margin-left:58.33333333%}.offset-xxl-8{margin-left:66.66666667%}.offset-xxl-9{margin-left:75%}.offset-xxl-10{margin-left:83.33333333%}.offset-xxl-11{margin-left:91.66666667%}.g-xxl-0,.gx-xxl-0{--bs-gutter-x:0}.g-xxl-0,.gy-xxl-0{--bs-gutter-y:0}.g-xxl-1,.gx-xxl-1{--bs-gutter-x:0.25rem}.g-xxl-1,.gy-xxl-1{--bs-gutter-y:0.25rem}.g-xxl-2,.gx-xxl-2{--bs-gutter-x:0.5rem}.g-xxl-2,.gy-xxl-2{--bs-gutter-y:0.5rem}.g-xxl-3,.gx-xxl-3{--bs-gutter-x:1rem}.g-xxl-3,.gy-xxl-3{--bs-gutter-y:1rem}.g-xxl-4,.gx-xxl-4{--bs-gutter-x:1.5rem}.g-xxl-4,.gy-xxl-4{--bs-gutter-y:1.5rem}.g-xxl-5,.gx-xxl-5{--bs-gutter-x:3rem}.g-xxl-5,.gy-xxl-5{--bs-gutter-y:3rem}}.table{--bs-table-color-type:initial;--bs-table-bg-type:initial;--bs-table-color-state:initial;--bs-table-bg-state:initial;--bs-table-color:var(--bs-emphasis-color);--bs-table-bg:var(--bs-body-bg);--bs-table-border-color:var(--bs-border-color);--bs-table-accent-bg:transparent;--bs-table-striped-color:var(--bs-emphasis-color);--bs-table-striped-bg:rgba(var(--bs-emphasis-color-rgb), 0.05);--bs-table-active-color:var(--bs-emphasis-color);--bs-table-active-bg:rgba(var(--bs-emphasis-color-rgb), 0.1);--bs-table-hover-color:var(--bs-emphasis-color);--bs-table-hover-bg:rgba(var(--bs-emphasis-color-rgb), 0.075);width:100%;margin-bottom:1rem;vertical-align:top;border-color:var(--bs-table-border-color)}.table>:not(caption)>*>*{padding:.5rem .5rem;color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));background-color:var(--bs-table-bg);border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state,var(--bs-table-bg-type,var(--bs-table-accent-bg)))}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:calc(var(--bs-border-width) * 2) solid currentcolor}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem .25rem}.table-bordered>:not(caption)>*{border-width:var(--bs-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 var(--bs-border-width)}.table-borderless>:not(caption)>*>*{border-bottom-width:0}.table-borderless>:not(:first-child){border-top-width:0}.table-striped>tbody>tr:nth-of-type(odd)>*{--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-striped-columns>:not(caption)>tr>:nth-child(2n){--bs-table-color-type:var(--bs-table-striped-color);--bs-table-bg-type:var(--bs-table-striped-bg)}.table-active{--bs-table-color-state:var(--bs-table-active-color);--bs-table-bg-state:var(--bs-table-active-bg)}.table-hover>tbody>tr:hover>*{--bs-table-color-state:var(--bs-table-hover-color);--bs-table-bg-state:var(--bs-table-hover-bg)}.table-primary{--bs-table-color:#000;--bs-table-bg:#d5edfa;--bs-table-border-color:#aabec8;--bs-table-striped-bg:#cae1ee;--bs-table-striped-color:#000;--bs-table-active-bg:#c0d5e1;--bs-table-active-color:#000;--bs-table-hover-bg:#c5dbe7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#fbfbfc;--bs-table-border-color:#c9c9ca;--bs-table-striped-bg:#eeeeef;--bs-table-striped-color:#000;--bs-table-active-bg:#e2e2e3;--bs-table-active-color:#000;--bs-table-hover-bg:#e8e8e9;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-success{--bs-table-color:#000;--bs-table-bg:#e3eed7;--bs-table-border-color:#b6beac;--bs-table-striped-bg:#d8e2cc;--bs-table-striped-color:#000;--bs-table-active-bg:#ccd6c2;--bs-table-active-color:#000;--bs-table-hover-bg:#d2dcc7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cdd8e3;--bs-table-border-color:#a4adb6;--bs-table-striped-bg:#c3cdd8;--bs-table-striped-color:#000;--bs-table-active-bg:#b9c2cc;--bs-table-active-color:#000;--bs-table-hover-bg:#bec8d2;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-warning{--bs-table-color:#000;--bs-table-bg:#f8ddcc;--bs-table-border-color:#c6b1a3;--bs-table-striped-bg:#ecd2c2;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc7b8;--bs-table-active-color:#000;--bs-table-hover-bg:#e5ccbd;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f4d2d3;--bs-table-border-color:#c3a8a9;--bs-table-striped-bg:#e8c8c8;--bs-table-striped-color:#000;--bs-table-active-bg:#dcbdbe;--bs-table-active-color:#000;--bs-table-hover-bg:#e2c2c3;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#c6c7c8;--bs-table-striped-bg:#ecedee;--bs-table-striped-color:#000;--bs-table-active-bg:#dfe0e1;--bs-table-active-color:#000;--bs-table-hover-bg:#e5e6e7;--bs-table-hover-color:#000;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#343a40;--bs-table-border-color:#5d6166;--bs-table-striped-bg:#3e444a;--bs-table-striped-color:#fff;--bs-table-active-bg:#484e53;--bs-table-active-color:#fff;--bs-table-hover-bg:#43494e;--bs-table-hover-color:#fff;color:var(--bs-table-color);border-color:var(--bs-table-border-color)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}@media (max-width:575.98px){.table-responsive-sm{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:767.98px){.table-responsive-md{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:991.98px){.table-responsive-lg{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1199.98px){.table-responsive-xl{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (max-width:1399.98px){.table-responsive-xxl{overflow-x:auto;-webkit-overflow-scrolling:touch}}.form-label{margin-bottom:.5rem}.col-form-label{padding-top:calc(.375rem + var(--bs-border-width));padding-bottom:calc(.375rem + var(--bs-border-width));margin-bottom:0;font-size:inherit;line-height:1.5}.col-form-label-lg{padding-top:calc(.5rem + var(--bs-border-width));padding-bottom:calc(.5rem + var(--bs-border-width));font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem + var(--bs-border-width));padding-bottom:calc(.25rem + var(--bs-border-width));font-size:.875rem}.form-text{margin-top:.25rem;font-size:.875em;color:var(--bs-secondary-color)}.form-control{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-clip:padding-box;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control[type=file]{overflow:hidden}.form-control[type=file]:not(:disabled):not([readonly]){cursor:pointer}.form-control:focus{color:var(--bs-body-color);background-color:var(--bs-body-bg);border-color:#97d2f3;outline:0;box-shadow:0 0 0 .25rem rgba(47,164,231,.25)}.form-control::-webkit-date-and-time-value{min-width:85px;height:1.5em;margin:0}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::-moz-placeholder{color:var(--bs-secondary-color);opacity:1}.form-control::placeholder{color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:var(--bs-secondary-bg);opacity:1}.form-control::-webkit-file-upload-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;-webkit-transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}.form-control::file-selector-button{padding:.375rem .75rem;margin:-.375rem -.75rem;-webkit-margin-end:.75rem;margin-inline-end:.75rem;color:var(--bs-body-color);background-color:var(--bs-tertiary-bg);pointer-events:none;border-color:inherit;border-style:solid;border-width:0;border-inline-end-width:var(--bs-border-width);border-radius:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-control::-webkit-file-upload-button{-webkit-transition:none;transition:none}.form-control::file-selector-button{transition:none}}.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button{background-color:var(--bs-secondary-bg)}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:var(--bs-secondary-bg)}.form-control-plaintext{display:block;width:100%;padding:.375rem 0;margin-bottom:0;line-height:1.5;color:var(--bs-body-color);background-color:transparent;border:solid transparent;border-width:var(--bs-border-width) 0}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-right:0;padding-left:0}.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2));padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-control-sm::-webkit-file-upload-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-sm::file-selector-button{padding:.25rem .5rem;margin:-.25rem -.5rem;-webkit-margin-end:.5rem;margin-inline-end:.5rem}.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.form-control-lg::-webkit-file-upload-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}.form-control-lg::file-selector-button{padding:.5rem 1rem;margin:-.5rem -1rem;-webkit-margin-end:1rem;margin-inline-end:1rem}textarea.form-control{min-height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2))}textarea.form-control-sm{min-height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}textarea.form-control-lg{min-height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-control-color{width:3rem;height:calc(1.5em + .75rem + calc(var(--bs-border-width) * 2));padding:.375rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:var(--bs-border-radius)}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + calc(var(--bs-border-width) * 2))}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + calc(var(--bs-border-width) * 2))}.form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e");display:block;width:100%;padding:.375rem 2.25rem .375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon,none);background-repeat:no-repeat;background-position:right .75rem center;background-size:16px 12px;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius);transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#97d2f3;outline:0;box-shadow:0 0 0 .25rem rgba(47,164,231,.25)}.form-select[multiple],.form-select[size]:not([size="1"]){padding-right:.75rem;background-image:none}.form-select:disabled{background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{padding-top:.25rem;padding-bottom:.25rem;padding-left:.5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.form-select-lg{padding-top:.5rem;padding-bottom:.5rem;padding-left:1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e")}.form-check{display:block;min-height:1.5rem;padding-left:1.5em;margin-bottom:.125rem}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-right:1.5em;padding-left:0;text-align:right}.form-check-reverse .form-check-input{float:right;margin-right:-1.5em;margin-left:0}.form-check-input{--bs-form-check-bg:var(--bs-body-bg);flex-shrink:0;width:1em;height:1em;margin-top:.25em;vertical-align:top;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-repeat:no-repeat;background-position:center;background-size:contain;border:var(--bs-border-width) solid var(--bs-border-color);-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{filter:brightness(90%)}.form-check-input:focus{border-color:#97d2f3;outline:0;box-shadow:0 0 0 .25rem rgba(47,164,231,.25)}.form-check-input:checked{background-color:#2fa4e7;border-color:#2fa4e7}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e")}.form-check-input:checked[type=radio]{--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e")}.form-check-input[type=checkbox]:indeterminate{background-color:#2fa4e7;border-color:#2fa4e7;--bs-form-check-bg-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e")}.form-check-input:disabled{pointer-events:none;filter:none;opacity:.5}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{cursor:default;opacity:.5}.form-switch{padding-left:2.5em}.form-switch .form-check-input{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e");width:2em;margin-left:-2.5em;background-image:var(--bs-form-switch-bg);background-position:left center;border-radius:2em;transition:background-position .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-switch .form-check-input{transition:none}}.form-switch .form-check-input:focus{--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%2397d2f3'/%3e%3c/svg%3e")}.form-switch .form-check-input:checked{background-position:right center;--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e")}.form-switch.form-check-reverse{padding-right:2.5em;padding-left:0}.form-switch.form-check-reverse .form-check-input{margin-right:-2.5em;margin-left:0}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{pointer-events:none;filter:none;opacity:.65}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e")}.form-range{width:100%;height:1.5rem;padding:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(47,164,231,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(47,164,231,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{width:1rem;height:1rem;margin-top:-.25rem;-webkit-appearance:none;appearance:none;background-color:#2fa4e7;border:0;border-radius:1rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#c1e4f8}.form-range::-webkit-slider-runnable-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range::-moz-range-thumb{width:1rem;height:1rem;-moz-appearance:none;appearance:none;background-color:#2fa4e7;border:0;border-radius:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#c1e4f8}.form-range::-moz-range-track{width:100%;height:.5rem;color:transparent;cursor:pointer;background-color:var(--bs-secondary-bg);border-color:transparent;border-radius:1rem}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:var(--bs-secondary-color)}.form-floating{position:relative}.form-floating>.form-control,.form-floating>.form-control-plaintext,.form-floating>.form-select{height:calc(3.5rem + calc(var(--bs-border-width) * 2));min-height:calc(3.5rem + calc(var(--bs-border-width) * 2));line-height:1.25}.form-floating>label{position:absolute;top:0;left:0;z-index:2;height:100%;padding:1rem .75rem;overflow:hidden;text-align:start;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;border:var(--bs-border-width) solid transparent;transform-origin:0 0;transition:opacity .1s ease-in-out,transform .1s ease-in-out}@media (prefers-reduced-motion:reduce){.form-floating>label{transition:none}}.form-floating>.form-control,.form-floating>.form-control-plaintext{padding:1rem .75rem}.form-floating>.form-control-plaintext::-moz-placeholder,.form-floating>.form-control::-moz-placeholder{color:transparent}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.form-floating>.form-control-plaintext:not(:-moz-placeholder-shown),.form-floating>.form-control:not(:-moz-placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:focus,.form-floating>.form-control-plaintext:not(:placeholder-shown),.form-floating>.form-control:focus,.form-floating>.form-control:not(:placeholder-shown){padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-select{padding-top:1.625rem;padding-bottom:.625rem}.form-floating>.form-control:not(:-moz-placeholder-shown)~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label,.form-floating>.form-control:focus~label,.form-floating>.form-control:not(:placeholder-shown)~label,.form-floating>.form-select~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control:not(:-moz-placeholder-shown)~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control-plaintext~label::after,.form-floating>.form-control:focus~label::after,.form-floating>.form-control:not(:placeholder-shown)~label::after,.form-floating>.form-select~label::after{position:absolute;inset:1rem 0.375rem;z-index:-1;height:1.5em;content:"";background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius)}.form-floating>.form-control:-webkit-autofill~label{color:rgba(var(--bs-body-color-rgb),.65);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:var(--bs-border-width) 0}.form-floating>.form-control:disabled~label,.form-floating>:disabled~label{color:#868e96}.form-floating>.form-control:disabled~label::after,.form-floating>:disabled~label::after{background-color:var(--bs-secondary-bg)}.input-group{position:relative;display:flex;flex-wrap:wrap;align-items:stretch;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{position:relative;flex:1 1 auto;width:1%;min-width:0}.input-group>.form-control:focus,.input-group>.form-floating:focus-within,.input-group>.form-select:focus{z-index:5}.input-group .btn{position:relative;z-index:2}.input-group .btn:focus{z-index:5}.input-group-text{display:flex;align-items:center;padding:.375rem .75rem;font-size:1rem;font-weight:400;line-height:1.5;color:var(--bs-body-color);text-align:center;white-space:nowrap;background-color:var(--bs-tertiary-bg);border:var(--bs-border-width) solid var(--bs-border-color);border-radius:var(--bs-border-radius)}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{padding:.5rem 1rem;font-size:1.25rem;border-radius:var(--bs-border-radius-lg)}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{padding:.25rem .5rem;font-size:.875rem;border-radius:var(--bs-border-radius-sm)}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.input-group:not(.has-validation)>.dropdown-toggle:nth-last-child(n+3),.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-control,.input-group:not(.has-validation)>.form-floating:not(:last-child)>.form-select,.input-group:not(.has-validation)>:not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group.has-validation>.dropdown-toggle:nth-last-child(n+4),.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-control,.input-group.has-validation>.form-floating:nth-last-child(n+3)>.form-select,.input-group.has-validation>:nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating){border-top-right-radius:0;border-bottom-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){margin-left:calc(var(--bs-border-width) * -1);border-top-left-radius:0;border-bottom-left-radius:0}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-top-left-radius:0;border-bottom-left-radius:0}.valid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-valid-color)}.valid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-success);border-radius:var(--bs-border-radius)}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{border-color:var(--bs-form-valid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2373a839' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:var(--bs-form-valid-border-color)}.form-select.is-valid:not([multiple]):not([size]),.form-select.is-valid:not([multiple])[size="1"],.was-validated .form-select:valid:not([multiple]):not([size]),.was-validated .form-select:valid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2373a839' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-control-color.is-valid,.was-validated .form-control-color:valid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:var(--bs-form-valid-border-color)}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:var(--bs-form-valid-color)}.form-check-input.is-valid:focus,.was-validated .form-check-input:valid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:var(--bs-form-valid-color)}.form-check-inline .form-check-input~.valid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-valid,.input-group>.form-floating:not(:focus-within).is-valid,.input-group>.form-select:not(:focus).is-valid,.was-validated .input-group>.form-control:not(:focus):valid,.was-validated .input-group>.form-floating:not(:focus-within):valid,.was-validated .input-group>.form-select:not(:focus):valid{z-index:3}.invalid-feedback{display:none;width:100%;margin-top:.25rem;font-size:.875em;color:var(--bs-form-invalid-color)}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;max-width:100%;padding:.25rem .5rem;margin-top:.1rem;font-size:.875rem;color:#fff;background-color:var(--bs-danger);border-radius:var(--bs-border-radius)}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{border-color:var(--bs-form-invalid-border-color);padding-right:calc(1.5em + .75rem);background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23c71c22'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23c71c22' stroke='none'/%3e%3c/svg%3e");background-repeat:no-repeat;background-position:right calc(.375em + .1875rem) center;background-size:calc(.75em + .375rem) calc(.75em + .375rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{padding-right:calc(1.5em + .75rem);background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:var(--bs-form-invalid-border-color)}.form-select.is-invalid:not([multiple]):not([size]),.form-select.is-invalid:not([multiple])[size="1"],.was-validated .form-select:invalid:not([multiple]):not([size]),.was-validated .form-select:invalid:not([multiple])[size="1"]{--bs-form-select-bg-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23c71c22'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23c71c22' stroke='none'/%3e%3c/svg%3e");padding-right:4.125rem;background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem)}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-control-color.is-invalid,.was-validated .form-control-color:invalid{width:calc(3rem + calc(1.5em + .75rem))}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:var(--bs-form-invalid-border-color)}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:var(--bs-form-invalid-color)}.form-check-input.is-invalid:focus,.was-validated .form-check-input:invalid:focus{box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:var(--bs-form-invalid-color)}.form-check-inline .form-check-input~.invalid-feedback{margin-left:.5em}.input-group>.form-control:not(:focus).is-invalid,.input-group>.form-floating:not(:focus-within).is-invalid,.input-group>.form-select:not(:focus).is-invalid,.was-validated .input-group>.form-control:not(:focus):invalid,.was-validated .input-group>.form-floating:not(:focus-within):invalid,.was-validated .input-group>.form-select:not(:focus):invalid{z-index:4}.btn{--bs-btn-padding-x:0.75rem;--bs-btn-padding-y:0.375rem;--bs-btn-font-family: ;--bs-btn-font-size:1rem;--bs-btn-font-weight:400;--bs-btn-line-height:1.5;--bs-btn-color:var(--bs-body-color);--bs-btn-bg:transparent;--bs-btn-border-width:var(--bs-border-width);--bs-btn-border-color:transparent;--bs-btn-border-radius:var(--bs-border-radius);--bs-btn-hover-border-color:transparent;--bs-btn-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.15),0 1px 1px rgba(0, 0, 0, 0.075);--bs-btn-disabled-opacity:0.65;--bs-btn-focus-box-shadow:0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);display:inline-block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);font-family:var(--bs-btn-font-family);font-size:var(--bs-btn-font-size);font-weight:var(--bs-btn-font-weight);line-height:var(--bs-btn-line-height);color:var(--bs-btn-color);text-align:center;text-decoration:none;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);background-color:var(--bs-btn-bg);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color)}.btn-check+.btn:hover{color:var(--bs-btn-color);background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color)}.btn:focus-visible{color:var(--bs-btn-hover-color);background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);outline:0;box-shadow:var(--bs-btn-focus-box-shadow)}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{color:var(--bs-btn-active-color);background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color)}.btn-check:checked+.btn:focus-visible,.btn.active:focus-visible,.btn.show:focus-visible,.btn:first-child:active:focus-visible,:not(.btn-check)+.btn:active:focus-visible{box-shadow:var(--bs-btn-focus-box-shadow)}.btn.disabled,.btn:disabled,fieldset:disabled .btn{color:var(--bs-btn-disabled-color);pointer-events:none;background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);opacity:var(--bs-btn-disabled-opacity)}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#2fa4e7;--bs-btn-border-color:#2fa4e7;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#288bc4;--bs-btn-hover-border-color:#2683b9;--bs-btn-focus-shadow-rgb:78,178,235;--bs-btn-active-color:#fff;--bs-btn-active-bg:#2683b9;--bs-btn-active-border-color:#237bad;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#2fa4e7;--bs-btn-disabled-border-color:#2fa4e7}.btn-secondary{--bs-btn-color:#000;--bs-btn-bg:#e9ecef;--bs-btn-border-color:#e9ecef;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#eceff1;--bs-btn-hover-border-color:#ebeef1;--bs-btn-focus-shadow-rgb:198,201,203;--bs-btn-active-color:#000;--bs-btn-active-bg:#edf0f2;--bs-btn-active-border-color:#ebeef1;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#e9ecef;--bs-btn-disabled-border-color:#e9ecef}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#73a839;--bs-btn-border-color:#73a839;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#628f30;--bs-btn-hover-border-color:#5c862e;--bs-btn-focus-shadow-rgb:136,181,87;--bs-btn-active-color:#fff;--bs-btn-active-bg:#5c862e;--bs-btn-active-border-color:#567e2b;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#73a839;--bs-btn-disabled-border-color:#73a839}.btn-info{--bs-btn-color:#fff;--bs-btn-bg:#033c73;--bs-btn-border-color:#033c73;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#033362;--bs-btn-hover-border-color:#02305c;--bs-btn-focus-shadow-rgb:41,89,136;--bs-btn-active-color:#fff;--bs-btn-active-bg:#02305c;--bs-btn-active-border-color:#022d56;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#033c73;--bs-btn-disabled-border-color:#033c73}.btn-warning{--bs-btn-color:#fff;--bs-btn-bg:#dd5600;--bs-btn-border-color:#dd5600;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bc4900;--bs-btn-hover-border-color:#b14500;--bs-btn-focus-shadow-rgb:226,111,38;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b14500;--bs-btn-active-border-color:#a64100;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dd5600;--bs-btn-disabled-border-color:#dd5600}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#c71c22;--bs-btn-border-color:#c71c22;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#a9181d;--bs-btn-hover-border-color:#9f161b;--bs-btn-focus-shadow-rgb:207,62,67;--bs-btn-active-color:#fff;--bs-btn-active-bg:#9f161b;--bs-btn-active-border-color:#95151a;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#c71c22;--bs-btn-disabled-border-color:#c71c22}.btn-light{--bs-btn-color:#000;--bs-btn-bg:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#d3d4d5;--bs-btn-hover-border-color:#c6c7c8;--bs-btn-focus-shadow-rgb:211,212,213;--bs-btn-active-color:#000;--bs-btn-active-bg:#c6c7c8;--bs-btn-active-border-color:#babbbc;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#f8f9fa;--bs-btn-disabled-border-color:#f8f9fa}.btn-dark{--bs-btn-color:#fff;--bs-btn-bg:#343a40;--bs-btn-border-color:#343a40;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#52585d;--bs-btn-hover-border-color:#484e53;--bs-btn-focus-shadow-rgb:82,88,93;--bs-btn-active-color:#fff;--bs-btn-active-bg:#5d6166;--bs-btn-active-border-color:#484e53;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#343a40;--bs-btn-disabled-border-color:#343a40}.btn-outline-primary{--bs-btn-color:#2fa4e7;--bs-btn-border-color:#2fa4e7;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#2fa4e7;--bs-btn-hover-border-color:#2fa4e7;--bs-btn-focus-shadow-rgb:47,164,231;--bs-btn-active-color:#fff;--bs-btn-active-bg:#2fa4e7;--bs-btn-active-border-color:#2fa4e7;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#2fa4e7;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#2fa4e7;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#e9ecef;--bs-btn-border-color:#e9ecef;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#e9ecef;--bs-btn-hover-border-color:#e9ecef;--bs-btn-focus-shadow-rgb:233,236,239;--bs-btn-active-color:#000;--bs-btn-active-bg:#e9ecef;--bs-btn-active-border-color:#e9ecef;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#e9ecef;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#e9ecef;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#73a839;--bs-btn-border-color:#73a839;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#73a839;--bs-btn-hover-border-color:#73a839;--bs-btn-focus-shadow-rgb:115,168,57;--bs-btn-active-color:#fff;--bs-btn-active-bg:#73a839;--bs-btn-active-border-color:#73a839;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#73a839;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#73a839;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#033c73;--bs-btn-border-color:#033c73;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#033c73;--bs-btn-hover-border-color:#033c73;--bs-btn-focus-shadow-rgb:3,60,115;--bs-btn-active-color:#fff;--bs-btn-active-bg:#033c73;--bs-btn-active-border-color:#033c73;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#033c73;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#033c73;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#dd5600;--bs-btn-border-color:#dd5600;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dd5600;--bs-btn-hover-border-color:#dd5600;--bs-btn-focus-shadow-rgb:221,86,0;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dd5600;--bs-btn-active-border-color:#dd5600;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#dd5600;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dd5600;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#c71c22;--bs-btn-border-color:#c71c22;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#c71c22;--bs-btn-hover-border-color:#c71c22;--bs-btn-focus-shadow-rgb:199,28,34;--bs-btn-active-color:#fff;--bs-btn-active-bg:#c71c22;--bs-btn-active-border-color:#c71c22;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#c71c22;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#c71c22;--bs-gradient:none}.btn-outline-light{--bs-btn-color:#f8f9fa;--bs-btn-border-color:#f8f9fa;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#f8f9fa;--bs-btn-hover-border-color:#f8f9fa;--bs-btn-focus-shadow-rgb:248,249,250;--bs-btn-active-color:#000;--bs-btn-active-bg:#f8f9fa;--bs-btn-active-border-color:#f8f9fa;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#f8f9fa;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#f8f9fa;--bs-gradient:none}.btn-outline-dark{--bs-btn-color:#343a40;--bs-btn-border-color:#343a40;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#343a40;--bs-btn-hover-border-color:#343a40;--bs-btn-focus-shadow-rgb:52,58,64;--bs-btn-active-color:#fff;--bs-btn-active-bg:#343a40;--bs-btn-active-border-color:#343a40;--bs-btn-active-shadow:inset 0 3px 5px rgba(0, 0, 0, 0.125);--bs-btn-disabled-color:#343a40;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#343a40;--bs-gradient:none}.btn-link{--bs-btn-font-weight:400;--bs-btn-color:var(--bs-link-color);--bs-btn-bg:transparent;--bs-btn-border-color:transparent;--bs-btn-hover-color:var(--bs-link-hover-color);--bs-btn-hover-border-color:transparent;--bs-btn-active-color:var(--bs-link-hover-color);--bs-btn-active-border-color:transparent;--bs-btn-disabled-color:#868e96;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:78,178,235;text-decoration:underline}.btn-link:focus-visible{color:var(--bs-btn-color)}.btn-link:hover{color:var(--bs-btn-hover-color)}.btn-group-lg>.btn,.btn-lg{--bs-btn-padding-y:0.5rem;--bs-btn-padding-x:1rem;--bs-btn-font-size:1.25rem;--bs-btn-border-radius:var(--bs-border-radius-lg)}.btn-group-sm>.btn,.btn-sm{--bs-btn-padding-y:0.25rem;--bs-btn-padding-x:0.5rem;--bs-btn-font-size:0.875rem;--bs-btn-border-radius:var(--bs-border-radius-sm)}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.collapse-horizontal{width:0;height:auto;transition:width .35s ease}@media (prefers-reduced-motion:reduce){.collapsing.collapse-horizontal{transition:none}}.dropdown,.dropdown-center,.dropend,.dropstart,.dropup,.dropup-center{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-bottom:0;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropdown-menu{--bs-dropdown-zindex:1000;--bs-dropdown-min-width:10rem;--bs-dropdown-padding-x:0;--bs-dropdown-padding-y:0.5rem;--bs-dropdown-spacer:0.125rem;--bs-dropdown-font-size:1rem;--bs-dropdown-color:var(--bs-body-color);--bs-dropdown-bg:var(--bs-body-bg);--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-border-radius:var(--bs-border-radius);--bs-dropdown-border-width:var(--bs-border-width);--bs-dropdown-inner-border-radius:calc(var(--bs-border-radius) - var(--bs-border-width));--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-divider-margin-y:0.5rem;--bs-dropdown-box-shadow:var(--bs-box-shadow);--bs-dropdown-link-color:var(--bs-body-color);--bs-dropdown-link-hover-color:#fff;--bs-dropdown-link-hover-bg:#2fa4e7;--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#2fa4e7;--bs-dropdown-link-disabled-color:var(--bs-tertiary-color);--bs-dropdown-item-padding-x:1rem;--bs-dropdown-item-padding-y:0.25rem;--bs-dropdown-header-color:#868e96;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;position:absolute;z-index:var(--bs-dropdown-zindex);display:none;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);margin:0;font-size:var(--bs-dropdown-font-size);color:var(--bs-dropdown-color);text-align:left;list-style:none;background-color:var(--bs-dropdown-bg);background-clip:padding-box;border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius)}.dropdown-menu[data-bs-popper]{top:100%;left:0;margin-top:var(--bs-dropdown-spacer)}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{right:0;left:auto}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{right:0;left:auto}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{right:0;left:auto}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{right:0;left:auto}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{right:auto;left:0}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{right:0;left:auto}}.dropup .dropdown-menu[data-bs-popper]{top:auto;bottom:100%;margin-top:0;margin-bottom:var(--bs-dropdown-spacer)}.dropup .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:0;border-right:.3em solid transparent;border-bottom:.3em solid;border-left:.3em solid transparent}.dropup .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{top:0;right:auto;left:100%;margin-top:0;margin-left:var(--bs-dropdown-spacer)}.dropend .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:0;border-bottom:.3em solid transparent;border-left:.3em solid}.dropend .dropdown-toggle:empty::after{margin-left:0}.dropend .dropdown-toggle::after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{top:0;right:100%;left:auto;margin-top:0;margin-right:var(--bs-dropdown-spacer)}.dropstart .dropdown-toggle::after{display:inline-block;margin-left:.255em;vertical-align:.255em;content:""}.dropstart .dropdown-toggle::after{display:none}.dropstart .dropdown-toggle::before{display:inline-block;margin-right:.255em;vertical-align:.255em;content:"";border-top:.3em solid transparent;border-right:.3em solid;border-bottom:.3em solid transparent}.dropstart .dropdown-toggle:empty::after{margin-left:0}.dropstart .dropdown-toggle::before{vertical-align:0}.dropdown-divider{height:0;margin:var(--bs-dropdown-divider-margin-y) 0;overflow:hidden;border-top:1px solid var(--bs-dropdown-divider-bg);opacity:1}.dropdown-item{display:block;width:100%;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);clear:both;font-weight:400;color:var(--bs-dropdown-link-color);text-align:inherit;text-decoration:none;white-space:nowrap;background-color:transparent;border:0;border-radius:var(--bs-dropdown-item-border-radius,0)}.dropdown-item:focus,.dropdown-item:hover{color:var(--bs-dropdown-link-hover-color);background-color:var(--bs-dropdown-link-hover-bg)}.dropdown-item.active,.dropdown-item:active{color:var(--bs-dropdown-link-active-color);text-decoration:none;background-color:var(--bs-dropdown-link-active-bg)}.dropdown-item.disabled,.dropdown-item:disabled{color:var(--bs-dropdown-link-disabled-color);pointer-events:none;background-color:transparent}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);margin-bottom:0;font-size:.875rem;color:var(--bs-dropdown-header-color);white-space:nowrap}.dropdown-item-text{display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);color:var(--bs-dropdown-link-color)}.dropdown-menu-dark{--bs-dropdown-color:#dee2e6;--bs-dropdown-bg:#343a40;--bs-dropdown-border-color:var(--bs-border-color-translucent);--bs-dropdown-box-shadow: ;--bs-dropdown-link-color:#dee2e6;--bs-dropdown-link-hover-color:#fff;--bs-dropdown-divider-bg:var(--bs-border-color-translucent);--bs-dropdown-link-hover-bg:rgba(255, 255, 255, 0.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#2fa4e7;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{position:relative;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;flex:1 1 auto}.btn-group-vertical>.btn-check:checked+.btn,.btn-group-vertical>.btn-check:focus+.btn,.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn-check:checked+.btn,.btn-group>.btn-check:focus+.btn,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group{border-radius:var(--bs-border-radius)}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:calc(var(--bs-border-width) * -1)}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn.dropdown-toggle-split:first-child,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:nth-child(n+3),.btn-group>:not(.btn-check)+.btn{border-top-left-radius:0;border-bottom-left-radius:0}.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.dropdown-toggle-split::after,.dropend .dropdown-toggle-split::after,.dropup .dropdown-toggle-split::after{margin-left:0}.dropstart .dropdown-toggle-split::before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{flex-direction:column;align-items:flex-start;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:calc(var(--bs-border-width) * -1)}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn~.btn{border-top-left-radius:0;border-top-right-radius:0}.nav{--bs-nav-link-padding-x:1rem;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-link-color);--bs-nav-link-hover-color:var(--bs-link-hover-color);--bs-nav-link-disabled-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);color:var(--bs-nav-link-color);text-decoration:none;background:0 0;border:0;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out}@media (prefers-reduced-motion:reduce){.nav-link{transition:none}}.nav-link:focus,.nav-link:hover{color:var(--bs-nav-link-hover-color)}.nav-link:focus-visible{outline:0;box-shadow:0 0 0 .25rem rgba(47,164,231,.25)}.nav-link.disabled,.nav-link:disabled{color:var(--bs-nav-link-disabled-color);pointer-events:none;cursor:default}.nav-tabs{--bs-nav-tabs-border-width:var(--bs-border-width);--bs-nav-tabs-border-color:var(--bs-border-color);--bs-nav-tabs-border-radius:var(--bs-border-radius);--bs-nav-tabs-link-hover-border-color:var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);--bs-nav-tabs-link-active-color:var(--bs-emphasis-color);--bs-nav-tabs-link-active-bg:var(--bs-body-bg);--bs-nav-tabs-link-active-border-color:var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);border-bottom:var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color)}.nav-tabs .nav-link{margin-bottom:calc(-1 * var(--bs-nav-tabs-border-width));border:var(--bs-nav-tabs-border-width) solid transparent;border-top-left-radius:var(--bs-nav-tabs-border-radius);border-top-right-radius:var(--bs-nav-tabs-border-radius)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{isolation:isolate;border-color:var(--bs-nav-tabs-link-hover-border-color)}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:var(--bs-nav-tabs-link-active-color);background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color)}.nav-tabs .dropdown-menu{margin-top:calc(-1 * var(--bs-nav-tabs-border-width));border-top-left-radius:0;border-top-right-radius:0}.nav-pills{--bs-nav-pills-border-radius:var(--bs-border-radius);--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#2fa4e7}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{color:var(--bs-nav-pills-link-active-color);background-color:var(--bs-nav-pills-link-active-bg)}.nav-underline{--bs-nav-underline-gap:1rem;--bs-nav-underline-border-width:0.125rem;--bs-nav-underline-link-active-color:var(--bs-emphasis-color);gap:var(--bs-nav-underline-gap)}.nav-underline .nav-link{padding-right:0;padding-left:0;border-bottom:var(--bs-nav-underline-border-width) solid transparent}.nav-underline .nav-link:focus,.nav-underline .nav-link:hover{border-bottom-color:currentcolor}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{font-weight:700;color:var(--bs-nav-underline-link-active-color);border-bottom-color:currentcolor}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.nav-fill .nav-item .nav-link,.nav-justified .nav-item .nav-link{width:100%}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{--bs-navbar-padding-x:0;--bs-navbar-padding-y:0.5rem;--bs-navbar-color:rgba(var(--bs-emphasis-color-rgb), 0.65);--bs-navbar-hover-color:rgba(var(--bs-emphasis-color-rgb), 0.8);--bs-navbar-disabled-color:rgba(var(--bs-emphasis-color-rgb), 0.3);--bs-navbar-active-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-padding-y:0.3125rem;--bs-navbar-brand-margin-end:1rem;--bs-navbar-brand-font-size:1.25rem;--bs-navbar-brand-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-brand-hover-color:rgba(var(--bs-emphasis-color-rgb), 1);--bs-navbar-nav-link-padding-x:0.5rem;--bs-navbar-toggler-padding-y:0.25rem;--bs-navbar-toggler-padding-x:0.75rem;--bs-navbar-toggler-font-size:1.25rem;--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2873, 80, 87, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");--bs-navbar-toggler-border-color:rgba(var(--bs-emphasis-color-rgb), 0.15);--bs-navbar-toggler-border-radius:var(--bs-border-radius);--bs-navbar-toggler-focus-width:0.25rem;--bs-navbar-toggler-transition:box-shadow 0.15s ease-in-out;position:relative;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x)}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{display:flex;flex-wrap:inherit;align-items:center;justify-content:space-between}.navbar-brand{padding-top:var(--bs-navbar-brand-padding-y);padding-bottom:var(--bs-navbar-brand-padding-y);margin-right:var(--bs-navbar-brand-margin-end);font-size:var(--bs-navbar-brand-font-size);color:var(--bs-navbar-brand-color);text-decoration:none;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{color:var(--bs-navbar-brand-hover-color)}.navbar-nav{--bs-nav-link-padding-x:0;--bs-nav-link-padding-y:0.5rem;--bs-nav-link-font-weight: ;--bs-nav-link-color:var(--bs-navbar-color);--bs-nav-link-hover-color:var(--bs-navbar-hover-color);--bs-nav-link-disabled-color:var(--bs-navbar-disabled-color);display:flex;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{padding-top:.5rem;padding-bottom:.5rem;color:var(--bs-navbar-color)}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{flex-basis:100%;flex-grow:1;align-items:center}.navbar-toggler{padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);font-size:var(--bs-navbar-toggler-font-size);line-height:1;color:var(--bs-navbar-color);background-color:transparent;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{text-decoration:none;outline:0;box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width)}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;background-image:var(--bs-navbar-toggler-icon-bg);background-repeat:no-repeat;background-position:center;background-size:100%}.navbar-nav-scroll{max-height:var(--bs-scroll-height,75vh);overflow-y:auto}@media (min-width:576px){.navbar-expand-sm{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}.navbar-expand-sm .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:768px){.navbar-expand-md{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}.navbar-expand-md .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:992px){.navbar-expand-lg{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}.navbar-expand-lg .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1200px){.navbar-expand-xl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}.navbar-expand-xl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}@media (min-width:1400px){.navbar-expand-xxl{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand-xxl .navbar-nav{flex-direction:row}.navbar-expand-xxl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xxl .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand-xxl .navbar-nav-scroll{overflow:visible}.navbar-expand-xxl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xxl .navbar-toggler{display:none}.navbar-expand-xxl .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}}.navbar-expand{flex-wrap:nowrap;justify-content:flex-start}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-right:var(--bs-navbar-nav-link-padding-x);padding-left:var(--bs-navbar-nav-link-padding-x)}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-expand .offcanvas{position:static;z-index:auto;flex-grow:1;width:auto!important;height:auto!important;visibility:visible!important;background-color:transparent!important;border:0!important;transform:none!important;transition:none}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color:rgba(255, 255, 255, 0.8);--bs-navbar-hover-color:#fff;--bs-navbar-disabled-color:rgba(255, 255, 255, 0.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:rgba(255, 255, 255, 0.1);--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.8%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.8%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e")}.card{--bs-card-spacer-y:1rem;--bs-card-spacer-x:1rem;--bs-card-title-spacer-y:0.5rem;--bs-card-title-color: ;--bs-card-subtitle-color: ;--bs-card-border-width:var(--bs-border-width);--bs-card-border-color:var(--bs-border-color-translucent);--bs-card-border-radius:var(--bs-border-radius);--bs-card-box-shadow: ;--bs-card-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-card-cap-padding-y:0.5rem;--bs-card-cap-padding-x:1rem;--bs-card-cap-bg:rgba(var(--bs-body-color-rgb), 0.03);--bs-card-cap-color: ;--bs-card-height: ;--bs-card-color: ;--bs-card-bg:var(--bs-body-bg);--bs-card-img-overlay-padding:1rem;--bs-card-group-margin:0.75rem;position:relative;display:flex;flex-direction:column;min-width:0;height:var(--bs-card-height);color:var(--bs-body-color);word-wrap:break-word;background-color:var(--bs-card-bg);background-clip:border-box;border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius)}.card>hr{margin-right:0;margin-left:0}.card>.list-group{border-top:inherit;border-bottom:inherit}.card>.list-group:first-child{border-top-width:0;border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card>.list-group:last-child{border-bottom-width:0;border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x);color:var(--bs-card-color)}.card-title{margin-bottom:var(--bs-card-title-spacer-y);color:var(--bs-card-title-color)}.card-subtitle{margin-top:calc(-.5 * var(--bs-card-title-spacer-y));margin-bottom:0;color:var(--bs-card-subtitle-color)}.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);margin-bottom:0;color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);color:var(--bs-card-cap-color);background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-bottom:calc(-1 * var(--bs-card-cap-padding-y));margin-left:calc(-.5 * var(--bs-card-cap-padding-x));border-bottom:0}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-right:calc(-.5 * var(--bs-card-cap-padding-x));margin-left:calc(-.5 * var(--bs-card-cap-padding-x))}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);border-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom,.card-img-top{width:100%}.card-img,.card-img-top{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius)}.card-img,.card-img-bottom{border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-left-radius:var(--bs-card-inner-border-radius)}.card-group>.card{margin-bottom:var(--bs-card-group-margin)}@media (min-width:576px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.accordion{--bs-accordion-color:var(--bs-body-color);--bs-accordion-bg:var(--bs-body-bg);--bs-accordion-transition:color 0.15s ease-in-out,background-color 0.15s ease-in-out,border-color 0.15s ease-in-out,box-shadow 0.15s ease-in-out,border-radius 0.15s ease;--bs-accordion-border-color:var(--bs-border-color);--bs-accordion-border-width:var(--bs-border-width);--bs-accordion-border-radius:var(--bs-border-radius);--bs-accordion-inner-border-radius:calc(var(--bs-border-radius) - (var(--bs-border-width)));--bs-accordion-btn-padding-x:1.25rem;--bs-accordion-btn-padding-y:1rem;--bs-accordion-btn-color:var(--bs-body-color);--bs-accordion-btn-bg:var(--bs-accordion-bg);--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23495057'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-icon-width:1.25rem;--bs-accordion-btn-icon-transform:rotate(-180deg);--bs-accordion-btn-icon-transition:transform 0.2s ease-in-out;--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2313425c'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-focus-border-color:#97d2f3;--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(47, 164, 231, 0.25);--bs-accordion-body-padding-x:1.25rem;--bs-accordion-body-padding-y:1rem;--bs-accordion-active-color:var(--bs-primary-text-emphasis);--bs-accordion-active-bg:var(--bs-primary-bg-subtle)}.accordion-button{position:relative;display:flex;align-items:center;width:100%;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);font-size:1rem;color:var(--bs-accordion-btn-color);text-align:left;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;overflow-anchor:none;transition:var(--bs-accordion-transition)}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){color:var(--bs-accordion-active-color);background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color)}.accordion-button:not(.collapsed)::after{background-image:var(--bs-accordion-btn-active-icon);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button::after{flex-shrink:0;width:var(--bs-accordion-btn-icon-width);height:var(--bs-accordion-btn-icon-width);margin-left:auto;content:"";background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);transition:var(--bs-accordion-btn-icon-transition)}@media (prefers-reduced-motion:reduce){.accordion-button::after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{z-index:3;border-color:var(--bs-accordion-btn-focus-border-color);outline:0;box-shadow:var(--bs-accordion-btn-focus-box-shadow)}.accordion-header{margin-bottom:0}.accordion-item{color:var(--bs-accordion-color);background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color)}.accordion-item:first-of-type{border-top-left-radius:var(--bs-accordion-border-radius);border-top-right-radius:var(--bs-accordion-border-radius)}.accordion-item:first-of-type .accordion-button{border-top-left-radius:var(--bs-accordion-inner-border-radius);border-top-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:not(:first-of-type){border-top:0}.accordion-item:last-of-type{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-right-radius:var(--bs-accordion-inner-border-radius);border-bottom-left-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-right-radius:var(--bs-accordion-border-radius);border-bottom-left-radius:var(--bs-accordion-border-radius)}.accordion-body{padding:var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x)}.accordion-flush .accordion-collapse{border-width:0}.accordion-flush .accordion-item{border-right:0;border-left:0;border-radius:0}.accordion-flush .accordion-item:first-child{border-top:0}.accordion-flush .accordion-item:last-child{border-bottom:0}.accordion-flush .accordion-item .accordion-button,.accordion-flush .accordion-item .accordion-button.collapsed{border-radius:0}[data-bs-theme=dark] .accordion-button::after{--bs-accordion-btn-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2382c8f1'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");--bs-accordion-btn-active-icon:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%2382c8f1'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.breadcrumb{--bs-breadcrumb-padding-x:0;--bs-breadcrumb-padding-y:0;--bs-breadcrumb-margin-bottom:1rem;--bs-breadcrumb-bg: ;--bs-breadcrumb-border-radius: ;--bs-breadcrumb-divider-color:var(--bs-secondary-color);--bs-breadcrumb-item-padding-x:0.5rem;--bs-breadcrumb-item-active-color:var(--bs-secondary-color);display:flex;flex-wrap:wrap;padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);margin-bottom:var(--bs-breadcrumb-margin-bottom);font-size:var(--bs-breadcrumb-font-size);list-style:none;background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item::before{float:left;padding-right:var(--bs-breadcrumb-item-padding-x);color:var(--bs-breadcrumb-divider-color);content:var(--bs-breadcrumb-divider, "/")}.breadcrumb-item.active{color:var(--bs-breadcrumb-item-active-color)}.pagination{--bs-pagination-padding-x:0.75rem;--bs-pagination-padding-y:0.375rem;--bs-pagination-font-size:1rem;--bs-pagination-color:var(--bs-link-color);--bs-pagination-bg:var(--bs-body-bg);--bs-pagination-border-width:var(--bs-border-width);--bs-pagination-border-color:var(--bs-border-color);--bs-pagination-border-radius:var(--bs-border-radius);--bs-pagination-hover-color:var(--bs-link-hover-color);--bs-pagination-hover-bg:var(--bs-tertiary-bg);--bs-pagination-hover-border-color:var(--bs-border-color);--bs-pagination-focus-color:var(--bs-link-hover-color);--bs-pagination-focus-bg:var(--bs-secondary-bg);--bs-pagination-focus-box-shadow:0 0 0 0.25rem rgba(47, 164, 231, 0.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#2fa4e7;--bs-pagination-active-border-color:#2fa4e7;--bs-pagination-disabled-color:var(--bs-secondary-color);--bs-pagination-disabled-bg:var(--bs-secondary-bg);--bs-pagination-disabled-border-color:var(--bs-border-color);display:flex;padding-left:0;list-style:none}.page-link{position:relative;display:block;padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);font-size:var(--bs-pagination-font-size);color:var(--bs-pagination-color);text-decoration:none;background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.page-link{transition:none}}.page-link:hover{z-index:2;color:var(--bs-pagination-hover-color);background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color)}.page-link:focus{z-index:3;color:var(--bs-pagination-focus-color);background-color:var(--bs-pagination-focus-bg);outline:0;box-shadow:var(--bs-pagination-focus-box-shadow)}.active>.page-link,.page-link.active{z-index:3;color:var(--bs-pagination-active-color);background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color)}.disabled>.page-link,.page-link.disabled{color:var(--bs-pagination-disabled-color);pointer-events:none;background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color)}.page-item:not(:first-child) .page-link{margin-left:calc(var(--bs-border-width) * -1)}.page-item:first-child .page-link{border-top-left-radius:var(--bs-pagination-border-radius);border-bottom-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-top-right-radius:var(--bs-pagination-border-radius);border-bottom-right-radius:var(--bs-pagination-border-radius)}.pagination-lg{--bs-pagination-padding-x:1.5rem;--bs-pagination-padding-y:0.75rem;--bs-pagination-font-size:1.25rem;--bs-pagination-border-radius:var(--bs-border-radius-lg)}.pagination-sm{--bs-pagination-padding-x:0.5rem;--bs-pagination-padding-y:0.25rem;--bs-pagination-font-size:0.875rem;--bs-pagination-border-radius:var(--bs-border-radius-sm)}.badge{--bs-badge-padding-x:0.65em;--bs-badge-padding-y:0.35em;--bs-badge-font-size:0.75em;--bs-badge-font-weight:700;--bs-badge-color:#fff;--bs-badge-border-radius:var(--bs-border-radius);display:inline-block;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;color:var(--bs-badge-color);text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:var(--bs-badge-border-radius)}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.alert{--bs-alert-bg:transparent;--bs-alert-padding-x:1rem;--bs-alert-padding-y:1rem;--bs-alert-margin-bottom:1rem;--bs-alert-color:inherit;--bs-alert-border-color:transparent;--bs-alert-border:var(--bs-border-width) solid var(--bs-alert-border-color);--bs-alert-border-radius:var(--bs-border-radius);--bs-alert-link-color:inherit;position:relative;padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);margin-bottom:var(--bs-alert-margin-bottom);color:var(--bs-alert-color);background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius)}.alert-heading{color:inherit}.alert-link{font-weight:700;color:var(--bs-alert-link-color)}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{position:absolute;top:0;right:0;z-index:2;padding:1.25rem 1rem}.alert-primary{--bs-alert-color:var(--bs-primary-text-emphasis);--bs-alert-bg:var(--bs-primary-bg-subtle);--bs-alert-border-color:var(--bs-primary-border-subtle);--bs-alert-link-color:var(--bs-primary-text-emphasis)}.alert-secondary{--bs-alert-color:var(--bs-secondary-text-emphasis);--bs-alert-bg:var(--bs-secondary-bg-subtle);--bs-alert-border-color:var(--bs-secondary-border-subtle);--bs-alert-link-color:var(--bs-secondary-text-emphasis)}.alert-success{--bs-alert-color:var(--bs-success-text-emphasis);--bs-alert-bg:var(--bs-success-bg-subtle);--bs-alert-border-color:var(--bs-success-border-subtle);--bs-alert-link-color:var(--bs-success-text-emphasis)}.alert-info{--bs-alert-color:var(--bs-info-text-emphasis);--bs-alert-bg:var(--bs-info-bg-subtle);--bs-alert-border-color:var(--bs-info-border-subtle);--bs-alert-link-color:var(--bs-info-text-emphasis)}.alert-warning{--bs-alert-color:var(--bs-warning-text-emphasis);--bs-alert-bg:var(--bs-warning-bg-subtle);--bs-alert-border-color:var(--bs-warning-border-subtle);--bs-alert-link-color:var(--bs-warning-text-emphasis)}.alert-danger{--bs-alert-color:var(--bs-danger-text-emphasis);--bs-alert-bg:var(--bs-danger-bg-subtle);--bs-alert-border-color:var(--bs-danger-border-subtle);--bs-alert-link-color:var(--bs-danger-text-emphasis)}.alert-light{--bs-alert-color:var(--bs-light-text-emphasis);--bs-alert-bg:var(--bs-light-bg-subtle);--bs-alert-border-color:var(--bs-light-border-subtle);--bs-alert-link-color:var(--bs-light-text-emphasis)}.alert-dark{--bs-alert-color:var(--bs-dark-text-emphasis);--bs-alert-bg:var(--bs-dark-bg-subtle);--bs-alert-border-color:var(--bs-dark-border-subtle);--bs-alert-link-color:var(--bs-dark-text-emphasis)}@keyframes progress-bar-stripes{0%{background-position-x:1rem}}.progress,.progress-stacked{--bs-progress-height:1rem;--bs-progress-font-size:0.75rem;--bs-progress-bg:var(--bs-secondary-bg);--bs-progress-border-radius:var(--bs-border-radius);--bs-progress-box-shadow:var(--bs-box-shadow-inset);--bs-progress-bar-color:#fff;--bs-progress-bar-bg:#2fa4e7;--bs-progress-bar-transition:width 0.6s ease;display:flex;height:var(--bs-progress-height);overflow:hidden;font-size:var(--bs-progress-font-size);background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius)}.progress-bar{display:flex;flex-direction:column;justify-content:center;overflow:hidden;color:var(--bs-progress-bar-color);text-align:center;white-space:nowrap;background-color:var(--bs-progress-bar-bg);transition:var(--bs-progress-bar-transition)}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:var(--bs-progress-height) var(--bs-progress-height)}.progress-stacked>.progress{overflow:visible}.progress-stacked>.progress>.progress-bar{width:100%}.progress-bar-animated{animation:1s linear infinite progress-bar-stripes}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.list-group{--bs-list-group-color:var(--bs-body-color);--bs-list-group-bg:var(--bs-body-bg);--bs-list-group-border-color:var(--bs-border-color);--bs-list-group-border-width:var(--bs-border-width);--bs-list-group-border-radius:var(--bs-border-radius);--bs-list-group-item-padding-x:1rem;--bs-list-group-item-padding-y:0.5rem;--bs-list-group-action-color:var(--bs-secondary-color);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-tertiary-bg);--bs-list-group-action-active-color:var(--bs-body-color);--bs-list-group-action-active-bg:var(--bs-secondary-bg);--bs-list-group-disabled-color:var(--bs-secondary-color);--bs-list-group-disabled-bg:var(--bs-body-bg);--bs-list-group-active-color:#fff;--bs-list-group-active-bg:#2fa4e7;--bs-list-group-active-border-color:#2fa4e7;display:flex;flex-direction:column;padding-left:0;margin-bottom:0;border-radius:var(--bs-list-group-border-radius)}.list-group-numbered{list-style-type:none;counter-reset:section}.list-group-numbered>.list-group-item::before{content:counters(section, ".") ". ";counter-increment:section}.list-group-item-action{width:100%;color:var(--bs-list-group-action-color);text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{z-index:1;color:var(--bs-list-group-action-hover-color);text-decoration:none;background-color:var(--bs-list-group-action-hover-bg)}.list-group-item-action:active{color:var(--bs-list-group-action-active-color);background-color:var(--bs-list-group-action-active-bg)}.list-group-item{position:relative;display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);color:var(--bs-list-group-color);text-decoration:none;background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color)}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-right-radius:inherit;border-bottom-left-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{color:var(--bs-list-group-disabled-color);pointer-events:none;background-color:var(--bs-list-group-disabled-bg)}.list-group-item.active{z-index:2;color:var(--bs-list-group-active-color);background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color)}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{margin-top:calc(-1 * var(--bs-list-group-border-width));border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}@media (min-width:576px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:768px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-md>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:992px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1200px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}@media (min-width:1400px){.list-group-horizontal-xxl{flex-direction:row}.list-group-horizontal-xxl>.list-group-item:first-child:not(:last-child){border-bottom-left-radius:var(--bs-list-group-border-radius);border-top-right-radius:0}.list-group-horizontal-xxl>.list-group-item:last-child:not(:first-child){border-top-right-radius:var(--bs-list-group-border-radius);border-bottom-left-radius:0}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-top-width:var(--bs-list-group-border-width);border-left-width:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{margin-left:calc(-1 * var(--bs-list-group-border-width));border-left-width:var(--bs-list-group-border-width)}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 var(--bs-list-group-border-width)}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{--bs-list-group-color:var(--bs-primary-text-emphasis);--bs-list-group-bg:var(--bs-primary-bg-subtle);--bs-list-group-border-color:var(--bs-primary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-primary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-primary-border-subtle);--bs-list-group-active-color:var(--bs-primary-bg-subtle);--bs-list-group-active-bg:var(--bs-primary-text-emphasis);--bs-list-group-active-border-color:var(--bs-primary-text-emphasis)}.list-group-item-secondary{--bs-list-group-color:var(--bs-secondary-text-emphasis);--bs-list-group-bg:var(--bs-secondary-bg-subtle);--bs-list-group-border-color:var(--bs-secondary-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-secondary-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-secondary-border-subtle);--bs-list-group-active-color:var(--bs-secondary-bg-subtle);--bs-list-group-active-bg:var(--bs-secondary-text-emphasis);--bs-list-group-active-border-color:var(--bs-secondary-text-emphasis)}.list-group-item-success{--bs-list-group-color:var(--bs-success-text-emphasis);--bs-list-group-bg:var(--bs-success-bg-subtle);--bs-list-group-border-color:var(--bs-success-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-success-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-success-border-subtle);--bs-list-group-active-color:var(--bs-success-bg-subtle);--bs-list-group-active-bg:var(--bs-success-text-emphasis);--bs-list-group-active-border-color:var(--bs-success-text-emphasis)}.list-group-item-info{--bs-list-group-color:var(--bs-info-text-emphasis);--bs-list-group-bg:var(--bs-info-bg-subtle);--bs-list-group-border-color:var(--bs-info-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-info-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-info-border-subtle);--bs-list-group-active-color:var(--bs-info-bg-subtle);--bs-list-group-active-bg:var(--bs-info-text-emphasis);--bs-list-group-active-border-color:var(--bs-info-text-emphasis)}.list-group-item-warning{--bs-list-group-color:var(--bs-warning-text-emphasis);--bs-list-group-bg:var(--bs-warning-bg-subtle);--bs-list-group-border-color:var(--bs-warning-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-warning-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-warning-border-subtle);--bs-list-group-active-color:var(--bs-warning-bg-subtle);--bs-list-group-active-bg:var(--bs-warning-text-emphasis);--bs-list-group-active-border-color:var(--bs-warning-text-emphasis)}.list-group-item-danger{--bs-list-group-color:var(--bs-danger-text-emphasis);--bs-list-group-bg:var(--bs-danger-bg-subtle);--bs-list-group-border-color:var(--bs-danger-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-danger-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-danger-border-subtle);--bs-list-group-active-color:var(--bs-danger-bg-subtle);--bs-list-group-active-bg:var(--bs-danger-text-emphasis);--bs-list-group-active-border-color:var(--bs-danger-text-emphasis)}.list-group-item-light{--bs-list-group-color:var(--bs-light-text-emphasis);--bs-list-group-bg:var(--bs-light-bg-subtle);--bs-list-group-border-color:var(--bs-light-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-light-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-light-border-subtle);--bs-list-group-active-color:var(--bs-light-bg-subtle);--bs-list-group-active-bg:var(--bs-light-text-emphasis);--bs-list-group-active-border-color:var(--bs-light-text-emphasis)}.list-group-item-dark{--bs-list-group-color:var(--bs-dark-text-emphasis);--bs-list-group-bg:var(--bs-dark-bg-subtle);--bs-list-group-border-color:var(--bs-dark-border-subtle);--bs-list-group-action-hover-color:var(--bs-emphasis-color);--bs-list-group-action-hover-bg:var(--bs-dark-border-subtle);--bs-list-group-action-active-color:var(--bs-emphasis-color);--bs-list-group-action-active-bg:var(--bs-dark-border-subtle);--bs-list-group-active-color:var(--bs-dark-bg-subtle);--bs-list-group-active-bg:var(--bs-dark-text-emphasis);--bs-list-group-active-border-color:var(--bs-dark-text-emphasis)}.btn-close{--bs-btn-close-color:#000;--bs-btn-close-bg:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e");--bs-btn-close-opacity:0.5;--bs-btn-close-hover-opacity:0.75;--bs-btn-close-focus-shadow:0 0 0 0.25rem rgba(47, 164, 231, 0.25);--bs-btn-close-focus-opacity:1;--bs-btn-close-disabled-opacity:0.25;--bs-btn-close-white-filter:invert(1) grayscale(100%) brightness(200%);box-sizing:content-box;width:1em;height:1em;padding:.25em .25em;color:var(--bs-btn-close-color);background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;opacity:var(--bs-btn-close-opacity)}.btn-close:hover{color:var(--bs-btn-close-color);text-decoration:none;opacity:var(--bs-btn-close-hover-opacity)}.btn-close:focus{outline:0;box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity)}.btn-close.disabled,.btn-close:disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;opacity:var(--bs-btn-close-disabled-opacity)}.btn-close-white{filter:var(--bs-btn-close-white-filter)}[data-bs-theme=dark] .btn-close{filter:var(--bs-btn-close-white-filter)}.toast{--bs-toast-zindex:1090;--bs-toast-padding-x:0.75rem;--bs-toast-padding-y:0.5rem;--bs-toast-spacing:1.5rem;--bs-toast-max-width:350px;--bs-toast-font-size:0.875rem;--bs-toast-color: ;--bs-toast-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-border-width:var(--bs-border-width);--bs-toast-border-color:var(--bs-border-color-translucent);--bs-toast-border-radius:var(--bs-border-radius);--bs-toast-box-shadow:var(--bs-box-shadow);--bs-toast-header-color:var(--bs-secondary-color);--bs-toast-header-bg:rgba(var(--bs-body-bg-rgb), 0.85);--bs-toast-header-border-color:var(--bs-border-color-translucent);width:var(--bs-toast-max-width);max-width:100%;font-size:var(--bs-toast-font-size);color:var(--bs-toast-color);pointer-events:auto;background-color:var(--bs-toast-bg);background-clip:padding-box;border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);box-shadow:var(--bs-toast-box-shadow);border-radius:var(--bs-toast-border-radius)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;position:absolute;z-index:var(--bs-toast-zindex);width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:100%;pointer-events:none}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{display:flex;align-items:center;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x);color:var(--bs-toast-header-color);background-color:var(--bs-toast-header-bg);background-clip:padding-box;border-bottom:var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);border-top-left-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));border-top-right-radius:calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width))}.toast-header .btn-close{margin-right:calc(-.5 * var(--bs-toast-padding-x));margin-left:var(--bs-toast-padding-x)}.toast-body{padding:var(--bs-toast-padding-x);word-wrap:break-word}.modal{--bs-modal-zindex:1055;--bs-modal-width:500px;--bs-modal-padding:1rem;--bs-modal-margin:0.5rem;--bs-modal-color: ;--bs-modal-bg:var(--bs-body-bg);--bs-modal-border-color:var(--bs-border-color-translucent);--bs-modal-border-width:var(--bs-border-width);--bs-modal-border-radius:var(--bs-border-radius-lg);--bs-modal-box-shadow:var(--bs-box-shadow-sm);--bs-modal-inner-border-radius:calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));--bs-modal-header-padding-x:1rem;--bs-modal-header-padding-y:1rem;--bs-modal-header-padding:1rem 1rem;--bs-modal-header-border-color:var(--bs-border-color);--bs-modal-header-border-width:var(--bs-border-width);--bs-modal-title-line-height:1.5;--bs-modal-footer-gap:0.5rem;--bs-modal-footer-bg: ;--bs-modal-footer-border-color:var(--bs-border-color);--bs-modal-footer-border-width:var(--bs-border-width);position:fixed;top:0;left:0;z-index:var(--bs-modal-zindex);display:none;width:100%;height:100%;overflow-x:hidden;overflow-y:auto;outline:0}.modal-dialog{position:relative;width:auto;margin:var(--bs-modal-margin);pointer-events:none}.modal.fade .modal-dialog{transition:transform .3s ease-out;transform:translate(0,-50px)}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{height:calc(100% - var(--bs-modal-margin) * 2)}.modal-dialog-scrollable .modal-content{max-height:100%;overflow:hidden}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{display:flex;align-items:center;min-height:calc(100% - var(--bs-modal-margin) * 2)}.modal-content{position:relative;display:flex;flex-direction:column;width:100%;color:var(--bs-modal-color);pointer-events:auto;background-color:var(--bs-modal-bg);background-clip:padding-box;border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);outline:0}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;position:fixed;top:0;left:0;z-index:var(--bs-backdrop-zindex);width:100vw;height:100vh;background-color:var(--bs-backdrop-bg)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{display:flex;flex-shrink:0;align-items:center;justify-content:space-between;padding:var(--bs-modal-header-padding);border-bottom:var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);border-top-left-radius:var(--bs-modal-inner-border-radius);border-top-right-radius:var(--bs-modal-inner-border-radius)}.modal-header .btn-close{padding:calc(var(--bs-modal-header-padding-y) * .5) calc(var(--bs-modal-header-padding-x) * .5);margin:calc(-.5 * var(--bs-modal-header-padding-y)) calc(-.5 * var(--bs-modal-header-padding-x)) calc(-.5 * var(--bs-modal-header-padding-y)) auto}.modal-title{margin-bottom:0;line-height:var(--bs-modal-title-line-height)}.modal-body{position:relative;flex:1 1 auto;padding:var(--bs-modal-padding)}.modal-footer{display:flex;flex-shrink:0;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * .5);background-color:var(--bs-modal-footer-bg);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-bottom-left-radius:var(--bs-modal-inner-border-radius)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap) * .5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:var(--bs-box-shadow)}.modal-dialog{max-width:var(--bs-modal-width);margin-right:auto;margin-left:auto}.modal-sm{--bs-modal-width:300px}}@media (min-width:992px){.modal-lg,.modal-xl{--bs-modal-width:800px}}@media (min-width:1200px){.modal-xl{--bs-modal-width:1140px}}.modal-fullscreen{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen .modal-footer,.modal-fullscreen .modal-header{border-radius:0}.modal-fullscreen .modal-body{overflow-y:auto}@media (max-width:575.98px){.modal-fullscreen-sm-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-sm-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-sm-down .modal-footer,.modal-fullscreen-sm-down .modal-header{border-radius:0}.modal-fullscreen-sm-down .modal-body{overflow-y:auto}}@media (max-width:767.98px){.modal-fullscreen-md-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-md-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-md-down .modal-footer,.modal-fullscreen-md-down .modal-header{border-radius:0}.modal-fullscreen-md-down .modal-body{overflow-y:auto}}@media (max-width:991.98px){.modal-fullscreen-lg-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-lg-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-lg-down .modal-footer,.modal-fullscreen-lg-down .modal-header{border-radius:0}.modal-fullscreen-lg-down .modal-body{overflow-y:auto}}@media (max-width:1199.98px){.modal-fullscreen-xl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xl-down .modal-footer,.modal-fullscreen-xl-down .modal-header{border-radius:0}.modal-fullscreen-xl-down .modal-body{overflow-y:auto}}@media (max-width:1399.98px){.modal-fullscreen-xxl-down{width:100vw;max-width:none;height:100%;margin:0}.modal-fullscreen-xxl-down .modal-content{height:100%;border:0;border-radius:0}.modal-fullscreen-xxl-down .modal-footer,.modal-fullscreen-xxl-down .modal-header{border-radius:0}.modal-fullscreen-xxl-down .modal-body{overflow-y:auto}}.tooltip{--bs-tooltip-zindex:1080;--bs-tooltip-max-width:200px;--bs-tooltip-padding-x:0.5rem;--bs-tooltip-padding-y:0.25rem;--bs-tooltip-margin: ;--bs-tooltip-font-size:0.875rem;--bs-tooltip-color:var(--bs-body-bg);--bs-tooltip-bg:var(--bs-emphasis-color);--bs-tooltip-border-radius:var(--bs-border-radius);--bs-tooltip-opacity:0.9;--bs-tooltip-arrow-width:0.8rem;--bs-tooltip-arrow-height:0.4rem;z-index:var(--bs-tooltip-zindex);display:block;margin:var(--bs-tooltip-margin);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-tooltip-font-size);word-wrap:break-word;opacity:0}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;width:var(--bs-tooltip-arrow-width);height:var(--bs-tooltip-arrow-height)}.tooltip .tooltip-arrow::before{position:absolute;content:"";border-color:transparent;border-style:solid}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before,.bs-tooltip-top .tooltip-arrow::before{top:-1px;border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-top-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{left:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before,.bs-tooltip-end .tooltip-arrow::before{right:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * .5) 0;border-right-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:calc(-1 * var(--bs-tooltip-arrow-height))}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before,.bs-tooltip-bottom .tooltip-arrow::before{bottom:-1px;border-width:0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-bottom-color:var(--bs-tooltip-bg)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{right:calc(-1 * var(--bs-tooltip-arrow-height));width:var(--bs-tooltip-arrow-height);height:var(--bs-tooltip-arrow-width)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before,.bs-tooltip-start .tooltip-arrow::before{left:-1px;border-width:calc(var(--bs-tooltip-arrow-width) * .5) 0 calc(var(--bs-tooltip-arrow-width) * .5) var(--bs-tooltip-arrow-height);border-left-color:var(--bs-tooltip-bg)}.tooltip-inner{max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);color:var(--bs-tooltip-color);text-align:center;background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius)}.popover{--bs-popover-zindex:1070;--bs-popover-max-width:276px;--bs-popover-font-size:0.875rem;--bs-popover-bg:var(--bs-body-bg);--bs-popover-border-width:var(--bs-border-width);--bs-popover-border-color:var(--bs-border-color-translucent);--bs-popover-border-radius:var(--bs-border-radius-lg);--bs-popover-inner-border-radius:calc(var(--bs-border-radius-lg) - var(--bs-border-width));--bs-popover-box-shadow:var(--bs-box-shadow);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:#2fa4e7;--bs-popover-header-bg:var(--bs-secondary-bg);--bs-popover-body-padding-x:1rem;--bs-popover-body-padding-y:1rem;--bs-popover-body-color:var(--bs-body-color);--bs-popover-arrow-width:1rem;--bs-popover-arrow-height:0.5rem;--bs-popover-arrow-border:var(--bs-popover-border-color);z-index:var(--bs-popover-zindex);display:block;max-width:var(--bs-popover-max-width);font-family:var(--bs-font-sans-serif);font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;white-space:normal;word-spacing:normal;line-break:auto;font-size:var(--bs-popover-font-size);word-wrap:break-word;background-color:var(--bs-popover-bg);background-clip:padding-box;border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius)}.popover .popover-arrow{display:block;width:var(--bs-popover-arrow-width);height:var(--bs-popover-arrow-height)}.popover .popover-arrow::after,.popover .popover-arrow::before{position:absolute;display:block;content:"";border-color:transparent;border-style:solid;border-width:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::after,.bs-popover-top>.popover-arrow::before{border-width:var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::before,.bs-popover-top>.popover-arrow::before{bottom:0;border-top-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow::after,.bs-popover-top>.popover-arrow::after{bottom:var(--bs-popover-border-width);border-top-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{left:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::after,.bs-popover-end>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * .5) 0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::before,.bs-popover-end>.popover-arrow::before{left:0;border-right-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow::after,.bs-popover-end>.popover-arrow::after{left:var(--bs-popover-border-width);border-right-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width))}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::before{border-width:0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::before,.bs-popover-bottom>.popover-arrow::before{top:0;border-bottom-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow::after,.bs-popover-bottom>.popover-arrow::after{top:var(--bs-popover-border-width);border-bottom-color:var(--bs-popover-bg)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header::before,.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:var(--bs-popover-arrow-width);margin-left:calc(-.5 * var(--bs-popover-arrow-width));content:"";border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{right:calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height);height:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::after,.bs-popover-start>.popover-arrow::before{border-width:calc(var(--bs-popover-arrow-width) * .5) 0 calc(var(--bs-popover-arrow-width) * .5) var(--bs-popover-arrow-height)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::before,.bs-popover-start>.popover-arrow::before{right:0;border-left-color:var(--bs-popover-arrow-border)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow::after,.bs-popover-start>.popover-arrow::after{right:var(--bs-popover-border-width);border-left-color:var(--bs-popover-bg)}.popover-header{padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);margin-bottom:0;font-size:var(--bs-popover-header-font-size);color:var(--bs-popover-header-color);background-color:var(--bs-popover-header-bg);border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-top-left-radius:var(--bs-popover-inner-border-radius);border-top-right-radius:var(--bs-popover-inner-border-radius)}.popover-header:empty{display:none}.popover-body{padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);color:var(--bs-popover-body-color)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner::after{display:block;clear:both;content:""}.carousel-item{position:relative;display:none;float:left;width:100%;margin-right:-100%;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition:transform .6s ease-in-out}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-end,.carousel-item-next:not(.carousel-item-start){transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transition-property:opacity;transform:none}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{z-index:1;opacity:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{z-index:0;opacity:0;transition:opacity 0s .6s}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{transition:none}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;z-index:1;display:flex;align-items:center;justify-content:center;width:15%;padding:0;color:#fff;text-align:center;background:0 0;border:0;opacity:.5;transition:opacity .15s ease}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:2rem;height:2rem;background-repeat:no-repeat;background-position:50%;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e")}.carousel-control-next-icon{background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e")}.carousel-indicators{position:absolute;right:0;bottom:0;left:0;z-index:2;display:flex;justify-content:center;padding:0;margin-right:15%;margin-bottom:1rem;margin-left:15%}.carousel-indicators [data-bs-target]{box-sizing:content-box;flex:0 1 auto;width:30px;height:3px;padding:0;margin-right:3px;margin-left:3px;text-indent:-999px;cursor:pointer;background-color:#fff;background-clip:padding-box;border:0;border-top:10px solid transparent;border-bottom:10px solid transparent;opacity:.5;transition:opacity .6s ease}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{position:absolute;right:15%;bottom:1.25rem;left:15%;padding-top:1.25rem;padding-bottom:1.25rem;color:#fff;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{filter:invert(1) grayscale(100)}.carousel-dark .carousel-indicators [data-bs-target]{background-color:#000}.carousel-dark .carousel-caption{color:#000}[data-bs-theme=dark] .carousel .carousel-control-next-icon,[data-bs-theme=dark] .carousel .carousel-control-prev-icon,[data-bs-theme=dark].carousel .carousel-control-next-icon,[data-bs-theme=dark].carousel .carousel-control-prev-icon{filter:invert(1) grayscale(100)}[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target],[data-bs-theme=dark].carousel .carousel-indicators [data-bs-target]{background-color:#000}[data-bs-theme=dark] .carousel .carousel-caption,[data-bs-theme=dark].carousel .carousel-caption{color:#000}.spinner-border,.spinner-grow{display:inline-block;width:var(--bs-spinner-width);height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);border-radius:50%;animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name)}@keyframes spinner-border{to{transform:rotate(360deg)}}.spinner-border{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-border-width:0.25em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-border;border:var(--bs-spinner-border-width) solid currentcolor;border-right-color:transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{--bs-spinner-width:2rem;--bs-spinner-height:2rem;--bs-spinner-vertical-align:-0.125em;--bs-spinner-animation-speed:0.75s;--bs-spinner-animation-name:spinner-grow;background-color:currentcolor;opacity:0}.spinner-grow-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{--bs-spinner-animation-speed:1.5s}}.offcanvas,.offcanvas-lg,.offcanvas-md,.offcanvas-sm,.offcanvas-xl,.offcanvas-xxl{--bs-offcanvas-zindex:1045;--bs-offcanvas-width:400px;--bs-offcanvas-height:30vh;--bs-offcanvas-padding-x:1rem;--bs-offcanvas-padding-y:1rem;--bs-offcanvas-color:var(--bs-body-color);--bs-offcanvas-bg:var(--bs-body-bg);--bs-offcanvas-border-width:var(--bs-border-width);--bs-offcanvas-border-color:var(--bs-border-color-translucent);--bs-offcanvas-box-shadow:var(--bs-box-shadow-sm);--bs-offcanvas-transition:transform 0.3s ease-in-out;--bs-offcanvas-title-line-height:1.5}@media (max-width:575.98px){.offcanvas-sm{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-sm.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-sm.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{transform:none}.offcanvas-sm.hiding,.offcanvas-sm.show,.offcanvas-sm.showing{visibility:visible}}@media (min-width:576px){.offcanvas-sm{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:767.98px){.offcanvas-md{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-md.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-md.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{transform:none}.offcanvas-md.hiding,.offcanvas-md.show,.offcanvas-md.showing{visibility:visible}}@media (min-width:768px){.offcanvas-md{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:991.98px){.offcanvas-lg{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-lg.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-lg.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{transform:none}.offcanvas-lg.hiding,.offcanvas-lg.show,.offcanvas-lg.showing{visibility:visible}}@media (min-width:992px){.offcanvas-lg{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1199.98px){.offcanvas-xl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{transform:none}.offcanvas-xl.hiding,.offcanvas-xl.show,.offcanvas-xl.showing{visibility:visible}}@media (min-width:1200px){.offcanvas-xl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}@media (max-width:1399.98px){.offcanvas-xxl{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas-xxl.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas-xxl.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{transform:none}.offcanvas-xxl.hiding,.offcanvas-xxl.show,.offcanvas-xxl.showing{visibility:visible}}@media (min-width:1400px){.offcanvas-xxl{--bs-offcanvas-height:auto;--bs-offcanvas-border-width:0;background-color:transparent!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{display:flex;flex-grow:0;padding:0;overflow-y:visible;background-color:transparent!important}}.offcanvas{position:fixed;bottom:0;z-index:var(--bs-offcanvas-zindex);display:flex;flex-direction:column;max-width:100%;color:var(--bs-offcanvas-color);visibility:hidden;background-color:var(--bs-offcanvas-bg);background-clip:padding-box;outline:0;transition:var(--bs-offcanvas-transition)}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{top:0;left:0;width:var(--bs-offcanvas-width);border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(-100%)}.offcanvas.offcanvas-end{top:0;right:0;width:var(--bs-offcanvas-width);border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateX(100%)}.offcanvas.offcanvas-top{top:0;right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(-100%)}.offcanvas.offcanvas-bottom{right:0;left:0;height:var(--bs-offcanvas-height);max-height:100%;border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{position:fixed;top:0;left:0;z-index:1040;width:100vw;height:100vh;background-color:#000}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{display:flex;align-items:center;justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{padding:calc(var(--bs-offcanvas-padding-y) * .5) calc(var(--bs-offcanvas-padding-x) * .5);margin-top:calc(-.5 * var(--bs-offcanvas-padding-y));margin-right:calc(-.5 * var(--bs-offcanvas-padding-x));margin-bottom:calc(-.5 * var(--bs-offcanvas-padding-y))}.offcanvas-title{margin-bottom:0;line-height:var(--bs-offcanvas-title-line-height)}.offcanvas-body{flex-grow:1;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);overflow-y:auto}.placeholder{display:inline-block;min-height:1em;vertical-align:middle;cursor:wait;background-color:currentcolor;opacity:.5}.placeholder.btn::before{display:inline-block;content:""}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{animation:placeholder-glow 2s ease-in-out infinite}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,0.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%;animation:placeholder-wave 2s linear infinite}@keyframes placeholder-wave{100%{-webkit-mask-position:-200% 0%;mask-position:-200% 0%}}.clearfix::after{display:block;clear:both;content:""}.text-bg-primary{color:#fff!important;background-color:RGBA(var(--bs-primary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-secondary{color:#000!important;background-color:RGBA(var(--bs-secondary-rgb),var(--bs-bg-opacity,1))!important}.text-bg-success{color:#fff!important;background-color:RGBA(var(--bs-success-rgb),var(--bs-bg-opacity,1))!important}.text-bg-info{color:#fff!important;background-color:RGBA(var(--bs-info-rgb),var(--bs-bg-opacity,1))!important}.text-bg-warning{color:#fff!important;background-color:RGBA(var(--bs-warning-rgb),var(--bs-bg-opacity,1))!important}.text-bg-danger{color:#fff!important;background-color:RGBA(var(--bs-danger-rgb),var(--bs-bg-opacity,1))!important}.text-bg-light{color:#000!important;background-color:RGBA(var(--bs-light-rgb),var(--bs-bg-opacity,1))!important}.text-bg-dark{color:#fff!important;background-color:RGBA(var(--bs-dark-rgb),var(--bs-bg-opacity,1))!important}.link-primary{color:RGBA(var(--bs-primary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important}.link-primary:focus,.link-primary:hover{color:RGBA(38,131,185,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(38,131,185,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(38,131,185,var(--bs-link-underline-opacity,1))!important}.link-secondary{color:RGBA(var(--bs-secondary-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important}.link-secondary:focus,.link-secondary:hover{color:RGBA(237,240,242,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(237,240,242,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(237,240,242,var(--bs-link-underline-opacity,1))!important}.link-success{color:RGBA(var(--bs-success-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important}.link-success:focus,.link-success:hover{color:RGBA(92,134,46,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(92,134,46,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(92,134,46,var(--bs-link-underline-opacity,1))!important}.link-info{color:RGBA(var(--bs-info-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important}.link-info:focus,.link-info:hover{color:RGBA(2,48,92,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(2,48,92,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(2,48,92,var(--bs-link-underline-opacity,1))!important}.link-warning{color:RGBA(var(--bs-warning-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important}.link-warning:focus,.link-warning:hover{color:RGBA(177,69,0,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(177,69,0,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(177,69,0,var(--bs-link-underline-opacity,1))!important}.link-danger{color:RGBA(var(--bs-danger-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important}.link-danger:focus,.link-danger:hover{color:RGBA(159,22,27,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(159,22,27,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(159,22,27,var(--bs-link-underline-opacity,1))!important}.link-light{color:RGBA(var(--bs-light-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important}.link-light:focus,.link-light:hover{color:RGBA(249,250,251,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important}.link-dark{color:RGBA(var(--bs-dark-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important}.link-dark:focus,.link-dark:hover{color:RGBA(42,46,51,var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(42,46,51,var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(42,46,51,var(--bs-link-underline-opacity,1))!important}.link-body-emphasis{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,1))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-body-emphasis:focus,.link-body-emphasis:hover{color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,.75))!important;-webkit-text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,0.75))!important}.focus-ring:focus{outline:0;box-shadow:var(--bs-focus-ring-x,0) var(--bs-focus-ring-y,0) var(--bs-focus-ring-blur,0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.icon-link{display:inline-flex;gap:.375rem;align-items:center;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,0.5));text-underline-offset:0.25em;-webkit-backface-visibility:hidden;backface-visibility:hidden}.icon-link>.bi{flex-shrink:0;width:1em;height:1em;fill:currentcolor;transition:.2s ease-in-out transform}@media (prefers-reduced-motion:reduce){.icon-link>.bi{transition:none}}.icon-link-hover:focus-visible>.bi,.icon-link-hover:hover>.bi{transform:var(--bs-icon-link-transform,translate3d(.25em,0,0))}.ratio{position:relative;width:100%}.ratio::before{display:block;padding-top:var(--bs-aspect-ratio);content:""}.ratio>*{position:absolute;top:0;left:0;width:100%;height:100%}.ratio-1x1{--bs-aspect-ratio:100%}.ratio-4x3{--bs-aspect-ratio:75%}.ratio-16x9{--bs-aspect-ratio:56.25%}.ratio-21x9{--bs-aspect-ratio:42.8571428571%}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}@media (min-width:576px){.sticky-sm-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-sm-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:768px){.sticky-md-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-md-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:992px){.sticky-lg-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-lg-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1200px){.sticky-xl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}@media (min-width:1400px){.sticky-xxl-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}.sticky-xxl-bottom{position:-webkit-sticky;position:sticky;bottom:0;z-index:1020}}.hstack{display:flex;flex-direction:row;align-items:center;align-self:stretch}.vstack{display:flex;flex:1 1 auto;flex-direction:column;align-self:stretch}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){width:1px!important;height:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption),.visually-hidden:not(caption){position:absolute!important}.stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{display:inline-block;align-self:stretch;width:var(--bs-border-width);min-height:1em;background-color:currentcolor;opacity:.25}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.float-start{float:left!important}.float-end{float:right!important}.float-none{float:none!important}.object-fit-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-none{-o-object-fit:none!important;object-fit:none!important}.opacity-0{opacity:0!important}.opacity-25{opacity:.25!important}.opacity-50{opacity:.5!important}.opacity-75{opacity:.75!important}.opacity-100{opacity:1!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.overflow-visible{overflow:visible!important}.overflow-scroll{overflow:scroll!important}.overflow-x-auto{overflow-x:auto!important}.overflow-x-hidden{overflow-x:hidden!important}.overflow-x-visible{overflow-x:visible!important}.overflow-x-scroll{overflow-x:scroll!important}.overflow-y-auto{overflow-y:auto!important}.overflow-y-hidden{overflow-y:hidden!important}.overflow-y-visible{overflow-y:visible!important}.overflow-y-scroll{overflow-y:scroll!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-grid{display:grid!important}.d-inline-grid{display:inline-grid!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}.d-none{display:none!important}.shadow{box-shadow:var(--bs-box-shadow)!important}.shadow-sm{box-shadow:var(--bs-box-shadow-sm)!important}.shadow-lg{box-shadow:var(--bs-box-shadow-lg)!important}.shadow-none{box-shadow:none!important}.focus-ring-primary{--bs-focus-ring-color:rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-secondary{--bs-focus-ring-color:rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity))}.focus-ring-success{--bs-focus-ring-color:rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity))}.focus-ring-info{--bs-focus-ring-color:rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity))}.focus-ring-warning{--bs-focus-ring-color:rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity))}.focus-ring-danger{--bs-focus-ring-color:rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity))}.focus-ring-light{--bs-focus-ring-color:rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity))}.focus-ring-dark{--bs-focus-ring-color:rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity))}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:-webkit-sticky!important;position:sticky!important}.top-0{top:0!important}.top-50{top:50%!important}.top-100{top:100%!important}.bottom-0{bottom:0!important}.bottom-50{bottom:50%!important}.bottom-100{bottom:100%!important}.start-0{left:0!important}.start-50{left:50%!important}.start-100{left:100%!important}.end-0{right:0!important}.end-50{right:50%!important}.end-100{right:100%!important}.translate-middle{transform:translate(-50%,-50%)!important}.translate-middle-x{transform:translateX(-50%)!important}.translate-middle-y{transform:translateY(-50%)!important}.border{border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-top-0{border-top:0!important}.border-end{border-right:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-end-0{border-right:0!important}.border-bottom{border-bottom:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-bottom-0{border-bottom:0!important}.border-start{border-left:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-start-0{border-left:0!important}.border-primary{--bs-border-opacity:1;border-color:rgba(var(--bs-primary-rgb),var(--bs-border-opacity))!important}.border-secondary{--bs-border-opacity:1;border-color:rgba(var(--bs-secondary-rgb),var(--bs-border-opacity))!important}.border-success{--bs-border-opacity:1;border-color:rgba(var(--bs-success-rgb),var(--bs-border-opacity))!important}.border-info{--bs-border-opacity:1;border-color:rgba(var(--bs-info-rgb),var(--bs-border-opacity))!important}.border-warning{--bs-border-opacity:1;border-color:rgba(var(--bs-warning-rgb),var(--bs-border-opacity))!important}.border-danger{--bs-border-opacity:1;border-color:rgba(var(--bs-danger-rgb),var(--bs-border-opacity))!important}.border-light{--bs-border-opacity:1;border-color:rgba(var(--bs-light-rgb),var(--bs-border-opacity))!important}.border-dark{--bs-border-opacity:1;border-color:rgba(var(--bs-dark-rgb),var(--bs-border-opacity))!important}.border-black{--bs-border-opacity:1;border-color:rgba(var(--bs-black-rgb),var(--bs-border-opacity))!important}.border-white{--bs-border-opacity:1;border-color:rgba(var(--bs-white-rgb),var(--bs-border-opacity))!important}.border-primary-subtle{border-color:var(--bs-primary-border-subtle)!important}.border-secondary-subtle{border-color:var(--bs-secondary-border-subtle)!important}.border-success-subtle{border-color:var(--bs-success-border-subtle)!important}.border-info-subtle{border-color:var(--bs-info-border-subtle)!important}.border-warning-subtle{border-color:var(--bs-warning-border-subtle)!important}.border-danger-subtle{border-color:var(--bs-danger-border-subtle)!important}.border-light-subtle{border-color:var(--bs-light-border-subtle)!important}.border-dark-subtle{border-color:var(--bs-dark-border-subtle)!important}.border-1{border-width:1px!important}.border-2{border-width:2px!important}.border-3{border-width:3px!important}.border-4{border-width:4px!important}.border-5{border-width:5px!important}.border-opacity-10{--bs-border-opacity:0.1}.border-opacity-25{--bs-border-opacity:0.25}.border-opacity-50{--bs-border-opacity:0.5}.border-opacity-75{--bs-border-opacity:0.75}.border-opacity-100{--bs-border-opacity:1}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.mw-100{max-width:100%!important}.vw-100{width:100vw!important}.min-vw-100{min-width:100vw!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mh-100{max-height:100%!important}.vh-100{height:100vh!important}.min-vh-100{min-height:100vh!important}.flex-fill{flex:1 1 auto!important}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.justify-content-evenly{justify-content:space-evenly!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}.order-first{order:-1!important}.order-0{order:0!important}.order-1{order:1!important}.order-2{order:2!important}.order-3{order:3!important}.order-4{order:4!important}.order-5{order:5!important}.order-last{order:6!important}.m-0{margin:0!important}.m-1{margin:.25rem!important}.m-2{margin:.5rem!important}.m-3{margin:1rem!important}.m-4{margin:1.5rem!important}.m-5{margin:3rem!important}.m-auto{margin:auto!important}.mx-0{margin-right:0!important;margin-left:0!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-0{margin-top:0!important;margin-bottom:0!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-0{margin-top:0!important}.mt-1{margin-top:.25rem!important}.mt-2{margin-top:.5rem!important}.mt-3{margin-top:1rem!important}.mt-4{margin-top:1.5rem!important}.mt-5{margin-top:3rem!important}.mt-auto{margin-top:auto!important}.me-0{margin-right:0!important}.me-1{margin-right:.25rem!important}.me-2{margin-right:.5rem!important}.me-3{margin-right:1rem!important}.me-4{margin-right:1.5rem!important}.me-5{margin-right:3rem!important}.me-auto{margin-right:auto!important}.mb-0{margin-bottom:0!important}.mb-1{margin-bottom:.25rem!important}.mb-2{margin-bottom:.5rem!important}.mb-3{margin-bottom:1rem!important}.mb-4{margin-bottom:1.5rem!important}.mb-5{margin-bottom:3rem!important}.mb-auto{margin-bottom:auto!important}.ms-0{margin-left:0!important}.ms-1{margin-left:.25rem!important}.ms-2{margin-left:.5rem!important}.ms-3{margin-left:1rem!important}.ms-4{margin-left:1.5rem!important}.ms-5{margin-left:3rem!important}.ms-auto{margin-left:auto!important}.p-0{padding:0!important}.p-1{padding:.25rem!important}.p-2{padding:.5rem!important}.p-3{padding:1rem!important}.p-4{padding:1.5rem!important}.p-5{padding:3rem!important}.px-0{padding-right:0!important;padding-left:0!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-0{padding-top:0!important;padding-bottom:0!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-0{padding-top:0!important}.pt-1{padding-top:.25rem!important}.pt-2{padding-top:.5rem!important}.pt-3{padding-top:1rem!important}.pt-4{padding-top:1.5rem!important}.pt-5{padding-top:3rem!important}.pe-0{padding-right:0!important}.pe-1{padding-right:.25rem!important}.pe-2{padding-right:.5rem!important}.pe-3{padding-right:1rem!important}.pe-4{padding-right:1.5rem!important}.pe-5{padding-right:3rem!important}.pb-0{padding-bottom:0!important}.pb-1{padding-bottom:.25rem!important}.pb-2{padding-bottom:.5rem!important}.pb-3{padding-bottom:1rem!important}.pb-4{padding-bottom:1.5rem!important}.pb-5{padding-bottom:3rem!important}.ps-0{padding-left:0!important}.ps-1{padding-left:.25rem!important}.ps-2{padding-left:.5rem!important}.ps-3{padding-left:1rem!important}.ps-4{padding-left:1.5rem!important}.ps-5{padding-left:3rem!important}.gap-0{gap:0!important}.gap-1{gap:.25rem!important}.gap-2{gap:.5rem!important}.gap-3{gap:1rem!important}.gap-4{gap:1.5rem!important}.gap-5{gap:3rem!important}.row-gap-0{row-gap:0!important}.row-gap-1{row-gap:.25rem!important}.row-gap-2{row-gap:.5rem!important}.row-gap-3{row-gap:1rem!important}.row-gap-4{row-gap:1.5rem!important}.row-gap-5{row-gap:3rem!important}.column-gap-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.font-monospace{font-family:var(--bs-font-monospace)!important}.fs-1{font-size:calc(1.375rem + 1.5vw)!important}.fs-2{font-size:calc(1.325rem + .9vw)!important}.fs-3{font-size:calc(1.3rem + .6vw)!important}.fs-4{font-size:calc(1.275rem + .3vw)!important}.fs-5{font-size:1.25rem!important}.fs-6{font-size:1rem!important}.fst-italic{font-style:italic!important}.fst-normal{font-style:normal!important}.fw-lighter{font-weight:lighter!important}.fw-light{font-weight:300!important}.fw-normal{font-weight:400!important}.fw-medium{font-weight:500!important}.fw-semibold{font-weight:600!important}.fw-bold{font-weight:700!important}.fw-bolder{font-weight:bolder!important}.lh-1{line-height:1!important}.lh-sm{line-height:1.25!important}.lh-base{line-height:1.5!important}.lh-lg{line-height:2!important}.text-start{text-align:left!important}.text-end{text-align:right!important}.text-center{text-align:center!important}.text-decoration-none{text-decoration:none!important}.text-decoration-underline{text-decoration:underline!important}.text-decoration-line-through{text-decoration:line-through!important}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-primary{--bs-text-opacity:1;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-black-50{--bs-text-opacity:1;color:rgba(0,0,0,.5)!important}.text-white-50{--bs-text-opacity:1;color:rgba(255,255,255,.5)!important}.text-body-secondary{--bs-text-opacity:1;color:var(--bs-secondary-color)!important}.text-body-tertiary{--bs-text-opacity:1;color:var(--bs-tertiary-color)!important}.text-body-emphasis{--bs-text-opacity:1;color:var(--bs-emphasis-color)!important}.text-reset{--bs-text-opacity:1;color:inherit!important}.text-opacity-25{--bs-text-opacity:0.25}.text-opacity-50{--bs-text-opacity:0.5}.text-opacity-75{--bs-text-opacity:0.75}.text-opacity-100{--bs-text-opacity:1}.text-primary-emphasis{color:var(--bs-primary-text-emphasis)!important}.text-secondary-emphasis{color:var(--bs-secondary-text-emphasis)!important}.text-success-emphasis{color:var(--bs-success-text-emphasis)!important}.text-info-emphasis{color:var(--bs-info-text-emphasis)!important}.text-warning-emphasis{color:var(--bs-warning-text-emphasis)!important}.text-danger-emphasis{color:var(--bs-danger-text-emphasis)!important}.text-light-emphasis{color:var(--bs-light-text-emphasis)!important}.text-dark-emphasis{color:var(--bs-dark-text-emphasis)!important}.link-opacity-10{--bs-link-opacity:0.1}.link-opacity-10-hover:hover{--bs-link-opacity:0.1}.link-opacity-25{--bs-link-opacity:0.25}.link-opacity-25-hover:hover{--bs-link-opacity:0.25}.link-opacity-50{--bs-link-opacity:0.5}.link-opacity-50-hover:hover{--bs-link-opacity:0.5}.link-opacity-75{--bs-link-opacity:0.75}.link-opacity-75-hover:hover{--bs-link-opacity:0.75}.link-opacity-100{--bs-link-opacity:1}.link-opacity-100-hover:hover{--bs-link-opacity:1}.link-offset-1{text-underline-offset:0.125em!important}.link-offset-1-hover:hover{text-underline-offset:0.125em!important}.link-offset-2{text-underline-offset:0.25em!important}.link-offset-2-hover:hover{text-underline-offset:0.25em!important}.link-offset-3{text-underline-offset:0.375em!important}.link-offset-3-hover:hover{text-underline-offset:0.375em!important}.link-underline-primary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-primary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-secondary{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-secondary-rgb),var(--bs-link-underline-opacity))!important}.link-underline-success{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-success-rgb),var(--bs-link-underline-opacity))!important}.link-underline-info{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-info-rgb),var(--bs-link-underline-opacity))!important}.link-underline-warning{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-warning-rgb),var(--bs-link-underline-opacity))!important}.link-underline-danger{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-danger-rgb),var(--bs-link-underline-opacity))!important}.link-underline-light{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-light-rgb),var(--bs-link-underline-opacity))!important}.link-underline-dark{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important;text-decoration-color:rgba(var(--bs-dark-rgb),var(--bs-link-underline-opacity))!important}.link-underline{--bs-link-underline-opacity:1;-webkit-text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-underline-opacity-0{--bs-link-underline-opacity:0}.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity:0}.link-underline-opacity-10{--bs-link-underline-opacity:0.1}.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity:0.1}.link-underline-opacity-25{--bs-link-underline-opacity:0.25}.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity:0.25}.link-underline-opacity-50{--bs-link-underline-opacity:0.5}.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity:0.5}.link-underline-opacity-75{--bs-link-underline-opacity:0.75}.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity:0.75}.link-underline-opacity-100{--bs-link-underline-opacity:1}.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:transparent!important}.bg-body-secondary{--bs-bg-opacity:1;background-color:rgba(var(--bs-secondary-bg-rgb),var(--bs-bg-opacity))!important}.bg-body-tertiary{--bs-bg-opacity:1;background-color:rgba(var(--bs-tertiary-bg-rgb),var(--bs-bg-opacity))!important}.bg-opacity-10{--bs-bg-opacity:0.1}.bg-opacity-25{--bs-bg-opacity:0.25}.bg-opacity-50{--bs-bg-opacity:0.5}.bg-opacity-75{--bs-bg-opacity:0.75}.bg-opacity-100{--bs-bg-opacity:1}.bg-primary-subtle{background-color:var(--bs-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:var(--bs-secondary-bg-subtle)!important}.bg-success-subtle{background-color:var(--bs-success-bg-subtle)!important}.bg-info-subtle{background-color:var(--bs-info-bg-subtle)!important}.bg-warning-subtle{background-color:var(--bs-warning-bg-subtle)!important}.bg-danger-subtle{background-color:var(--bs-danger-bg-subtle)!important}.bg-light-subtle{background-color:var(--bs-light-bg-subtle)!important}.bg-dark-subtle{background-color:var(--bs-dark-bg-subtle)!important}.bg-gradient{background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:var(--bs-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-0{border-top-left-radius:0!important;border-top-right-radius:0!important}.rounded-top-1{border-top-left-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-3{border-top-left-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:var(--bs-border-radius-xxl)!important}.rounded-top-circle{border-top-left-radius:50%!important;border-top-right-radius:50%!important}.rounded-top-pill{border-top-left-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.rounded-end{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-0{border-top-right-radius:0!important;border-bottom-right-radius:0!important}.rounded-end-1{border-top-right-radius:var(--bs-border-radius-sm)!important;border-bottom-right-radius:var(--bs-border-radius-sm)!important}.rounded-end-2{border-top-right-radius:var(--bs-border-radius)!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-end-3{border-top-right-radius:var(--bs-border-radius-lg)!important;border-bottom-right-radius:var(--bs-border-radius-lg)!important}.rounded-end-4{border-top-right-radius:var(--bs-border-radius-xl)!important;border-bottom-right-radius:var(--bs-border-radius-xl)!important}.rounded-end-5{border-top-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-right-radius:var(--bs-border-radius-xxl)!important}.rounded-end-circle{border-top-right-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-end-pill{border-top-right-radius:var(--bs-border-radius-pill)!important;border-bottom-right-radius:var(--bs-border-radius-pill)!important}.rounded-bottom{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-0{border-bottom-right-radius:0!important;border-bottom-left-radius:0!important}.rounded-bottom-1{border-bottom-right-radius:var(--bs-border-radius-sm)!important;border-bottom-left-radius:var(--bs-border-radius-sm)!important}.rounded-bottom-2{border-bottom-right-radius:var(--bs-border-radius)!important;border-bottom-left-radius:var(--bs-border-radius)!important}.rounded-bottom-3{border-bottom-right-radius:var(--bs-border-radius-lg)!important;border-bottom-left-radius:var(--bs-border-radius-lg)!important}.rounded-bottom-4{border-bottom-right-radius:var(--bs-border-radius-xl)!important;border-bottom-left-radius:var(--bs-border-radius-xl)!important}.rounded-bottom-5{border-bottom-right-radius:var(--bs-border-radius-xxl)!important;border-bottom-left-radius:var(--bs-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-right-radius:50%!important;border-bottom-left-radius:50%!important}.rounded-bottom-pill{border-bottom-right-radius:var(--bs-border-radius-pill)!important;border-bottom-left-radius:var(--bs-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-0{border-bottom-left-radius:0!important;border-top-left-radius:0!important}.rounded-start-1{border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-top-left-radius:var(--bs-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-3{border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-top-left-radius:var(--bs-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-top-left-radius:var(--bs-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-top-left-radius:var(--bs-border-radius-xxl)!important}.rounded-start-circle{border-bottom-left-radius:50%!important;border-top-left-radius:50%!important}.rounded-start-pill{border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-top-left-radius:var(--bs-border-radius-pill)!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}.z-n1{z-index:-1!important}.z-0{z-index:0!important}.z-1{z-index:1!important}.z-2{z-index:2!important}.z-3{z-index:3!important}@media (min-width:576px){.float-sm-start{float:left!important}.float-sm-end{float:right!important}.float-sm-none{float:none!important}.object-fit-sm-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-sm-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-sm-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-sm-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-sm-none{-o-object-fit:none!important;object-fit:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-grid{display:grid!important}.d-sm-inline-grid{display:inline-grid!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}.d-sm-none{display:none!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.justify-content-sm-evenly{justify-content:space-evenly!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}.order-sm-first{order:-1!important}.order-sm-0{order:0!important}.order-sm-1{order:1!important}.order-sm-2{order:2!important}.order-sm-3{order:3!important}.order-sm-4{order:4!important}.order-sm-5{order:5!important}.order-sm-last{order:6!important}.m-sm-0{margin:0!important}.m-sm-1{margin:.25rem!important}.m-sm-2{margin:.5rem!important}.m-sm-3{margin:1rem!important}.m-sm-4{margin:1.5rem!important}.m-sm-5{margin:3rem!important}.m-sm-auto{margin:auto!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-sm-0{margin-top:0!important}.mt-sm-1{margin-top:.25rem!important}.mt-sm-2{margin-top:.5rem!important}.mt-sm-3{margin-top:1rem!important}.mt-sm-4{margin-top:1.5rem!important}.mt-sm-5{margin-top:3rem!important}.mt-sm-auto{margin-top:auto!important}.me-sm-0{margin-right:0!important}.me-sm-1{margin-right:.25rem!important}.me-sm-2{margin-right:.5rem!important}.me-sm-3{margin-right:1rem!important}.me-sm-4{margin-right:1.5rem!important}.me-sm-5{margin-right:3rem!important}.me-sm-auto{margin-right:auto!important}.mb-sm-0{margin-bottom:0!important}.mb-sm-1{margin-bottom:.25rem!important}.mb-sm-2{margin-bottom:.5rem!important}.mb-sm-3{margin-bottom:1rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.mb-sm-5{margin-bottom:3rem!important}.mb-sm-auto{margin-bottom:auto!important}.ms-sm-0{margin-left:0!important}.ms-sm-1{margin-left:.25rem!important}.ms-sm-2{margin-left:.5rem!important}.ms-sm-3{margin-left:1rem!important}.ms-sm-4{margin-left:1.5rem!important}.ms-sm-5{margin-left:3rem!important}.ms-sm-auto{margin-left:auto!important}.p-sm-0{padding:0!important}.p-sm-1{padding:.25rem!important}.p-sm-2{padding:.5rem!important}.p-sm-3{padding:1rem!important}.p-sm-4{padding:1.5rem!important}.p-sm-5{padding:3rem!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-sm-0{padding-top:0!important}.pt-sm-1{padding-top:.25rem!important}.pt-sm-2{padding-top:.5rem!important}.pt-sm-3{padding-top:1rem!important}.pt-sm-4{padding-top:1.5rem!important}.pt-sm-5{padding-top:3rem!important}.pe-sm-0{padding-right:0!important}.pe-sm-1{padding-right:.25rem!important}.pe-sm-2{padding-right:.5rem!important}.pe-sm-3{padding-right:1rem!important}.pe-sm-4{padding-right:1.5rem!important}.pe-sm-5{padding-right:3rem!important}.pb-sm-0{padding-bottom:0!important}.pb-sm-1{padding-bottom:.25rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pb-sm-3{padding-bottom:1rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pb-sm-5{padding-bottom:3rem!important}.ps-sm-0{padding-left:0!important}.ps-sm-1{padding-left:.25rem!important}.ps-sm-2{padding-left:.5rem!important}.ps-sm-3{padding-left:1rem!important}.ps-sm-4{padding-left:1.5rem!important}.ps-sm-5{padding-left:3rem!important}.gap-sm-0{gap:0!important}.gap-sm-1{gap:.25rem!important}.gap-sm-2{gap:.5rem!important}.gap-sm-3{gap:1rem!important}.gap-sm-4{gap:1.5rem!important}.gap-sm-5{gap:3rem!important}.row-gap-sm-0{row-gap:0!important}.row-gap-sm-1{row-gap:.25rem!important}.row-gap-sm-2{row-gap:.5rem!important}.row-gap-sm-3{row-gap:1rem!important}.row-gap-sm-4{row-gap:1.5rem!important}.row-gap-sm-5{row-gap:3rem!important}.column-gap-sm-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-sm-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-sm-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-sm-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-sm-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-sm-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-sm-start{text-align:left!important}.text-sm-end{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.float-md-start{float:left!important}.float-md-end{float:right!important}.float-md-none{float:none!important}.object-fit-md-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-md-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-md-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-md-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-md-none{-o-object-fit:none!important;object-fit:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-grid{display:grid!important}.d-md-inline-grid{display:inline-grid!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}.d-md-none{display:none!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.justify-content-md-evenly{justify-content:space-evenly!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}.order-md-first{order:-1!important}.order-md-0{order:0!important}.order-md-1{order:1!important}.order-md-2{order:2!important}.order-md-3{order:3!important}.order-md-4{order:4!important}.order-md-5{order:5!important}.order-md-last{order:6!important}.m-md-0{margin:0!important}.m-md-1{margin:.25rem!important}.m-md-2{margin:.5rem!important}.m-md-3{margin:1rem!important}.m-md-4{margin:1.5rem!important}.m-md-5{margin:3rem!important}.m-md-auto{margin:auto!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-md-0{margin-top:0!important}.mt-md-1{margin-top:.25rem!important}.mt-md-2{margin-top:.5rem!important}.mt-md-3{margin-top:1rem!important}.mt-md-4{margin-top:1.5rem!important}.mt-md-5{margin-top:3rem!important}.mt-md-auto{margin-top:auto!important}.me-md-0{margin-right:0!important}.me-md-1{margin-right:.25rem!important}.me-md-2{margin-right:.5rem!important}.me-md-3{margin-right:1rem!important}.me-md-4{margin-right:1.5rem!important}.me-md-5{margin-right:3rem!important}.me-md-auto{margin-right:auto!important}.mb-md-0{margin-bottom:0!important}.mb-md-1{margin-bottom:.25rem!important}.mb-md-2{margin-bottom:.5rem!important}.mb-md-3{margin-bottom:1rem!important}.mb-md-4{margin-bottom:1.5rem!important}.mb-md-5{margin-bottom:3rem!important}.mb-md-auto{margin-bottom:auto!important}.ms-md-0{margin-left:0!important}.ms-md-1{margin-left:.25rem!important}.ms-md-2{margin-left:.5rem!important}.ms-md-3{margin-left:1rem!important}.ms-md-4{margin-left:1.5rem!important}.ms-md-5{margin-left:3rem!important}.ms-md-auto{margin-left:auto!important}.p-md-0{padding:0!important}.p-md-1{padding:.25rem!important}.p-md-2{padding:.5rem!important}.p-md-3{padding:1rem!important}.p-md-4{padding:1.5rem!important}.p-md-5{padding:3rem!important}.px-md-0{padding-right:0!important;padding-left:0!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-md-0{padding-top:0!important}.pt-md-1{padding-top:.25rem!important}.pt-md-2{padding-top:.5rem!important}.pt-md-3{padding-top:1rem!important}.pt-md-4{padding-top:1.5rem!important}.pt-md-5{padding-top:3rem!important}.pe-md-0{padding-right:0!important}.pe-md-1{padding-right:.25rem!important}.pe-md-2{padding-right:.5rem!important}.pe-md-3{padding-right:1rem!important}.pe-md-4{padding-right:1.5rem!important}.pe-md-5{padding-right:3rem!important}.pb-md-0{padding-bottom:0!important}.pb-md-1{padding-bottom:.25rem!important}.pb-md-2{padding-bottom:.5rem!important}.pb-md-3{padding-bottom:1rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pb-md-5{padding-bottom:3rem!important}.ps-md-0{padding-left:0!important}.ps-md-1{padding-left:.25rem!important}.ps-md-2{padding-left:.5rem!important}.ps-md-3{padding-left:1rem!important}.ps-md-4{padding-left:1.5rem!important}.ps-md-5{padding-left:3rem!important}.gap-md-0{gap:0!important}.gap-md-1{gap:.25rem!important}.gap-md-2{gap:.5rem!important}.gap-md-3{gap:1rem!important}.gap-md-4{gap:1.5rem!important}.gap-md-5{gap:3rem!important}.row-gap-md-0{row-gap:0!important}.row-gap-md-1{row-gap:.25rem!important}.row-gap-md-2{row-gap:.5rem!important}.row-gap-md-3{row-gap:1rem!important}.row-gap-md-4{row-gap:1.5rem!important}.row-gap-md-5{row-gap:3rem!important}.column-gap-md-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-md-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-md-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-md-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-md-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-md-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-md-start{text-align:left!important}.text-md-end{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.float-lg-start{float:left!important}.float-lg-end{float:right!important}.float-lg-none{float:none!important}.object-fit-lg-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-lg-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-lg-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-lg-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-lg-none{-o-object-fit:none!important;object-fit:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-grid{display:grid!important}.d-lg-inline-grid{display:inline-grid!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}.d-lg-none{display:none!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.justify-content-lg-evenly{justify-content:space-evenly!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}.order-lg-first{order:-1!important}.order-lg-0{order:0!important}.order-lg-1{order:1!important}.order-lg-2{order:2!important}.order-lg-3{order:3!important}.order-lg-4{order:4!important}.order-lg-5{order:5!important}.order-lg-last{order:6!important}.m-lg-0{margin:0!important}.m-lg-1{margin:.25rem!important}.m-lg-2{margin:.5rem!important}.m-lg-3{margin:1rem!important}.m-lg-4{margin:1.5rem!important}.m-lg-5{margin:3rem!important}.m-lg-auto{margin:auto!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-lg-0{margin-top:0!important}.mt-lg-1{margin-top:.25rem!important}.mt-lg-2{margin-top:.5rem!important}.mt-lg-3{margin-top:1rem!important}.mt-lg-4{margin-top:1.5rem!important}.mt-lg-5{margin-top:3rem!important}.mt-lg-auto{margin-top:auto!important}.me-lg-0{margin-right:0!important}.me-lg-1{margin-right:.25rem!important}.me-lg-2{margin-right:.5rem!important}.me-lg-3{margin-right:1rem!important}.me-lg-4{margin-right:1.5rem!important}.me-lg-5{margin-right:3rem!important}.me-lg-auto{margin-right:auto!important}.mb-lg-0{margin-bottom:0!important}.mb-lg-1{margin-bottom:.25rem!important}.mb-lg-2{margin-bottom:.5rem!important}.mb-lg-3{margin-bottom:1rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.mb-lg-5{margin-bottom:3rem!important}.mb-lg-auto{margin-bottom:auto!important}.ms-lg-0{margin-left:0!important}.ms-lg-1{margin-left:.25rem!important}.ms-lg-2{margin-left:.5rem!important}.ms-lg-3{margin-left:1rem!important}.ms-lg-4{margin-left:1.5rem!important}.ms-lg-5{margin-left:3rem!important}.ms-lg-auto{margin-left:auto!important}.p-lg-0{padding:0!important}.p-lg-1{padding:.25rem!important}.p-lg-2{padding:.5rem!important}.p-lg-3{padding:1rem!important}.p-lg-4{padding:1.5rem!important}.p-lg-5{padding:3rem!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-lg-0{padding-top:0!important}.pt-lg-1{padding-top:.25rem!important}.pt-lg-2{padding-top:.5rem!important}.pt-lg-3{padding-top:1rem!important}.pt-lg-4{padding-top:1.5rem!important}.pt-lg-5{padding-top:3rem!important}.pe-lg-0{padding-right:0!important}.pe-lg-1{padding-right:.25rem!important}.pe-lg-2{padding-right:.5rem!important}.pe-lg-3{padding-right:1rem!important}.pe-lg-4{padding-right:1.5rem!important}.pe-lg-5{padding-right:3rem!important}.pb-lg-0{padding-bottom:0!important}.pb-lg-1{padding-bottom:.25rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pb-lg-3{padding-bottom:1rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pb-lg-5{padding-bottom:3rem!important}.ps-lg-0{padding-left:0!important}.ps-lg-1{padding-left:.25rem!important}.ps-lg-2{padding-left:.5rem!important}.ps-lg-3{padding-left:1rem!important}.ps-lg-4{padding-left:1.5rem!important}.ps-lg-5{padding-left:3rem!important}.gap-lg-0{gap:0!important}.gap-lg-1{gap:.25rem!important}.gap-lg-2{gap:.5rem!important}.gap-lg-3{gap:1rem!important}.gap-lg-4{gap:1.5rem!important}.gap-lg-5{gap:3rem!important}.row-gap-lg-0{row-gap:0!important}.row-gap-lg-1{row-gap:.25rem!important}.row-gap-lg-2{row-gap:.5rem!important}.row-gap-lg-3{row-gap:1rem!important}.row-gap-lg-4{row-gap:1.5rem!important}.row-gap-lg-5{row-gap:3rem!important}.column-gap-lg-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-lg-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-lg-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-lg-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-lg-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-lg-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-lg-start{text-align:left!important}.text-lg-end{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.float-xl-start{float:left!important}.float-xl-end{float:right!important}.float-xl-none{float:none!important}.object-fit-xl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xl-none{-o-object-fit:none!important;object-fit:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-grid{display:grid!important}.d-xl-inline-grid{display:inline-grid!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}.d-xl-none{display:none!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.justify-content-xl-evenly{justify-content:space-evenly!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}.order-xl-first{order:-1!important}.order-xl-0{order:0!important}.order-xl-1{order:1!important}.order-xl-2{order:2!important}.order-xl-3{order:3!important}.order-xl-4{order:4!important}.order-xl-5{order:5!important}.order-xl-last{order:6!important}.m-xl-0{margin:0!important}.m-xl-1{margin:.25rem!important}.m-xl-2{margin:.5rem!important}.m-xl-3{margin:1rem!important}.m-xl-4{margin:1.5rem!important}.m-xl-5{margin:3rem!important}.m-xl-auto{margin:auto!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xl-0{margin-top:0!important}.mt-xl-1{margin-top:.25rem!important}.mt-xl-2{margin-top:.5rem!important}.mt-xl-3{margin-top:1rem!important}.mt-xl-4{margin-top:1.5rem!important}.mt-xl-5{margin-top:3rem!important}.mt-xl-auto{margin-top:auto!important}.me-xl-0{margin-right:0!important}.me-xl-1{margin-right:.25rem!important}.me-xl-2{margin-right:.5rem!important}.me-xl-3{margin-right:1rem!important}.me-xl-4{margin-right:1.5rem!important}.me-xl-5{margin-right:3rem!important}.me-xl-auto{margin-right:auto!important}.mb-xl-0{margin-bottom:0!important}.mb-xl-1{margin-bottom:.25rem!important}.mb-xl-2{margin-bottom:.5rem!important}.mb-xl-3{margin-bottom:1rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.mb-xl-5{margin-bottom:3rem!important}.mb-xl-auto{margin-bottom:auto!important}.ms-xl-0{margin-left:0!important}.ms-xl-1{margin-left:.25rem!important}.ms-xl-2{margin-left:.5rem!important}.ms-xl-3{margin-left:1rem!important}.ms-xl-4{margin-left:1.5rem!important}.ms-xl-5{margin-left:3rem!important}.ms-xl-auto{margin-left:auto!important}.p-xl-0{padding:0!important}.p-xl-1{padding:.25rem!important}.p-xl-2{padding:.5rem!important}.p-xl-3{padding:1rem!important}.p-xl-4{padding:1.5rem!important}.p-xl-5{padding:3rem!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xl-0{padding-top:0!important}.pt-xl-1{padding-top:.25rem!important}.pt-xl-2{padding-top:.5rem!important}.pt-xl-3{padding-top:1rem!important}.pt-xl-4{padding-top:1.5rem!important}.pt-xl-5{padding-top:3rem!important}.pe-xl-0{padding-right:0!important}.pe-xl-1{padding-right:.25rem!important}.pe-xl-2{padding-right:.5rem!important}.pe-xl-3{padding-right:1rem!important}.pe-xl-4{padding-right:1.5rem!important}.pe-xl-5{padding-right:3rem!important}.pb-xl-0{padding-bottom:0!important}.pb-xl-1{padding-bottom:.25rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pb-xl-3{padding-bottom:1rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pb-xl-5{padding-bottom:3rem!important}.ps-xl-0{padding-left:0!important}.ps-xl-1{padding-left:.25rem!important}.ps-xl-2{padding-left:.5rem!important}.ps-xl-3{padding-left:1rem!important}.ps-xl-4{padding-left:1.5rem!important}.ps-xl-5{padding-left:3rem!important}.gap-xl-0{gap:0!important}.gap-xl-1{gap:.25rem!important}.gap-xl-2{gap:.5rem!important}.gap-xl-3{gap:1rem!important}.gap-xl-4{gap:1.5rem!important}.gap-xl-5{gap:3rem!important}.row-gap-xl-0{row-gap:0!important}.row-gap-xl-1{row-gap:.25rem!important}.row-gap-xl-2{row-gap:.5rem!important}.row-gap-xl-3{row-gap:1rem!important}.row-gap-xl-4{row-gap:1.5rem!important}.row-gap-xl-5{row-gap:3rem!important}.column-gap-xl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xl-start{text-align:left!important}.text-xl-end{text-align:right!important}.text-xl-center{text-align:center!important}}@media (min-width:1400px){.float-xxl-start{float:left!important}.float-xxl-end{float:right!important}.float-xxl-none{float:none!important}.object-fit-xxl-contain{-o-object-fit:contain!important;object-fit:contain!important}.object-fit-xxl-cover{-o-object-fit:cover!important;object-fit:cover!important}.object-fit-xxl-fill{-o-object-fit:fill!important;object-fit:fill!important}.object-fit-xxl-scale{-o-object-fit:scale-down!important;object-fit:scale-down!important}.object-fit-xxl-none{-o-object-fit:none!important;object-fit:none!important}.d-xxl-inline{display:inline!important}.d-xxl-inline-block{display:inline-block!important}.d-xxl-block{display:block!important}.d-xxl-grid{display:grid!important}.d-xxl-inline-grid{display:inline-grid!important}.d-xxl-table{display:table!important}.d-xxl-table-row{display:table-row!important}.d-xxl-table-cell{display:table-cell!important}.d-xxl-flex{display:flex!important}.d-xxl-inline-flex{display:inline-flex!important}.d-xxl-none{display:none!important}.flex-xxl-fill{flex:1 1 auto!important}.flex-xxl-row{flex-direction:row!important}.flex-xxl-column{flex-direction:column!important}.flex-xxl-row-reverse{flex-direction:row-reverse!important}.flex-xxl-column-reverse{flex-direction:column-reverse!important}.flex-xxl-grow-0{flex-grow:0!important}.flex-xxl-grow-1{flex-grow:1!important}.flex-xxl-shrink-0{flex-shrink:0!important}.flex-xxl-shrink-1{flex-shrink:1!important}.flex-xxl-wrap{flex-wrap:wrap!important}.flex-xxl-nowrap{flex-wrap:nowrap!important}.flex-xxl-wrap-reverse{flex-wrap:wrap-reverse!important}.justify-content-xxl-start{justify-content:flex-start!important}.justify-content-xxl-end{justify-content:flex-end!important}.justify-content-xxl-center{justify-content:center!important}.justify-content-xxl-between{justify-content:space-between!important}.justify-content-xxl-around{justify-content:space-around!important}.justify-content-xxl-evenly{justify-content:space-evenly!important}.align-items-xxl-start{align-items:flex-start!important}.align-items-xxl-end{align-items:flex-end!important}.align-items-xxl-center{align-items:center!important}.align-items-xxl-baseline{align-items:baseline!important}.align-items-xxl-stretch{align-items:stretch!important}.align-content-xxl-start{align-content:flex-start!important}.align-content-xxl-end{align-content:flex-end!important}.align-content-xxl-center{align-content:center!important}.align-content-xxl-between{align-content:space-between!important}.align-content-xxl-around{align-content:space-around!important}.align-content-xxl-stretch{align-content:stretch!important}.align-self-xxl-auto{align-self:auto!important}.align-self-xxl-start{align-self:flex-start!important}.align-self-xxl-end{align-self:flex-end!important}.align-self-xxl-center{align-self:center!important}.align-self-xxl-baseline{align-self:baseline!important}.align-self-xxl-stretch{align-self:stretch!important}.order-xxl-first{order:-1!important}.order-xxl-0{order:0!important}.order-xxl-1{order:1!important}.order-xxl-2{order:2!important}.order-xxl-3{order:3!important}.order-xxl-4{order:4!important}.order-xxl-5{order:5!important}.order-xxl-last{order:6!important}.m-xxl-0{margin:0!important}.m-xxl-1{margin:.25rem!important}.m-xxl-2{margin:.5rem!important}.m-xxl-3{margin:1rem!important}.m-xxl-4{margin:1.5rem!important}.m-xxl-5{margin:3rem!important}.m-xxl-auto{margin:auto!important}.mx-xxl-0{margin-right:0!important;margin-left:0!important}.mx-xxl-1{margin-right:.25rem!important;margin-left:.25rem!important}.mx-xxl-2{margin-right:.5rem!important;margin-left:.5rem!important}.mx-xxl-3{margin-right:1rem!important;margin-left:1rem!important}.mx-xxl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.mx-xxl-5{margin-right:3rem!important;margin-left:3rem!important}.mx-xxl-auto{margin-right:auto!important;margin-left:auto!important}.my-xxl-0{margin-top:0!important;margin-bottom:0!important}.my-xxl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.my-xxl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.my-xxl-3{margin-top:1rem!important;margin-bottom:1rem!important}.my-xxl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.my-xxl-5{margin-top:3rem!important;margin-bottom:3rem!important}.my-xxl-auto{margin-top:auto!important;margin-bottom:auto!important}.mt-xxl-0{margin-top:0!important}.mt-xxl-1{margin-top:.25rem!important}.mt-xxl-2{margin-top:.5rem!important}.mt-xxl-3{margin-top:1rem!important}.mt-xxl-4{margin-top:1.5rem!important}.mt-xxl-5{margin-top:3rem!important}.mt-xxl-auto{margin-top:auto!important}.me-xxl-0{margin-right:0!important}.me-xxl-1{margin-right:.25rem!important}.me-xxl-2{margin-right:.5rem!important}.me-xxl-3{margin-right:1rem!important}.me-xxl-4{margin-right:1.5rem!important}.me-xxl-5{margin-right:3rem!important}.me-xxl-auto{margin-right:auto!important}.mb-xxl-0{margin-bottom:0!important}.mb-xxl-1{margin-bottom:.25rem!important}.mb-xxl-2{margin-bottom:.5rem!important}.mb-xxl-3{margin-bottom:1rem!important}.mb-xxl-4{margin-bottom:1.5rem!important}.mb-xxl-5{margin-bottom:3rem!important}.mb-xxl-auto{margin-bottom:auto!important}.ms-xxl-0{margin-left:0!important}.ms-xxl-1{margin-left:.25rem!important}.ms-xxl-2{margin-left:.5rem!important}.ms-xxl-3{margin-left:1rem!important}.ms-xxl-4{margin-left:1.5rem!important}.ms-xxl-5{margin-left:3rem!important}.ms-xxl-auto{margin-left:auto!important}.p-xxl-0{padding:0!important}.p-xxl-1{padding:.25rem!important}.p-xxl-2{padding:.5rem!important}.p-xxl-3{padding:1rem!important}.p-xxl-4{padding:1.5rem!important}.p-xxl-5{padding:3rem!important}.px-xxl-0{padding-right:0!important;padding-left:0!important}.px-xxl-1{padding-right:.25rem!important;padding-left:.25rem!important}.px-xxl-2{padding-right:.5rem!important;padding-left:.5rem!important}.px-xxl-3{padding-right:1rem!important;padding-left:1rem!important}.px-xxl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.px-xxl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xxl-0{padding-top:0!important;padding-bottom:0!important}.py-xxl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.py-xxl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.py-xxl-3{padding-top:1rem!important;padding-bottom:1rem!important}.py-xxl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.py-xxl-5{padding-top:3rem!important;padding-bottom:3rem!important}.pt-xxl-0{padding-top:0!important}.pt-xxl-1{padding-top:.25rem!important}.pt-xxl-2{padding-top:.5rem!important}.pt-xxl-3{padding-top:1rem!important}.pt-xxl-4{padding-top:1.5rem!important}.pt-xxl-5{padding-top:3rem!important}.pe-xxl-0{padding-right:0!important}.pe-xxl-1{padding-right:.25rem!important}.pe-xxl-2{padding-right:.5rem!important}.pe-xxl-3{padding-right:1rem!important}.pe-xxl-4{padding-right:1.5rem!important}.pe-xxl-5{padding-right:3rem!important}.pb-xxl-0{padding-bottom:0!important}.pb-xxl-1{padding-bottom:.25rem!important}.pb-xxl-2{padding-bottom:.5rem!important}.pb-xxl-3{padding-bottom:1rem!important}.pb-xxl-4{padding-bottom:1.5rem!important}.pb-xxl-5{padding-bottom:3rem!important}.ps-xxl-0{padding-left:0!important}.ps-xxl-1{padding-left:.25rem!important}.ps-xxl-2{padding-left:.5rem!important}.ps-xxl-3{padding-left:1rem!important}.ps-xxl-4{padding-left:1.5rem!important}.ps-xxl-5{padding-left:3rem!important}.gap-xxl-0{gap:0!important}.gap-xxl-1{gap:.25rem!important}.gap-xxl-2{gap:.5rem!important}.gap-xxl-3{gap:1rem!important}.gap-xxl-4{gap:1.5rem!important}.gap-xxl-5{gap:3rem!important}.row-gap-xxl-0{row-gap:0!important}.row-gap-xxl-1{row-gap:.25rem!important}.row-gap-xxl-2{row-gap:.5rem!important}.row-gap-xxl-3{row-gap:1rem!important}.row-gap-xxl-4{row-gap:1.5rem!important}.row-gap-xxl-5{row-gap:3rem!important}.column-gap-xxl-0{-moz-column-gap:0!important;column-gap:0!important}.column-gap-xxl-1{-moz-column-gap:0.25rem!important;column-gap:.25rem!important}.column-gap-xxl-2{-moz-column-gap:0.5rem!important;column-gap:.5rem!important}.column-gap-xxl-3{-moz-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xxl-4{-moz-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xxl-5{-moz-column-gap:3rem!important;column-gap:3rem!important}.text-xxl-start{text-align:left!important}.text-xxl-end{text-align:right!important}.text-xxl-center{text-align:center!important}}@media (min-width:1200px){.fs-1{font-size:2.5rem!important}.fs-2{font-size:2rem!important}.fs-3{font-size:1.75rem!important}.fs-4{font-size:1.5rem!important}}@media print{.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-grid{display:grid!important}.d-print-inline-grid{display:inline-grid!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}.d-print-none{display:none!important}}.navbar.bg-primary{background-image:linear-gradient(#50b3eb,#2fa4e7 60%,#2c9ad9)}.navbar.bg-secondary{background-image:linear-gradient(#edeff2,#e9ecef 60%,#dbdee1)}.navbar.bg-success{background-image:linear-gradient(#89b659,#73a839 60%,#6c9e36)}.navbar.bg-info{background-image:linear-gradient(#2b5b89,#033c73 60%,#03386c)}.navbar.bg-warning{background-image:linear-gradient(#e27129,#dd5600 60%,#d05100)}.navbar.bg-danger{background-image:linear-gradient(#d04045,#c71c22 60%,#bb1a20)}.navbar.bg-light{background-image:linear-gradient(#f9fafb,#f8f9fa 60%,#e9eaeb)}.navbar.bg-dark{background-image:linear-gradient(#545a5f,#343a40 60%,#31373c)}.nav-link,.navbar-brand{text-shadow:0 1px 0 rgba(0,0,0,.05)}.btn{text-shadow:0 1px 0 rgba(0,0,0,.05)}.btn-outline-secondary,.btn-secondary{color:#495057}.btn-primary{background-image:linear-gradient(#50b3eb,#2fa4e7 60%,#2c9ad9)}.btn-secondary{background-image:linear-gradient(#edeff2,#e9ecef 60%,#dbdee1)}.btn-success{background-image:linear-gradient(#89b659,#73a839 60%,#6c9e36)}.btn-info{background-image:linear-gradient(#2b5b89,#033c73 60%,#03386c)}.btn-warning{background-image:linear-gradient(#e27129,#dd5600 60%,#d05100)}.btn-danger{background-image:linear-gradient(#d04045,#c71c22 60%,#bb1a20)}.btn-light{background-image:linear-gradient(#f9fafb,#f8f9fa 60%,#e9eaeb)}.btn-dark{background-image:linear-gradient(#545a5f,#343a40 60%,#31373c)}.text-secondary{color:#adb5bd!important}.bg-danger .h1,.bg-danger .h2,.bg-danger .h3,.bg-danger .h4,.bg-danger .h5,.bg-danger .h6,.bg-danger h1,.bg-danger h2,.bg-danger h3,.bg-danger h4,.bg-danger h5,.bg-danger h6,.bg-dark .h1,.bg-dark .h2,.bg-dark .h3,.bg-dark .h4,.bg-dark .h5,.bg-dark .h6,.bg-dark h1,.bg-dark h2,.bg-dark h3,.bg-dark h4,.bg-dark h5,.bg-dark h6,.bg-info .h1,.bg-info .h2,.bg-info .h3,.bg-info .h4,.bg-info .h5,.bg-info .h6,.bg-info h1,.bg-info h2,.bg-info h3,.bg-info h4,.bg-info h5,.bg-info h6,.bg-primary .h1,.bg-primary .h2,.bg-primary .h3,.bg-primary .h4,.bg-primary .h5,.bg-primary .h6,.bg-primary h1,.bg-primary h2,.bg-primary h3,.bg-primary h4,.bg-primary h5,.bg-primary h6,.bg-success .h1,.bg-success .h2,.bg-success .h3,.bg-success .h4,.bg-success .h5,.bg-success .h6,.bg-success h1,.bg-success h2,.bg-success h3,.bg-success h4,.bg-success h5,.bg-success h6,.bg-warning .h1,.bg-warning .h2,.bg-warning .h3,.bg-warning .h4,.bg-warning .h5,.bg-warning .h6,.bg-warning h1,.bg-warning h2,.bg-warning h3,.bg-warning h4,.bg-warning h5,.bg-warning h6{color:#fff}.dropdown-menu .dropdown-header{color:#868e96}.badge.bg-light,.badge.bg-secondary{color:#343a40} -/*# sourceMappingURL=bootstrap.min.css.map */ \ No newline at end of file diff --git a/site/css/bootstrap.min.css.map b/site/css/bootstrap.min.css.map deleted file mode 100644 index 45f3248..0000000 --- a/site/css/bootstrap.min.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["dist/cerulean/bootstrap.css"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/site/css/brands.min.css b/site/css/brands.min.css deleted file mode 100644 index 93a9a73..0000000 --- a/site/css/brands.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2023 Fonticons, Inc. - */ -:host,:root{--fa-style-family-brands:"Font Awesome 6 Brands";--fa-font-brands:normal 400 1em/1 "Font Awesome 6 Brands"}@font-face{font-family:"Font Awesome 6 Brands";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}.fa-brands,.fab{font-weight:400}.fa-monero:before{content:"\f3d0"}.fa-hooli:before{content:"\f427"}.fa-yelp:before{content:"\f1e9"}.fa-cc-visa:before{content:"\f1f0"}.fa-lastfm:before{content:"\f202"}.fa-shopware:before{content:"\f5b5"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-aws:before{content:"\f375"}.fa-redhat:before{content:"\f7bc"}.fa-yoast:before{content:"\f2b1"}.fa-cloudflare:before{content:"\e07d"}.fa-ups:before{content:"\f7e0"}.fa-pixiv:before{content:"\e640"}.fa-wpexplorer:before{content:"\f2de"}.fa-dyalog:before{content:"\f399"}.fa-bity:before{content:"\f37a"}.fa-stackpath:before{content:"\f842"}.fa-buysellads:before{content:"\f20d"}.fa-first-order:before{content:"\f2b0"}.fa-modx:before{content:"\f285"}.fa-guilded:before{content:"\e07e"}.fa-vnv:before{content:"\f40b"}.fa-js-square:before,.fa-square-js:before{content:"\f3b9"}.fa-microsoft:before{content:"\f3ca"}.fa-qq:before{content:"\f1d6"}.fa-orcid:before{content:"\f8d2"}.fa-java:before{content:"\f4e4"}.fa-invision:before{content:"\f7b0"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-centercode:before{content:"\f380"}.fa-glide-g:before{content:"\f2a6"}.fa-drupal:before{content:"\f1a9"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-unity:before{content:"\e049"}.fa-whmcs:before{content:"\f40d"}.fa-rocketchat:before{content:"\f3e8"}.fa-vk:before{content:"\f189"}.fa-untappd:before{content:"\f405"}.fa-mailchimp:before{content:"\f59e"}.fa-css3-alt:before{content:"\f38b"}.fa-reddit-square:before,.fa-square-reddit:before{content:"\f1a2"}.fa-vimeo-v:before{content:"\f27d"}.fa-contao:before{content:"\f26d"}.fa-square-font-awesome:before{content:"\e5ad"}.fa-deskpro:before{content:"\f38f"}.fa-brave:before{content:"\e63c"}.fa-sistrix:before{content:"\f3ee"}.fa-instagram-square:before,.fa-square-instagram:before{content:"\e055"}.fa-battle-net:before{content:"\f835"}.fa-the-red-yeti:before{content:"\f69d"}.fa-hacker-news-square:before,.fa-square-hacker-news:before{content:"\f3af"}.fa-edge:before{content:"\f282"}.fa-threads:before{content:"\e618"}.fa-napster:before{content:"\f3d2"}.fa-snapchat-square:before,.fa-square-snapchat:before{content:"\f2ad"}.fa-google-plus-g:before{content:"\f0d5"}.fa-artstation:before{content:"\f77a"}.fa-markdown:before{content:"\f60f"}.fa-sourcetree:before{content:"\f7d3"}.fa-google-plus:before{content:"\f2b3"}.fa-diaspora:before{content:"\f791"}.fa-foursquare:before{content:"\f180"}.fa-stack-overflow:before{content:"\f16c"}.fa-github-alt:before{content:"\f113"}.fa-phoenix-squadron:before{content:"\f511"}.fa-pagelines:before{content:"\f18c"}.fa-algolia:before{content:"\f36c"}.fa-red-river:before{content:"\f3e3"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-safari:before{content:"\f267"}.fa-google:before{content:"\f1a0"}.fa-font-awesome-alt:before,.fa-square-font-awesome-stroke:before{content:"\f35c"}.fa-atlassian:before{content:"\f77b"}.fa-linkedin-in:before{content:"\f0e1"}.fa-digital-ocean:before{content:"\f391"}.fa-nimblr:before{content:"\f5a8"}.fa-chromecast:before{content:"\f838"}.fa-evernote:before{content:"\f839"}.fa-hacker-news:before{content:"\f1d4"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-adversal:before{content:"\f36a"}.fa-creative-commons:before{content:"\f25e"}.fa-watchman-monitoring:before{content:"\e087"}.fa-fonticons:before{content:"\f280"}.fa-weixin:before{content:"\f1d7"}.fa-shirtsinbulk:before{content:"\f214"}.fa-codepen:before{content:"\f1cb"}.fa-git-alt:before{content:"\f841"}.fa-lyft:before{content:"\f3c3"}.fa-rev:before{content:"\f5b2"}.fa-windows:before{content:"\f17a"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-square-viadeo:before,.fa-viadeo-square:before{content:"\f2aa"}.fa-meetup:before{content:"\f2e0"}.fa-centos:before{content:"\f789"}.fa-adn:before{content:"\f170"}.fa-cloudsmith:before{content:"\f384"}.fa-opensuse:before{content:"\e62b"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-dribbble-square:before,.fa-square-dribbble:before{content:"\f397"}.fa-codiepie:before{content:"\f284"}.fa-node:before{content:"\f419"}.fa-mix:before{content:"\f3cb"}.fa-steam:before{content:"\f1b6"}.fa-cc-apple-pay:before{content:"\f416"}.fa-scribd:before{content:"\f28a"}.fa-debian:before{content:"\e60b"}.fa-openid:before{content:"\f19b"}.fa-instalod:before{content:"\e081"}.fa-expeditedssl:before{content:"\f23e"}.fa-sellcast:before{content:"\f2da"}.fa-square-twitter:before,.fa-twitter-square:before{content:"\f081"}.fa-r-project:before{content:"\f4f7"}.fa-delicious:before{content:"\f1a5"}.fa-freebsd:before{content:"\f3a4"}.fa-vuejs:before{content:"\f41f"}.fa-accusoft:before{content:"\f369"}.fa-ioxhost:before{content:"\f208"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-app-store:before{content:"\f36f"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-itunes-note:before{content:"\f3b5"}.fa-golang:before{content:"\e40f"}.fa-kickstarter:before{content:"\f3bb"}.fa-grav:before{content:"\f2d6"}.fa-weibo:before{content:"\f18a"}.fa-uncharted:before{content:"\e084"}.fa-firstdraft:before{content:"\f3a1"}.fa-square-youtube:before,.fa-youtube-square:before{content:"\f431"}.fa-wikipedia-w:before{content:"\f266"}.fa-rendact:before,.fa-wpressr:before{content:"\f3e4"}.fa-angellist:before{content:"\f209"}.fa-galactic-republic:before{content:"\f50c"}.fa-nfc-directional:before{content:"\e530"}.fa-skype:before{content:"\f17e"}.fa-joget:before{content:"\f3b7"}.fa-fedora:before{content:"\f798"}.fa-stripe-s:before{content:"\f42a"}.fa-meta:before{content:"\e49b"}.fa-laravel:before{content:"\f3bd"}.fa-hotjar:before{content:"\f3b1"}.fa-bluetooth-b:before{content:"\f294"}.fa-square-letterboxd:before{content:"\e62e"}.fa-sticker-mule:before{content:"\f3f7"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-hips:before{content:"\f452"}.fa-behance:before{content:"\f1b4"}.fa-reddit:before{content:"\f1a1"}.fa-discord:before{content:"\f392"}.fa-chrome:before{content:"\f268"}.fa-app-store-ios:before{content:"\f370"}.fa-cc-discover:before{content:"\f1f2"}.fa-wpbeginner:before{content:"\f297"}.fa-confluence:before{content:"\f78d"}.fa-shoelace:before{content:"\e60c"}.fa-mdb:before{content:"\f8ca"}.fa-dochub:before{content:"\f394"}.fa-accessible-icon:before{content:"\f368"}.fa-ebay:before{content:"\f4f4"}.fa-amazon:before{content:"\f270"}.fa-unsplash:before{content:"\e07c"}.fa-yarn:before{content:"\f7e3"}.fa-square-steam:before,.fa-steam-square:before{content:"\f1b7"}.fa-500px:before{content:"\f26e"}.fa-square-vimeo:before,.fa-vimeo-square:before{content:"\f194"}.fa-asymmetrik:before{content:"\f372"}.fa-font-awesome-flag:before,.fa-font-awesome-logo-full:before,.fa-font-awesome:before{content:"\f2b4"}.fa-gratipay:before{content:"\f184"}.fa-apple:before{content:"\f179"}.fa-hive:before{content:"\e07f"}.fa-gitkraken:before{content:"\f3a6"}.fa-keybase:before{content:"\f4f5"}.fa-apple-pay:before{content:"\f415"}.fa-padlet:before{content:"\e4a0"}.fa-amazon-pay:before{content:"\f42c"}.fa-github-square:before,.fa-square-github:before{content:"\f092"}.fa-stumbleupon:before{content:"\f1a4"}.fa-fedex:before{content:"\f797"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-shopify:before{content:"\e057"}.fa-neos:before{content:"\f612"}.fa-square-threads:before{content:"\e619"}.fa-hackerrank:before{content:"\f5f7"}.fa-researchgate:before{content:"\f4f8"}.fa-swift:before{content:"\f8e1"}.fa-angular:before{content:"\f420"}.fa-speakap:before{content:"\f3f3"}.fa-angrycreative:before{content:"\f36e"}.fa-y-combinator:before{content:"\f23b"}.fa-empire:before{content:"\f1d1"}.fa-envira:before{content:"\f299"}.fa-google-scholar:before{content:"\e63b"}.fa-gitlab-square:before,.fa-square-gitlab:before{content:"\e5ae"}.fa-studiovinari:before{content:"\f3f8"}.fa-pied-piper:before{content:"\f2ae"}.fa-wordpress:before{content:"\f19a"}.fa-product-hunt:before{content:"\f288"}.fa-firefox:before{content:"\f269"}.fa-linode:before{content:"\f2b8"}.fa-goodreads:before{content:"\f3a8"}.fa-odnoklassniki-square:before,.fa-square-odnoklassniki:before{content:"\f264"}.fa-jsfiddle:before{content:"\f1cc"}.fa-sith:before{content:"\f512"}.fa-themeisle:before{content:"\f2b2"}.fa-page4:before{content:"\f3d7"}.fa-hashnode:before{content:"\e499"}.fa-react:before{content:"\f41b"}.fa-cc-paypal:before{content:"\f1f4"}.fa-squarespace:before{content:"\f5be"}.fa-cc-stripe:before{content:"\f1f5"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-bitcoin:before{content:"\f379"}.fa-keycdn:before{content:"\f3ba"}.fa-opera:before{content:"\f26a"}.fa-itch-io:before{content:"\f83a"}.fa-umbraco:before{content:"\f8e8"}.fa-galactic-senate:before{content:"\f50d"}.fa-ubuntu:before{content:"\f7df"}.fa-draft2digital:before{content:"\f396"}.fa-stripe:before{content:"\f429"}.fa-houzz:before{content:"\f27c"}.fa-gg:before{content:"\f260"}.fa-dhl:before{content:"\f790"}.fa-pinterest-square:before,.fa-square-pinterest:before{content:"\f0d3"}.fa-xing:before{content:"\f168"}.fa-blackberry:before{content:"\f37b"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-playstation:before{content:"\f3df"}.fa-quinscape:before{content:"\f459"}.fa-less:before{content:"\f41d"}.fa-blogger-b:before{content:"\f37d"}.fa-opencart:before{content:"\f23d"}.fa-vine:before{content:"\f1ca"}.fa-signal-messenger:before{content:"\e663"}.fa-paypal:before{content:"\f1ed"}.fa-gitlab:before{content:"\f296"}.fa-typo3:before{content:"\f42b"}.fa-reddit-alien:before{content:"\f281"}.fa-yahoo:before{content:"\f19e"}.fa-dailymotion:before{content:"\e052"}.fa-affiliatetheme:before{content:"\f36b"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-bootstrap:before{content:"\f836"}.fa-odnoklassniki:before{content:"\f263"}.fa-nfc-symbol:before{content:"\e531"}.fa-mintbit:before{content:"\e62f"}.fa-ethereum:before{content:"\f42e"}.fa-speaker-deck:before{content:"\f83c"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-patreon:before{content:"\f3d9"}.fa-avianex:before{content:"\f374"}.fa-ello:before{content:"\f5f1"}.fa-gofore:before{content:"\f3a7"}.fa-bimobject:before{content:"\f378"}.fa-brave-reverse:before{content:"\e63d"}.fa-facebook-f:before{content:"\f39e"}.fa-google-plus-square:before,.fa-square-google-plus:before{content:"\f0d4"}.fa-mandalorian:before{content:"\f50f"}.fa-first-order-alt:before{content:"\f50a"}.fa-osi:before{content:"\f41a"}.fa-google-wallet:before{content:"\f1ee"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-periscope:before{content:"\f3da"}.fa-fulcrum:before{content:"\f50b"}.fa-cloudscale:before{content:"\f383"}.fa-forumbee:before{content:"\f211"}.fa-mizuni:before{content:"\f3cc"}.fa-schlix:before{content:"\f3ea"}.fa-square-xing:before,.fa-xing-square:before{content:"\f169"}.fa-bandcamp:before{content:"\f2d5"}.fa-wpforms:before{content:"\f298"}.fa-cloudversify:before{content:"\f385"}.fa-usps:before{content:"\f7e1"}.fa-megaport:before{content:"\f5a3"}.fa-magento:before{content:"\f3c4"}.fa-spotify:before{content:"\f1bc"}.fa-optin-monster:before{content:"\f23c"}.fa-fly:before{content:"\f417"}.fa-aviato:before{content:"\f421"}.fa-itunes:before{content:"\f3b4"}.fa-cuttlefish:before{content:"\f38c"}.fa-blogger:before{content:"\f37c"}.fa-flickr:before{content:"\f16e"}.fa-viber:before{content:"\f409"}.fa-soundcloud:before{content:"\f1be"}.fa-digg:before{content:"\f1a6"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-letterboxd:before{content:"\e62d"}.fa-symfony:before{content:"\f83d"}.fa-maxcdn:before{content:"\f136"}.fa-etsy:before{content:"\f2d7"}.fa-facebook-messenger:before{content:"\f39f"}.fa-audible:before{content:"\f373"}.fa-think-peaks:before{content:"\f731"}.fa-bilibili:before{content:"\e3d9"}.fa-erlang:before{content:"\f39d"}.fa-x-twitter:before{content:"\e61b"}.fa-cotton-bureau:before{content:"\f89e"}.fa-dashcube:before{content:"\f210"}.fa-42-group:before,.fa-innosoft:before{content:"\e080"}.fa-stack-exchange:before{content:"\f18d"}.fa-elementor:before{content:"\f430"}.fa-pied-piper-square:before,.fa-square-pied-piper:before{content:"\e01e"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-palfed:before{content:"\f3d8"}.fa-superpowers:before{content:"\f2dd"}.fa-resolving:before{content:"\f3e7"}.fa-xbox:before{content:"\f412"}.fa-searchengin:before{content:"\f3eb"}.fa-tiktok:before{content:"\e07b"}.fa-facebook-square:before,.fa-square-facebook:before{content:"\f082"}.fa-renren:before{content:"\f18b"}.fa-linux:before{content:"\f17c"}.fa-glide:before{content:"\f2a5"}.fa-linkedin:before{content:"\f08c"}.fa-hubspot:before{content:"\f3b2"}.fa-deploydog:before{content:"\f38e"}.fa-twitch:before{content:"\f1e8"}.fa-ravelry:before{content:"\f2d9"}.fa-mixer:before{content:"\e056"}.fa-lastfm-square:before,.fa-square-lastfm:before{content:"\f203"}.fa-vimeo:before{content:"\f40a"}.fa-mendeley:before{content:"\f7b3"}.fa-uniregistry:before{content:"\f404"}.fa-figma:before{content:"\f799"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-dropbox:before{content:"\f16b"}.fa-instagram:before{content:"\f16d"}.fa-cmplid:before{content:"\e360"}.fa-upwork:before{content:"\e641"}.fa-facebook:before{content:"\f09a"}.fa-gripfire:before{content:"\f3ac"}.fa-jedi-order:before{content:"\f50e"}.fa-uikit:before{content:"\f403"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-phabricator:before{content:"\f3db"}.fa-ussunnah:before{content:"\f407"}.fa-earlybirds:before{content:"\f39a"}.fa-trade-federation:before{content:"\f513"}.fa-autoprefixer:before{content:"\f41c"}.fa-whatsapp:before{content:"\f232"}.fa-slideshare:before{content:"\f1e7"}.fa-google-play:before{content:"\f3ab"}.fa-viadeo:before{content:"\f2a9"}.fa-line:before{content:"\f3c0"}.fa-google-drive:before{content:"\f3aa"}.fa-servicestack:before{content:"\f3ec"}.fa-simplybuilt:before{content:"\f215"}.fa-bitbucket:before{content:"\f171"}.fa-imdb:before{content:"\f2d8"}.fa-deezer:before{content:"\e077"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-jira:before{content:"\f7b1"}.fa-docker:before{content:"\f395"}.fa-screenpal:before{content:"\e570"}.fa-bluetooth:before{content:"\f293"}.fa-gitter:before{content:"\f426"}.fa-d-and-d:before{content:"\f38d"}.fa-microblog:before{content:"\e01a"}.fa-cc-diners-club:before{content:"\f24c"}.fa-gg-circle:before{content:"\f261"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-yandex:before{content:"\f413"}.fa-readme:before{content:"\f4d5"}.fa-html5:before{content:"\f13b"}.fa-sellsy:before{content:"\f213"}.fa-sass:before{content:"\f41e"}.fa-wirsindhandwerk:before,.fa-wsh:before{content:"\e2d0"}.fa-buromobelexperte:before{content:"\f37f"}.fa-salesforce:before{content:"\f83b"}.fa-octopus-deploy:before{content:"\e082"}.fa-medapps:before{content:"\f3c6"}.fa-ns8:before{content:"\f3d5"}.fa-pinterest-p:before{content:"\f231"}.fa-apper:before{content:"\f371"}.fa-fort-awesome:before{content:"\f286"}.fa-waze:before{content:"\f83f"}.fa-cc-jcb:before{content:"\f24b"}.fa-snapchat-ghost:before,.fa-snapchat:before{content:"\f2ab"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-rust:before{content:"\e07a"}.fa-wix:before{content:"\f5cf"}.fa-behance-square:before,.fa-square-behance:before{content:"\f1b5"}.fa-supple:before{content:"\f3f9"}.fa-webflow:before{content:"\e65c"}.fa-rebel:before{content:"\f1d0"}.fa-css3:before{content:"\f13c"}.fa-staylinked:before{content:"\f3f5"}.fa-kaggle:before{content:"\f5fa"}.fa-space-awesome:before{content:"\e5ac"}.fa-deviantart:before{content:"\f1bd"}.fa-cpanel:before{content:"\f388"}.fa-goodreads-g:before{content:"\f3a9"}.fa-git-square:before,.fa-square-git:before{content:"\f1d2"}.fa-square-tumblr:before,.fa-tumblr-square:before{content:"\f174"}.fa-trello:before{content:"\f181"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-get-pocket:before{content:"\f265"}.fa-perbyte:before{content:"\e083"}.fa-grunt:before{content:"\f3ad"}.fa-weebly:before{content:"\f5cc"}.fa-connectdevelop:before{content:"\f20e"}.fa-leanpub:before{content:"\f212"}.fa-black-tie:before{content:"\f27e"}.fa-themeco:before{content:"\f5c6"}.fa-python:before{content:"\f3e2"}.fa-android:before{content:"\f17b"}.fa-bots:before{content:"\e340"}.fa-free-code-camp:before{content:"\f2c5"}.fa-hornbill:before{content:"\f592"}.fa-js:before{content:"\f3b8"}.fa-ideal:before{content:"\e013"}.fa-git:before{content:"\f1d3"}.fa-dev:before{content:"\f6cc"}.fa-sketch:before{content:"\f7c6"}.fa-yandex-international:before{content:"\f414"}.fa-cc-amex:before{content:"\f1f3"}.fa-uber:before{content:"\f402"}.fa-github:before{content:"\f09b"}.fa-php:before{content:"\f457"}.fa-alipay:before{content:"\f642"}.fa-youtube:before{content:"\f167"}.fa-skyatlas:before{content:"\f216"}.fa-firefox-browser:before{content:"\e007"}.fa-replyd:before{content:"\f3e6"}.fa-suse:before{content:"\f7d6"}.fa-jenkins:before{content:"\f3b6"}.fa-twitter:before{content:"\f099"}.fa-rockrms:before{content:"\f3e9"}.fa-pinterest:before{content:"\f0d2"}.fa-buffer:before{content:"\f837"}.fa-npm:before{content:"\f3d4"}.fa-yammer:before{content:"\f840"}.fa-btc:before{content:"\f15a"}.fa-dribbble:before{content:"\f17d"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-internet-explorer:before{content:"\f26b"}.fa-stubber:before{content:"\e5c7"}.fa-telegram-plane:before,.fa-telegram:before{content:"\f2c6"}.fa-old-republic:before{content:"\f510"}.fa-odysee:before{content:"\e5c6"}.fa-square-whatsapp:before,.fa-whatsapp-square:before{content:"\f40c"}.fa-node-js:before{content:"\f3d3"}.fa-edge-legacy:before{content:"\e078"}.fa-slack-hash:before,.fa-slack:before{content:"\f198"}.fa-medrt:before{content:"\f3c8"}.fa-usb:before{content:"\f287"}.fa-tumblr:before{content:"\f173"}.fa-vaadin:before{content:"\f408"}.fa-quora:before{content:"\f2c4"}.fa-square-x-twitter:before{content:"\e61a"}.fa-reacteurope:before{content:"\f75d"}.fa-medium-m:before,.fa-medium:before{content:"\f23a"}.fa-amilia:before{content:"\f36d"}.fa-mixcloud:before{content:"\f289"}.fa-flipboard:before{content:"\f44d"}.fa-viacoin:before{content:"\f237"}.fa-critical-role:before{content:"\f6c9"}.fa-sitrox:before{content:"\e44a"}.fa-discourse:before{content:"\f393"}.fa-joomla:before{content:"\f1aa"}.fa-mastodon:before{content:"\f4f6"}.fa-airbnb:before{content:"\f834"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-buy-n-large:before{content:"\f8a6"}.fa-gulp:before{content:"\f3ae"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-strava:before{content:"\f428"}.fa-ember:before{content:"\f423"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-teamspeak:before{content:"\f4f9"}.fa-pushed:before{content:"\f3e1"}.fa-wordpress-simple:before{content:"\f411"}.fa-nutritionix:before{content:"\f3d6"}.fa-wodu:before{content:"\e088"}.fa-google-pay:before{content:"\e079"}.fa-intercom:before{content:"\f7af"}.fa-zhihu:before{content:"\f63f"}.fa-korvue:before{content:"\f42f"}.fa-pix:before{content:"\e43a"}.fa-steam-symbol:before{content:"\f3f6"} \ No newline at end of file diff --git a/site/css/fontawesome.min.css b/site/css/fontawesome.min.css deleted file mode 100644 index 688dd75..0000000 --- a/site/css/fontawesome.min.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2023 Fonticons, Inc. - */ -.fa{font-family:var(--fa-style-family,"Font Awesome 6 Free");font-weight:var(--fa-style,900)}.fa,.fa-brands,.fa-classic,.fa-regular,.fa-sharp,.fa-solid,.fab,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:var(--fa-display,inline-block);font-style:normal;font-variant:normal;line-height:1;text-rendering:auto}.fa-classic,.fa-regular,.fa-solid,.far,.fas{font-family:"Font Awesome 6 Free"}.fa-brands,.fab{font-family:"Font Awesome 6 Brands"}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-2xs{font-size:.625em;line-height:.1em;vertical-align:.225em}.fa-xs{font-size:.75em;line-height:.08333em;vertical-align:.125em}.fa-sm{font-size:.875em;line-height:.07143em;vertical-align:.05357em}.fa-lg{font-size:1.25em;line-height:.05em;vertical-align:-.075em}.fa-xl{font-size:1.5em;line-height:.04167em;vertical-align:-.125em}.fa-2xl{font-size:2em;line-height:.03125em;vertical-align:-.1875em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:var(--fa-li-margin,2.5em);padding-left:0}.fa-ul>li{position:relative}.fa-li{left:calc(var(--fa-li-width, 2em)*-1);position:absolute;text-align:center;width:var(--fa-li-width,2em);line-height:inherit}.fa-border{border-radius:var(--fa-border-radius,.1em);border:var(--fa-border-width,.08em) var(--fa-border-style,solid) var(--fa-border-color,#eee);padding:var(--fa-border-padding,.2em .25em .15em)}.fa-pull-left{float:left;margin-right:var(--fa-pull-margin,.3em)}.fa-pull-right{float:right;margin-left:var(--fa-pull-margin,.3em)}.fa-beat{-webkit-animation-name:fa-beat;animation-name:fa-beat;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-bounce{-webkit-animation-name:fa-bounce;animation-name:fa-bounce;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.28,.84,.42,1))}.fa-fade{-webkit-animation-name:fa-fade;animation-name:fa-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-beat-fade,.fa-fade{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s)}.fa-beat-fade{-webkit-animation-name:fa-beat-fade;animation-name:fa-beat-fade;-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1));animation-timing-function:var(--fa-animation-timing,cubic-bezier(.4,0,.6,1))}.fa-flip{-webkit-animation-name:fa-flip;animation-name:fa-flip;-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,ease-in-out);animation-timing-function:var(--fa-animation-timing,ease-in-out)}.fa-shake{-webkit-animation-name:fa-shake;animation-name:fa-shake;-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-shake,.fa-spin{-webkit-animation-delay:var(--fa-animation-delay,0s);animation-delay:var(--fa-animation-delay,0s);-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal)}.fa-spin{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-duration:var(--fa-animation-duration,2s);animation-duration:var(--fa-animation-duration,2s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,linear);animation-timing-function:var(--fa-animation-timing,linear)}.fa-spin-reverse{--fa-animation-direction:reverse}.fa-pulse,.fa-spin-pulse{-webkit-animation-name:fa-spin;animation-name:fa-spin;-webkit-animation-direction:var(--fa-animation-direction,normal);animation-direction:var(--fa-animation-direction,normal);-webkit-animation-duration:var(--fa-animation-duration,1s);animation-duration:var(--fa-animation-duration,1s);-webkit-animation-iteration-count:var(--fa-animation-iteration-count,infinite);animation-iteration-count:var(--fa-animation-iteration-count,infinite);-webkit-animation-timing-function:var(--fa-animation-timing,steps(8));animation-timing-function:var(--fa-animation-timing,steps(8))}@media (prefers-reduced-motion:reduce){.fa-beat,.fa-beat-fade,.fa-bounce,.fa-fade,.fa-flip,.fa-pulse,.fa-shake,.fa-spin,.fa-spin-pulse{-webkit-animation-delay:-1ms;animation-delay:-1ms;-webkit-animation-duration:1ms;animation-duration:1ms;-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-transition-delay:0s;transition-delay:0s;-webkit-transition-duration:0s;transition-duration:0s}}@-webkit-keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@keyframes fa-beat{0%,90%{-webkit-transform:scale(1);transform:scale(1)}45%{-webkit-transform:scale(var(--fa-beat-scale,1.25));transform:scale(var(--fa-beat-scale,1.25))}}@-webkit-keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@keyframes fa-bounce{0%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}10%{-webkit-transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0);transform:scale(var(--fa-bounce-start-scale-x,1.1),var(--fa-bounce-start-scale-y,.9)) translateY(0)}30%{-webkit-transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em));transform:scale(var(--fa-bounce-jump-scale-x,.9),var(--fa-bounce-jump-scale-y,1.1)) translateY(var(--fa-bounce-height,-.5em))}50%{-webkit-transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0);transform:scale(var(--fa-bounce-land-scale-x,1.05),var(--fa-bounce-land-scale-y,.95)) translateY(0)}57%{-webkit-transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em));transform:scale(1) translateY(var(--fa-bounce-rebound,-.125em))}64%{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}to{-webkit-transform:scale(1) translateY(0);transform:scale(1) translateY(0)}}@-webkit-keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@keyframes fa-fade{50%{opacity:var(--fa-fade-opacity,.4)}}@-webkit-keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@keyframes fa-beat-fade{0%,to{opacity:var(--fa-beat-fade-opacity,.4);-webkit-transform:scale(1);transform:scale(1)}50%{opacity:1;-webkit-transform:scale(var(--fa-beat-fade-scale,1.125));transform:scale(var(--fa-beat-fade-scale,1.125))}}@-webkit-keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@keyframes fa-flip{50%{-webkit-transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg));transform:rotate3d(var(--fa-flip-x,0),var(--fa-flip-y,1),var(--fa-flip-z,0),var(--fa-flip-angle,-180deg))}}@-webkit-keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes fa-shake{0%{-webkit-transform:rotate(-15deg);transform:rotate(-15deg)}4%{-webkit-transform:rotate(15deg);transform:rotate(15deg)}8%,24%{-webkit-transform:rotate(-18deg);transform:rotate(-18deg)}12%,28%{-webkit-transform:rotate(18deg);transform:rotate(18deg)}16%{-webkit-transform:rotate(-22deg);transform:rotate(-22deg)}20%{-webkit-transform:rotate(22deg);transform:rotate(22deg)}32%{-webkit-transform:rotate(-12deg);transform:rotate(-12deg)}36%{-webkit-transform:rotate(12deg);transform:rotate(12deg)}40%,to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}.fa-rotate-by{-webkit-transform:rotate(var(--fa-rotate-angle,none));transform:rotate(var(--fa-rotate-angle,none))}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%;z-index:var(--fa-stack-z-index,auto)}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:var(--fa-inverse,#fff)} - -.fa-0:before{content:"\30"}.fa-1:before{content:"\31"}.fa-2:before{content:"\32"}.fa-3:before{content:"\33"}.fa-4:before{content:"\34"}.fa-5:before{content:"\35"}.fa-6:before{content:"\36"}.fa-7:before{content:"\37"}.fa-8:before{content:"\38"}.fa-9:before{content:"\39"}.fa-fill-drip:before{content:"\f576"}.fa-arrows-to-circle:before{content:"\e4bd"}.fa-chevron-circle-right:before,.fa-circle-chevron-right:before{content:"\f138"}.fa-at:before{content:"\40"}.fa-trash-alt:before,.fa-trash-can:before{content:"\f2ed"}.fa-text-height:before{content:"\f034"}.fa-user-times:before,.fa-user-xmark:before{content:"\f235"}.fa-stethoscope:before{content:"\f0f1"}.fa-comment-alt:before,.fa-message:before{content:"\f27a"}.fa-info:before{content:"\f129"}.fa-compress-alt:before,.fa-down-left-and-up-right-to-center:before{content:"\f422"}.fa-explosion:before{content:"\e4e9"}.fa-file-alt:before,.fa-file-lines:before,.fa-file-text:before{content:"\f15c"}.fa-wave-square:before{content:"\f83e"}.fa-ring:before{content:"\f70b"}.fa-building-un:before{content:"\e4d9"}.fa-dice-three:before{content:"\f527"}.fa-calendar-alt:before,.fa-calendar-days:before{content:"\f073"}.fa-anchor-circle-check:before{content:"\e4aa"}.fa-building-circle-arrow-right:before{content:"\e4d1"}.fa-volleyball-ball:before,.fa-volleyball:before{content:"\f45f"}.fa-arrows-up-to-line:before{content:"\e4c2"}.fa-sort-desc:before,.fa-sort-down:before{content:"\f0dd"}.fa-circle-minus:before,.fa-minus-circle:before{content:"\f056"}.fa-door-open:before{content:"\f52b"}.fa-right-from-bracket:before,.fa-sign-out-alt:before{content:"\f2f5"}.fa-atom:before{content:"\f5d2"}.fa-soap:before{content:"\e06e"}.fa-heart-music-camera-bolt:before,.fa-icons:before{content:"\f86d"}.fa-microphone-alt-slash:before,.fa-microphone-lines-slash:before{content:"\f539"}.fa-bridge-circle-check:before{content:"\e4c9"}.fa-pump-medical:before{content:"\e06a"}.fa-fingerprint:before{content:"\f577"}.fa-hand-point-right:before{content:"\f0a4"}.fa-magnifying-glass-location:before,.fa-search-location:before{content:"\f689"}.fa-forward-step:before,.fa-step-forward:before{content:"\f051"}.fa-face-smile-beam:before,.fa-smile-beam:before{content:"\f5b8"}.fa-flag-checkered:before{content:"\f11e"}.fa-football-ball:before,.fa-football:before{content:"\f44e"}.fa-school-circle-exclamation:before{content:"\e56c"}.fa-crop:before{content:"\f125"}.fa-angle-double-down:before,.fa-angles-down:before{content:"\f103"}.fa-users-rectangle:before{content:"\e594"}.fa-people-roof:before{content:"\e537"}.fa-people-line:before{content:"\e534"}.fa-beer-mug-empty:before,.fa-beer:before{content:"\f0fc"}.fa-diagram-predecessor:before{content:"\e477"}.fa-arrow-up-long:before,.fa-long-arrow-up:before{content:"\f176"}.fa-burn:before,.fa-fire-flame-simple:before{content:"\f46a"}.fa-male:before,.fa-person:before{content:"\f183"}.fa-laptop:before{content:"\f109"}.fa-file-csv:before{content:"\f6dd"}.fa-menorah:before{content:"\f676"}.fa-truck-plane:before{content:"\e58f"}.fa-record-vinyl:before{content:"\f8d9"}.fa-face-grin-stars:before,.fa-grin-stars:before{content:"\f587"}.fa-bong:before{content:"\f55c"}.fa-pastafarianism:before,.fa-spaghetti-monster-flying:before{content:"\f67b"}.fa-arrow-down-up-across-line:before{content:"\e4af"}.fa-spoon:before,.fa-utensil-spoon:before{content:"\f2e5"}.fa-jar-wheat:before{content:"\e517"}.fa-envelopes-bulk:before,.fa-mail-bulk:before{content:"\f674"}.fa-file-circle-exclamation:before{content:"\e4eb"}.fa-circle-h:before,.fa-hospital-symbol:before{content:"\f47e"}.fa-pager:before{content:"\f815"}.fa-address-book:before,.fa-contact-book:before{content:"\f2b9"}.fa-strikethrough:before{content:"\f0cc"}.fa-k:before{content:"\4b"}.fa-landmark-flag:before{content:"\e51c"}.fa-pencil-alt:before,.fa-pencil:before{content:"\f303"}.fa-backward:before{content:"\f04a"}.fa-caret-right:before{content:"\f0da"}.fa-comments:before{content:"\f086"}.fa-file-clipboard:before,.fa-paste:before{content:"\f0ea"}.fa-code-pull-request:before{content:"\e13c"}.fa-clipboard-list:before{content:"\f46d"}.fa-truck-loading:before,.fa-truck-ramp-box:before{content:"\f4de"}.fa-user-check:before{content:"\f4fc"}.fa-vial-virus:before{content:"\e597"}.fa-sheet-plastic:before{content:"\e571"}.fa-blog:before{content:"\f781"}.fa-user-ninja:before{content:"\f504"}.fa-person-arrow-up-from-line:before{content:"\e539"}.fa-scroll-torah:before,.fa-torah:before{content:"\f6a0"}.fa-broom-ball:before,.fa-quidditch-broom-ball:before,.fa-quidditch:before{content:"\f458"}.fa-toggle-off:before{content:"\f204"}.fa-archive:before,.fa-box-archive:before{content:"\f187"}.fa-person-drowning:before{content:"\e545"}.fa-arrow-down-9-1:before,.fa-sort-numeric-desc:before,.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-face-grin-tongue-squint:before,.fa-grin-tongue-squint:before{content:"\f58a"}.fa-spray-can:before{content:"\f5bd"}.fa-truck-monster:before{content:"\f63b"}.fa-w:before{content:"\57"}.fa-earth-africa:before,.fa-globe-africa:before{content:"\f57c"}.fa-rainbow:before{content:"\f75b"}.fa-circle-notch:before{content:"\f1ce"}.fa-tablet-alt:before,.fa-tablet-screen-button:before{content:"\f3fa"}.fa-paw:before{content:"\f1b0"}.fa-cloud:before{content:"\f0c2"}.fa-trowel-bricks:before{content:"\e58a"}.fa-face-flushed:before,.fa-flushed:before{content:"\f579"}.fa-hospital-user:before{content:"\f80d"}.fa-tent-arrow-left-right:before{content:"\e57f"}.fa-gavel:before,.fa-legal:before{content:"\f0e3"}.fa-binoculars:before{content:"\f1e5"}.fa-microphone-slash:before{content:"\f131"}.fa-box-tissue:before{content:"\e05b"}.fa-motorcycle:before{content:"\f21c"}.fa-bell-concierge:before,.fa-concierge-bell:before{content:"\f562"}.fa-pen-ruler:before,.fa-pencil-ruler:before{content:"\f5ae"}.fa-people-arrows-left-right:before,.fa-people-arrows:before{content:"\e068"}.fa-mars-and-venus-burst:before{content:"\e523"}.fa-caret-square-right:before,.fa-square-caret-right:before{content:"\f152"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-sun-plant-wilt:before{content:"\e57a"}.fa-toilets-portable:before{content:"\e584"}.fa-hockey-puck:before{content:"\f453"}.fa-table:before{content:"\f0ce"}.fa-magnifying-glass-arrow-right:before{content:"\e521"}.fa-digital-tachograph:before,.fa-tachograph-digital:before{content:"\f566"}.fa-users-slash:before{content:"\e073"}.fa-clover:before{content:"\e139"}.fa-mail-reply:before,.fa-reply:before{content:"\f3e5"}.fa-star-and-crescent:before{content:"\f699"}.fa-house-fire:before{content:"\e50c"}.fa-minus-square:before,.fa-square-minus:before{content:"\f146"}.fa-helicopter:before{content:"\f533"}.fa-compass:before{content:"\f14e"}.fa-caret-square-down:before,.fa-square-caret-down:before{content:"\f150"}.fa-file-circle-question:before{content:"\e4ef"}.fa-laptop-code:before{content:"\f5fc"}.fa-swatchbook:before{content:"\f5c3"}.fa-prescription-bottle:before{content:"\f485"}.fa-bars:before,.fa-navicon:before{content:"\f0c9"}.fa-people-group:before{content:"\e533"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-heart-broken:before,.fa-heart-crack:before{content:"\f7a9"}.fa-external-link-square-alt:before,.fa-square-up-right:before{content:"\f360"}.fa-face-kiss-beam:before,.fa-kiss-beam:before{content:"\f597"}.fa-film:before{content:"\f008"}.fa-ruler-horizontal:before{content:"\f547"}.fa-people-robbery:before{content:"\e536"}.fa-lightbulb:before{content:"\f0eb"}.fa-caret-left:before{content:"\f0d9"}.fa-circle-exclamation:before,.fa-exclamation-circle:before{content:"\f06a"}.fa-school-circle-xmark:before{content:"\e56d"}.fa-arrow-right-from-bracket:before,.fa-sign-out:before{content:"\f08b"}.fa-chevron-circle-down:before,.fa-circle-chevron-down:before{content:"\f13a"}.fa-unlock-alt:before,.fa-unlock-keyhole:before{content:"\f13e"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-headphones-alt:before,.fa-headphones-simple:before{content:"\f58f"}.fa-sitemap:before{content:"\f0e8"}.fa-circle-dollar-to-slot:before,.fa-donate:before{content:"\f4b9"}.fa-memory:before{content:"\f538"}.fa-road-spikes:before{content:"\e568"}.fa-fire-burner:before{content:"\e4f1"}.fa-flag:before{content:"\f024"}.fa-hanukiah:before{content:"\f6e6"}.fa-feather:before{content:"\f52d"}.fa-volume-down:before,.fa-volume-low:before{content:"\f027"}.fa-comment-slash:before{content:"\f4b3"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-compress:before{content:"\f066"}.fa-wheat-alt:before,.fa-wheat-awn:before{content:"\e2cd"}.fa-ankh:before{content:"\f644"}.fa-hands-holding-child:before{content:"\e4fa"}.fa-asterisk:before{content:"\2a"}.fa-check-square:before,.fa-square-check:before{content:"\f14a"}.fa-peseta-sign:before{content:"\e221"}.fa-header:before,.fa-heading:before{content:"\f1dc"}.fa-ghost:before{content:"\f6e2"}.fa-list-squares:before,.fa-list:before{content:"\f03a"}.fa-phone-square-alt:before,.fa-square-phone-flip:before{content:"\f87b"}.fa-cart-plus:before{content:"\f217"}.fa-gamepad:before{content:"\f11b"}.fa-circle-dot:before,.fa-dot-circle:before{content:"\f192"}.fa-dizzy:before,.fa-face-dizzy:before{content:"\f567"}.fa-egg:before{content:"\f7fb"}.fa-house-medical-circle-xmark:before{content:"\e513"}.fa-campground:before{content:"\f6bb"}.fa-folder-plus:before{content:"\f65e"}.fa-futbol-ball:before,.fa-futbol:before,.fa-soccer-ball:before{content:"\f1e3"}.fa-paint-brush:before,.fa-paintbrush:before{content:"\f1fc"}.fa-lock:before{content:"\f023"}.fa-gas-pump:before{content:"\f52f"}.fa-hot-tub-person:before,.fa-hot-tub:before{content:"\f593"}.fa-map-location:before,.fa-map-marked:before{content:"\f59f"}.fa-house-flood-water:before{content:"\e50e"}.fa-tree:before{content:"\f1bb"}.fa-bridge-lock:before{content:"\e4cc"}.fa-sack-dollar:before{content:"\f81d"}.fa-edit:before,.fa-pen-to-square:before{content:"\f044"}.fa-car-side:before{content:"\f5e4"}.fa-share-alt:before,.fa-share-nodes:before{content:"\f1e0"}.fa-heart-circle-minus:before{content:"\e4ff"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-microscope:before{content:"\f610"}.fa-sink:before{content:"\e06d"}.fa-bag-shopping:before,.fa-shopping-bag:before{content:"\f290"}.fa-arrow-down-z-a:before,.fa-sort-alpha-desc:before,.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-mitten:before{content:"\f7b5"}.fa-person-rays:before{content:"\e54d"}.fa-users:before{content:"\f0c0"}.fa-eye-slash:before{content:"\f070"}.fa-flask-vial:before{content:"\e4f3"}.fa-hand-paper:before,.fa-hand:before{content:"\f256"}.fa-om:before{content:"\f679"}.fa-worm:before{content:"\e599"}.fa-house-circle-xmark:before{content:"\e50b"}.fa-plug:before{content:"\f1e6"}.fa-chevron-up:before{content:"\f077"}.fa-hand-spock:before{content:"\f259"}.fa-stopwatch:before{content:"\f2f2"}.fa-face-kiss:before,.fa-kiss:before{content:"\f596"}.fa-bridge-circle-xmark:before{content:"\e4cb"}.fa-face-grin-tongue:before,.fa-grin-tongue:before{content:"\f589"}.fa-chess-bishop:before{content:"\f43a"}.fa-face-grin-wink:before,.fa-grin-wink:before{content:"\f58c"}.fa-deaf:before,.fa-deafness:before,.fa-ear-deaf:before,.fa-hard-of-hearing:before{content:"\f2a4"}.fa-road-circle-check:before{content:"\e564"}.fa-dice-five:before{content:"\f523"}.fa-rss-square:before,.fa-square-rss:before{content:"\f143"}.fa-land-mine-on:before{content:"\e51b"}.fa-i-cursor:before{content:"\f246"}.fa-stamp:before{content:"\f5bf"}.fa-stairs:before{content:"\e289"}.fa-i:before{content:"\49"}.fa-hryvnia-sign:before,.fa-hryvnia:before{content:"\f6f2"}.fa-pills:before{content:"\f484"}.fa-face-grin-wide:before,.fa-grin-alt:before{content:"\f581"}.fa-tooth:before{content:"\f5c9"}.fa-v:before{content:"\56"}.fa-bangladeshi-taka-sign:before{content:"\e2e6"}.fa-bicycle:before{content:"\f206"}.fa-rod-asclepius:before,.fa-rod-snake:before,.fa-staff-aesculapius:before,.fa-staff-snake:before{content:"\e579"}.fa-head-side-cough-slash:before{content:"\e062"}.fa-ambulance:before,.fa-truck-medical:before{content:"\f0f9"}.fa-wheat-awn-circle-exclamation:before{content:"\e598"}.fa-snowman:before{content:"\f7d0"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-road-barrier:before{content:"\e562"}.fa-school:before{content:"\f549"}.fa-igloo:before{content:"\f7ae"}.fa-joint:before{content:"\f595"}.fa-angle-right:before{content:"\f105"}.fa-horse:before{content:"\f6f0"}.fa-q:before{content:"\51"}.fa-g:before{content:"\47"}.fa-notes-medical:before{content:"\f481"}.fa-temperature-2:before,.fa-temperature-half:before,.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-dong-sign:before{content:"\e169"}.fa-capsules:before{content:"\f46b"}.fa-poo-bolt:before,.fa-poo-storm:before{content:"\f75a"}.fa-face-frown-open:before,.fa-frown-open:before{content:"\f57a"}.fa-hand-point-up:before{content:"\f0a6"}.fa-money-bill:before{content:"\f0d6"}.fa-bookmark:before{content:"\f02e"}.fa-align-justify:before{content:"\f039"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-helmet-un:before{content:"\e503"}.fa-bullseye:before{content:"\f140"}.fa-bacon:before{content:"\f7e5"}.fa-hand-point-down:before{content:"\f0a7"}.fa-arrow-up-from-bracket:before{content:"\e09a"}.fa-folder-blank:before,.fa-folder:before{content:"\f07b"}.fa-file-medical-alt:before,.fa-file-waveform:before{content:"\f478"}.fa-radiation:before{content:"\f7b9"}.fa-chart-simple:before{content:"\e473"}.fa-mars-stroke:before{content:"\f229"}.fa-vial:before{content:"\f492"}.fa-dashboard:before,.fa-gauge-med:before,.fa-gauge:before,.fa-tachometer-alt-average:before{content:"\f624"}.fa-magic-wand-sparkles:before,.fa-wand-magic-sparkles:before{content:"\e2ca"}.fa-e:before{content:"\45"}.fa-pen-alt:before,.fa-pen-clip:before{content:"\f305"}.fa-bridge-circle-exclamation:before{content:"\e4ca"}.fa-user:before{content:"\f007"}.fa-school-circle-check:before{content:"\e56b"}.fa-dumpster:before{content:"\f793"}.fa-shuttle-van:before,.fa-van-shuttle:before{content:"\f5b6"}.fa-building-user:before{content:"\e4da"}.fa-caret-square-left:before,.fa-square-caret-left:before{content:"\f191"}.fa-highlighter:before{content:"\f591"}.fa-key:before{content:"\f084"}.fa-bullhorn:before{content:"\f0a1"}.fa-globe:before{content:"\f0ac"}.fa-synagogue:before{content:"\f69b"}.fa-person-half-dress:before{content:"\e548"}.fa-road-bridge:before{content:"\e563"}.fa-location-arrow:before{content:"\f124"}.fa-c:before{content:"\43"}.fa-tablet-button:before{content:"\f10a"}.fa-building-lock:before{content:"\e4d6"}.fa-pizza-slice:before{content:"\f818"}.fa-money-bill-wave:before{content:"\f53a"}.fa-area-chart:before,.fa-chart-area:before{content:"\f1fe"}.fa-house-flag:before{content:"\e50d"}.fa-person-circle-minus:before{content:"\e540"}.fa-ban:before,.fa-cancel:before{content:"\f05e"}.fa-camera-rotate:before{content:"\e0d8"}.fa-air-freshener:before,.fa-spray-can-sparkles:before{content:"\f5d0"}.fa-star:before{content:"\f005"}.fa-repeat:before{content:"\f363"}.fa-cross:before{content:"\f654"}.fa-box:before{content:"\f466"}.fa-venus-mars:before{content:"\f228"}.fa-arrow-pointer:before,.fa-mouse-pointer:before{content:"\f245"}.fa-expand-arrows-alt:before,.fa-maximize:before{content:"\f31e"}.fa-charging-station:before{content:"\f5e7"}.fa-shapes:before,.fa-triangle-circle-square:before{content:"\f61f"}.fa-random:before,.fa-shuffle:before{content:"\f074"}.fa-person-running:before,.fa-running:before{content:"\f70c"}.fa-mobile-retro:before{content:"\e527"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-spider:before{content:"\f717"}.fa-hands-bound:before{content:"\e4f9"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-plane-circle-exclamation:before{content:"\e556"}.fa-x-ray:before{content:"\f497"}.fa-spell-check:before{content:"\f891"}.fa-slash:before{content:"\f715"}.fa-computer-mouse:before,.fa-mouse:before{content:"\f8cc"}.fa-arrow-right-to-bracket:before,.fa-sign-in:before{content:"\f090"}.fa-shop-slash:before,.fa-store-alt-slash:before{content:"\e070"}.fa-server:before{content:"\f233"}.fa-virus-covid-slash:before{content:"\e4a9"}.fa-shop-lock:before{content:"\e4a5"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-blender-phone:before{content:"\f6b6"}.fa-building-wheat:before{content:"\e4db"}.fa-person-breastfeeding:before{content:"\e53a"}.fa-right-to-bracket:before,.fa-sign-in-alt:before{content:"\f2f6"}.fa-venus:before{content:"\f221"}.fa-passport:before{content:"\f5ab"}.fa-heart-pulse:before,.fa-heartbeat:before{content:"\f21e"}.fa-people-carry-box:before,.fa-people-carry:before{content:"\f4ce"}.fa-temperature-high:before{content:"\f769"}.fa-microchip:before{content:"\f2db"}.fa-crown:before{content:"\f521"}.fa-weight-hanging:before{content:"\f5cd"}.fa-xmarks-lines:before{content:"\e59a"}.fa-file-prescription:before{content:"\f572"}.fa-weight-scale:before,.fa-weight:before{content:"\f496"}.fa-user-friends:before,.fa-user-group:before{content:"\f500"}.fa-arrow-up-a-z:before,.fa-sort-alpha-up:before{content:"\f15e"}.fa-chess-knight:before{content:"\f441"}.fa-face-laugh-squint:before,.fa-laugh-squint:before{content:"\f59b"}.fa-wheelchair:before{content:"\f193"}.fa-arrow-circle-up:before,.fa-circle-arrow-up:before{content:"\f0aa"}.fa-toggle-on:before{content:"\f205"}.fa-person-walking:before,.fa-walking:before{content:"\f554"}.fa-l:before{content:"\4c"}.fa-fire:before{content:"\f06d"}.fa-bed-pulse:before,.fa-procedures:before{content:"\f487"}.fa-shuttle-space:before,.fa-space-shuttle:before{content:"\f197"}.fa-face-laugh:before,.fa-laugh:before{content:"\f599"}.fa-folder-open:before{content:"\f07c"}.fa-heart-circle-plus:before{content:"\e500"}.fa-code-fork:before{content:"\e13b"}.fa-city:before{content:"\f64f"}.fa-microphone-alt:before,.fa-microphone-lines:before{content:"\f3c9"}.fa-pepper-hot:before{content:"\f816"}.fa-unlock:before{content:"\f09c"}.fa-colon-sign:before{content:"\e140"}.fa-headset:before{content:"\f590"}.fa-store-slash:before{content:"\e071"}.fa-road-circle-xmark:before{content:"\e566"}.fa-user-minus:before{content:"\f503"}.fa-mars-stroke-up:before,.fa-mars-stroke-v:before{content:"\f22a"}.fa-champagne-glasses:before,.fa-glass-cheers:before{content:"\f79f"}.fa-clipboard:before{content:"\f328"}.fa-house-circle-exclamation:before{content:"\e50a"}.fa-file-arrow-up:before,.fa-file-upload:before{content:"\f574"}.fa-wifi-3:before,.fa-wifi-strong:before,.fa-wifi:before{content:"\f1eb"}.fa-bath:before,.fa-bathtub:before{content:"\f2cd"}.fa-underline:before{content:"\f0cd"}.fa-user-edit:before,.fa-user-pen:before{content:"\f4ff"}.fa-signature:before{content:"\f5b7"}.fa-stroopwafel:before{content:"\f551"}.fa-bold:before{content:"\f032"}.fa-anchor-lock:before{content:"\e4ad"}.fa-building-ngo:before{content:"\e4d7"}.fa-manat-sign:before{content:"\e1d5"}.fa-not-equal:before{content:"\f53e"}.fa-border-style:before,.fa-border-top-left:before{content:"\f853"}.fa-map-location-dot:before,.fa-map-marked-alt:before{content:"\f5a0"}.fa-jedi:before{content:"\f669"}.fa-poll:before,.fa-square-poll-vertical:before{content:"\f681"}.fa-mug-hot:before{content:"\f7b6"}.fa-battery-car:before,.fa-car-battery:before{content:"\f5df"}.fa-gift:before{content:"\f06b"}.fa-dice-two:before{content:"\f528"}.fa-chess-queen:before{content:"\f445"}.fa-glasses:before{content:"\f530"}.fa-chess-board:before{content:"\f43c"}.fa-building-circle-check:before{content:"\e4d2"}.fa-person-chalkboard:before{content:"\e53d"}.fa-mars-stroke-h:before,.fa-mars-stroke-right:before{content:"\f22b"}.fa-hand-back-fist:before,.fa-hand-rock:before{content:"\f255"}.fa-caret-square-up:before,.fa-square-caret-up:before{content:"\f151"}.fa-cloud-showers-water:before{content:"\e4e4"}.fa-bar-chart:before,.fa-chart-bar:before{content:"\f080"}.fa-hands-bubbles:before,.fa-hands-wash:before{content:"\e05e"}.fa-less-than-equal:before{content:"\f537"}.fa-train:before{content:"\f238"}.fa-eye-low-vision:before,.fa-low-vision:before{content:"\f2a8"}.fa-crow:before{content:"\f520"}.fa-sailboat:before{content:"\e445"}.fa-window-restore:before{content:"\f2d2"}.fa-plus-square:before,.fa-square-plus:before{content:"\f0fe"}.fa-torii-gate:before{content:"\f6a1"}.fa-frog:before{content:"\f52e"}.fa-bucket:before{content:"\e4cf"}.fa-image:before{content:"\f03e"}.fa-microphone:before{content:"\f130"}.fa-cow:before{content:"\f6c8"}.fa-caret-up:before{content:"\f0d8"}.fa-screwdriver:before{content:"\f54a"}.fa-folder-closed:before{content:"\e185"}.fa-house-tsunami:before{content:"\e515"}.fa-square-nfi:before{content:"\e576"}.fa-arrow-up-from-ground-water:before{content:"\e4b5"}.fa-glass-martini-alt:before,.fa-martini-glass:before{content:"\f57b"}.fa-rotate-back:before,.fa-rotate-backward:before,.fa-rotate-left:before,.fa-undo-alt:before{content:"\f2ea"}.fa-columns:before,.fa-table-columns:before{content:"\f0db"}.fa-lemon:before{content:"\f094"}.fa-head-side-mask:before{content:"\e063"}.fa-handshake:before{content:"\f2b5"}.fa-gem:before{content:"\f3a5"}.fa-dolly-box:before,.fa-dolly:before{content:"\f472"}.fa-smoking:before{content:"\f48d"}.fa-compress-arrows-alt:before,.fa-minimize:before{content:"\f78c"}.fa-monument:before{content:"\f5a6"}.fa-snowplow:before{content:"\f7d2"}.fa-angle-double-right:before,.fa-angles-right:before{content:"\f101"}.fa-cannabis:before{content:"\f55f"}.fa-circle-play:before,.fa-play-circle:before{content:"\f144"}.fa-tablets:before{content:"\f490"}.fa-ethernet:before{content:"\f796"}.fa-eur:before,.fa-euro-sign:before,.fa-euro:before{content:"\f153"}.fa-chair:before{content:"\f6c0"}.fa-check-circle:before,.fa-circle-check:before{content:"\f058"}.fa-circle-stop:before,.fa-stop-circle:before{content:"\f28d"}.fa-compass-drafting:before,.fa-drafting-compass:before{content:"\f568"}.fa-plate-wheat:before{content:"\e55a"}.fa-icicles:before{content:"\f7ad"}.fa-person-shelter:before{content:"\e54f"}.fa-neuter:before{content:"\f22c"}.fa-id-badge:before{content:"\f2c1"}.fa-marker:before{content:"\f5a1"}.fa-face-laugh-beam:before,.fa-laugh-beam:before{content:"\f59a"}.fa-helicopter-symbol:before{content:"\e502"}.fa-universal-access:before{content:"\f29a"}.fa-chevron-circle-up:before,.fa-circle-chevron-up:before{content:"\f139"}.fa-lari-sign:before{content:"\e1c8"}.fa-volcano:before{content:"\f770"}.fa-person-walking-dashed-line-arrow-right:before{content:"\e553"}.fa-gbp:before,.fa-pound-sign:before,.fa-sterling-sign:before{content:"\f154"}.fa-viruses:before{content:"\e076"}.fa-square-person-confined:before{content:"\e577"}.fa-user-tie:before{content:"\f508"}.fa-arrow-down-long:before,.fa-long-arrow-down:before{content:"\f175"}.fa-tent-arrow-down-to-line:before{content:"\e57e"}.fa-certificate:before{content:"\f0a3"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-suitcase:before{content:"\f0f2"}.fa-person-skating:before,.fa-skating:before{content:"\f7c5"}.fa-filter-circle-dollar:before,.fa-funnel-dollar:before{content:"\f662"}.fa-camera-retro:before{content:"\f083"}.fa-arrow-circle-down:before,.fa-circle-arrow-down:before{content:"\f0ab"}.fa-arrow-right-to-file:before,.fa-file-import:before{content:"\f56f"}.fa-external-link-square:before,.fa-square-arrow-up-right:before{content:"\f14c"}.fa-box-open:before{content:"\f49e"}.fa-scroll:before{content:"\f70e"}.fa-spa:before{content:"\f5bb"}.fa-location-pin-lock:before{content:"\e51f"}.fa-pause:before{content:"\f04c"}.fa-hill-avalanche:before{content:"\e507"}.fa-temperature-0:before,.fa-temperature-empty:before,.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-bomb:before{content:"\f1e2"}.fa-registered:before{content:"\f25d"}.fa-address-card:before,.fa-contact-card:before,.fa-vcard:before{content:"\f2bb"}.fa-balance-scale-right:before,.fa-scale-unbalanced-flip:before{content:"\f516"}.fa-subscript:before{content:"\f12c"}.fa-diamond-turn-right:before,.fa-directions:before{content:"\f5eb"}.fa-burst:before{content:"\e4dc"}.fa-house-laptop:before,.fa-laptop-house:before{content:"\e066"}.fa-face-tired:before,.fa-tired:before{content:"\f5c8"}.fa-money-bills:before{content:"\e1f3"}.fa-smog:before{content:"\f75f"}.fa-crutch:before{content:"\f7f7"}.fa-cloud-arrow-up:before,.fa-cloud-upload-alt:before,.fa-cloud-upload:before{content:"\f0ee"}.fa-palette:before{content:"\f53f"}.fa-arrows-turn-right:before{content:"\e4c0"}.fa-vest:before{content:"\e085"}.fa-ferry:before{content:"\e4ea"}.fa-arrows-down-to-people:before{content:"\e4b9"}.fa-seedling:before,.fa-sprout:before{content:"\f4d8"}.fa-arrows-alt-h:before,.fa-left-right:before{content:"\f337"}.fa-boxes-packing:before{content:"\e4c7"}.fa-arrow-circle-left:before,.fa-circle-arrow-left:before{content:"\f0a8"}.fa-group-arrows-rotate:before{content:"\e4f6"}.fa-bowl-food:before{content:"\e4c6"}.fa-candy-cane:before{content:"\f786"}.fa-arrow-down-wide-short:before,.fa-sort-amount-asc:before,.fa-sort-amount-down:before{content:"\f160"}.fa-cloud-bolt:before,.fa-thunderstorm:before{content:"\f76c"}.fa-remove-format:before,.fa-text-slash:before{content:"\f87d"}.fa-face-smile-wink:before,.fa-smile-wink:before{content:"\f4da"}.fa-file-word:before{content:"\f1c2"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-arrows-h:before,.fa-arrows-left-right:before{content:"\f07e"}.fa-house-lock:before{content:"\e510"}.fa-cloud-arrow-down:before,.fa-cloud-download-alt:before,.fa-cloud-download:before{content:"\f0ed"}.fa-children:before{content:"\e4e1"}.fa-blackboard:before,.fa-chalkboard:before{content:"\f51b"}.fa-user-alt-slash:before,.fa-user-large-slash:before{content:"\f4fa"}.fa-envelope-open:before{content:"\f2b6"}.fa-handshake-alt-slash:before,.fa-handshake-simple-slash:before{content:"\e05f"}.fa-mattress-pillow:before{content:"\e525"}.fa-guarani-sign:before{content:"\e19a"}.fa-arrows-rotate:before,.fa-refresh:before,.fa-sync:before{content:"\f021"}.fa-fire-extinguisher:before{content:"\f134"}.fa-cruzeiro-sign:before{content:"\e152"}.fa-greater-than-equal:before{content:"\f532"}.fa-shield-alt:before,.fa-shield-halved:before{content:"\f3ed"}.fa-atlas:before,.fa-book-atlas:before{content:"\f558"}.fa-virus:before{content:"\e074"}.fa-envelope-circle-check:before{content:"\e4e8"}.fa-layer-group:before{content:"\f5fd"}.fa-arrows-to-dot:before{content:"\e4be"}.fa-archway:before{content:"\f557"}.fa-heart-circle-check:before{content:"\e4fd"}.fa-house-chimney-crack:before,.fa-house-damage:before{content:"\f6f1"}.fa-file-archive:before,.fa-file-zipper:before{content:"\f1c6"}.fa-square:before{content:"\f0c8"}.fa-glass-martini:before,.fa-martini-glass-empty:before{content:"\f000"}.fa-couch:before{content:"\f4b8"}.fa-cedi-sign:before{content:"\e0df"}.fa-italic:before{content:"\f033"}.fa-church:before{content:"\f51d"}.fa-comments-dollar:before{content:"\f653"}.fa-democrat:before{content:"\f747"}.fa-z:before{content:"\5a"}.fa-person-skiing:before,.fa-skiing:before{content:"\f7c9"}.fa-road-lock:before{content:"\e567"}.fa-a:before{content:"\41"}.fa-temperature-arrow-down:before,.fa-temperature-down:before{content:"\e03f"}.fa-feather-alt:before,.fa-feather-pointed:before{content:"\f56b"}.fa-p:before{content:"\50"}.fa-snowflake:before{content:"\f2dc"}.fa-newspaper:before{content:"\f1ea"}.fa-ad:before,.fa-rectangle-ad:before{content:"\f641"}.fa-arrow-circle-right:before,.fa-circle-arrow-right:before{content:"\f0a9"}.fa-filter-circle-xmark:before{content:"\e17b"}.fa-locust:before{content:"\e520"}.fa-sort:before,.fa-unsorted:before{content:"\f0dc"}.fa-list-1-2:before,.fa-list-numeric:before,.fa-list-ol:before{content:"\f0cb"}.fa-person-dress-burst:before{content:"\e544"}.fa-money-check-alt:before,.fa-money-check-dollar:before{content:"\f53d"}.fa-vector-square:before{content:"\f5cb"}.fa-bread-slice:before{content:"\f7ec"}.fa-language:before{content:"\f1ab"}.fa-face-kiss-wink-heart:before,.fa-kiss-wink-heart:before{content:"\f598"}.fa-filter:before{content:"\f0b0"}.fa-question:before{content:"\3f"}.fa-file-signature:before{content:"\f573"}.fa-arrows-alt:before,.fa-up-down-left-right:before{content:"\f0b2"}.fa-house-chimney-user:before{content:"\e065"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-puzzle-piece:before{content:"\f12e"}.fa-money-check:before{content:"\f53c"}.fa-star-half-alt:before,.fa-star-half-stroke:before{content:"\f5c0"}.fa-code:before{content:"\f121"}.fa-glass-whiskey:before,.fa-whiskey-glass:before{content:"\f7a0"}.fa-building-circle-exclamation:before{content:"\e4d3"}.fa-magnifying-glass-chart:before{content:"\e522"}.fa-arrow-up-right-from-square:before,.fa-external-link:before{content:"\f08e"}.fa-cubes-stacked:before{content:"\e4e6"}.fa-krw:before,.fa-won-sign:before,.fa-won:before{content:"\f159"}.fa-virus-covid:before{content:"\e4a8"}.fa-austral-sign:before{content:"\e0a9"}.fa-f:before{content:"\46"}.fa-leaf:before{content:"\f06c"}.fa-road:before{content:"\f018"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-person-circle-plus:before{content:"\e541"}.fa-chart-pie:before,.fa-pie-chart:before{content:"\f200"}.fa-bolt-lightning:before{content:"\e0b7"}.fa-sack-xmark:before{content:"\e56a"}.fa-file-excel:before{content:"\f1c3"}.fa-file-contract:before{content:"\f56c"}.fa-fish-fins:before{content:"\e4f2"}.fa-building-flag:before{content:"\e4d5"}.fa-face-grin-beam:before,.fa-grin-beam:before{content:"\f582"}.fa-object-ungroup:before{content:"\f248"}.fa-poop:before{content:"\f619"}.fa-location-pin:before,.fa-map-marker:before{content:"\f041"}.fa-kaaba:before{content:"\f66b"}.fa-toilet-paper:before{content:"\f71e"}.fa-hard-hat:before,.fa-hat-hard:before,.fa-helmet-safety:before{content:"\f807"}.fa-eject:before{content:"\f052"}.fa-arrow-alt-circle-right:before,.fa-circle-right:before{content:"\f35a"}.fa-plane-circle-check:before{content:"\e555"}.fa-face-rolling-eyes:before,.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-object-group:before{content:"\f247"}.fa-chart-line:before,.fa-line-chart:before{content:"\f201"}.fa-mask-ventilator:before{content:"\e524"}.fa-arrow-right:before{content:"\f061"}.fa-map-signs:before,.fa-signs-post:before{content:"\f277"}.fa-cash-register:before{content:"\f788"}.fa-person-circle-question:before{content:"\e542"}.fa-h:before{content:"\48"}.fa-tarp:before{content:"\e57b"}.fa-screwdriver-wrench:before,.fa-tools:before{content:"\f7d9"}.fa-arrows-to-eye:before{content:"\e4bf"}.fa-plug-circle-bolt:before{content:"\e55b"}.fa-heart:before{content:"\f004"}.fa-mars-and-venus:before{content:"\f224"}.fa-home-user:before,.fa-house-user:before{content:"\e1b0"}.fa-dumpster-fire:before{content:"\f794"}.fa-house-crack:before{content:"\e3b1"}.fa-cocktail:before,.fa-martini-glass-citrus:before{content:"\f561"}.fa-face-surprise:before,.fa-surprise:before{content:"\f5c2"}.fa-bottle-water:before{content:"\e4c5"}.fa-circle-pause:before,.fa-pause-circle:before{content:"\f28b"}.fa-toilet-paper-slash:before{content:"\e072"}.fa-apple-alt:before,.fa-apple-whole:before{content:"\f5d1"}.fa-kitchen-set:before{content:"\e51a"}.fa-r:before{content:"\52"}.fa-temperature-1:before,.fa-temperature-quarter:before,.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-cube:before{content:"\f1b2"}.fa-bitcoin-sign:before{content:"\e0b4"}.fa-shield-dog:before{content:"\e573"}.fa-solar-panel:before{content:"\f5ba"}.fa-lock-open:before{content:"\f3c1"}.fa-elevator:before{content:"\e16d"}.fa-money-bill-transfer:before{content:"\e528"}.fa-money-bill-trend-up:before{content:"\e529"}.fa-house-flood-water-circle-arrow-right:before{content:"\e50f"}.fa-poll-h:before,.fa-square-poll-horizontal:before{content:"\f682"}.fa-circle:before{content:"\f111"}.fa-backward-fast:before,.fa-fast-backward:before{content:"\f049"}.fa-recycle:before{content:"\f1b8"}.fa-user-astronaut:before{content:"\f4fb"}.fa-plane-slash:before{content:"\e069"}.fa-trademark:before{content:"\f25c"}.fa-basketball-ball:before,.fa-basketball:before{content:"\f434"}.fa-satellite-dish:before{content:"\f7c0"}.fa-arrow-alt-circle-up:before,.fa-circle-up:before{content:"\f35b"}.fa-mobile-alt:before,.fa-mobile-screen-button:before{content:"\f3cd"}.fa-volume-high:before,.fa-volume-up:before{content:"\f028"}.fa-users-rays:before{content:"\e593"}.fa-wallet:before{content:"\f555"}.fa-clipboard-check:before{content:"\f46c"}.fa-file-audio:before{content:"\f1c7"}.fa-burger:before,.fa-hamburger:before{content:"\f805"}.fa-wrench:before{content:"\f0ad"}.fa-bugs:before{content:"\e4d0"}.fa-rupee-sign:before,.fa-rupee:before{content:"\f156"}.fa-file-image:before{content:"\f1c5"}.fa-circle-question:before,.fa-question-circle:before{content:"\f059"}.fa-plane-departure:before{content:"\f5b0"}.fa-handshake-slash:before{content:"\e060"}.fa-book-bookmark:before{content:"\e0bb"}.fa-code-branch:before{content:"\f126"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-bridge:before{content:"\e4c8"}.fa-phone-alt:before,.fa-phone-flip:before{content:"\f879"}.fa-truck-front:before{content:"\e2b7"}.fa-cat:before{content:"\f6be"}.fa-anchor-circle-exclamation:before{content:"\e4ab"}.fa-truck-field:before{content:"\e58d"}.fa-route:before{content:"\f4d7"}.fa-clipboard-question:before{content:"\e4e3"}.fa-panorama:before{content:"\e209"}.fa-comment-medical:before{content:"\f7f5"}.fa-teeth-open:before{content:"\f62f"}.fa-file-circle-minus:before{content:"\e4ed"}.fa-tags:before{content:"\f02c"}.fa-wine-glass:before{content:"\f4e3"}.fa-fast-forward:before,.fa-forward-fast:before{content:"\f050"}.fa-face-meh-blank:before,.fa-meh-blank:before{content:"\f5a4"}.fa-parking:before,.fa-square-parking:before{content:"\f540"}.fa-house-signal:before{content:"\e012"}.fa-bars-progress:before,.fa-tasks-alt:before{content:"\f828"}.fa-faucet-drip:before{content:"\e006"}.fa-cart-flatbed:before,.fa-dolly-flatbed:before{content:"\f474"}.fa-ban-smoking:before,.fa-smoking-ban:before{content:"\f54d"}.fa-terminal:before{content:"\f120"}.fa-mobile-button:before{content:"\f10b"}.fa-house-medical-flag:before{content:"\e514"}.fa-basket-shopping:before,.fa-shopping-basket:before{content:"\f291"}.fa-tape:before{content:"\f4db"}.fa-bus-alt:before,.fa-bus-simple:before{content:"\f55e"}.fa-eye:before{content:"\f06e"}.fa-face-sad-cry:before,.fa-sad-cry:before{content:"\f5b3"}.fa-audio-description:before{content:"\f29e"}.fa-person-military-to-person:before{content:"\e54c"}.fa-file-shield:before{content:"\e4f0"}.fa-user-slash:before{content:"\f506"}.fa-pen:before{content:"\f304"}.fa-tower-observation:before{content:"\e586"}.fa-file-code:before{content:"\f1c9"}.fa-signal-5:before,.fa-signal-perfect:before,.fa-signal:before{content:"\f012"}.fa-bus:before{content:"\f207"}.fa-heart-circle-xmark:before{content:"\e501"}.fa-home-lg:before,.fa-house-chimney:before{content:"\e3af"}.fa-window-maximize:before{content:"\f2d0"}.fa-face-frown:before,.fa-frown:before{content:"\f119"}.fa-prescription:before{content:"\f5b1"}.fa-shop:before,.fa-store-alt:before{content:"\f54f"}.fa-floppy-disk:before,.fa-save:before{content:"\f0c7"}.fa-vihara:before{content:"\f6a7"}.fa-balance-scale-left:before,.fa-scale-unbalanced:before{content:"\f515"}.fa-sort-asc:before,.fa-sort-up:before{content:"\f0de"}.fa-comment-dots:before,.fa-commenting:before{content:"\f4ad"}.fa-plant-wilt:before{content:"\e5aa"}.fa-diamond:before{content:"\f219"}.fa-face-grin-squint:before,.fa-grin-squint:before{content:"\f585"}.fa-hand-holding-dollar:before,.fa-hand-holding-usd:before{content:"\f4c0"}.fa-bacterium:before{content:"\e05a"}.fa-hand-pointer:before{content:"\f25a"}.fa-drum-steelpan:before{content:"\f56a"}.fa-hand-scissors:before{content:"\f257"}.fa-hands-praying:before,.fa-praying-hands:before{content:"\f684"}.fa-arrow-right-rotate:before,.fa-arrow-rotate-forward:before,.fa-arrow-rotate-right:before,.fa-redo:before{content:"\f01e"}.fa-biohazard:before{content:"\f780"}.fa-location-crosshairs:before,.fa-location:before{content:"\f601"}.fa-mars-double:before{content:"\f227"}.fa-child-dress:before{content:"\e59c"}.fa-users-between-lines:before{content:"\e591"}.fa-lungs-virus:before{content:"\e067"}.fa-face-grin-tears:before,.fa-grin-tears:before{content:"\f588"}.fa-phone:before{content:"\f095"}.fa-calendar-times:before,.fa-calendar-xmark:before{content:"\f273"}.fa-child-reaching:before{content:"\e59d"}.fa-head-side-virus:before{content:"\e064"}.fa-user-cog:before,.fa-user-gear:before{content:"\f4fe"}.fa-arrow-up-1-9:before,.fa-sort-numeric-up:before{content:"\f163"}.fa-door-closed:before{content:"\f52a"}.fa-shield-virus:before{content:"\e06c"}.fa-dice-six:before{content:"\f526"}.fa-mosquito-net:before{content:"\e52c"}.fa-bridge-water:before{content:"\e4ce"}.fa-person-booth:before{content:"\f756"}.fa-text-width:before{content:"\f035"}.fa-hat-wizard:before{content:"\f6e8"}.fa-pen-fancy:before{content:"\f5ac"}.fa-digging:before,.fa-person-digging:before{content:"\f85e"}.fa-trash:before{content:"\f1f8"}.fa-gauge-simple-med:before,.fa-gauge-simple:before,.fa-tachometer-average:before{content:"\f629"}.fa-book-medical:before{content:"\f7e6"}.fa-poo:before{content:"\f2fe"}.fa-quote-right-alt:before,.fa-quote-right:before{content:"\f10e"}.fa-shirt:before,.fa-t-shirt:before,.fa-tshirt:before{content:"\f553"}.fa-cubes:before{content:"\f1b3"}.fa-divide:before{content:"\f529"}.fa-tenge-sign:before,.fa-tenge:before{content:"\f7d7"}.fa-headphones:before{content:"\f025"}.fa-hands-holding:before{content:"\f4c2"}.fa-hands-clapping:before{content:"\e1a8"}.fa-republican:before{content:"\f75e"}.fa-arrow-left:before{content:"\f060"}.fa-person-circle-xmark:before{content:"\e543"}.fa-ruler:before{content:"\f545"}.fa-align-left:before{content:"\f036"}.fa-dice-d6:before{content:"\f6d1"}.fa-restroom:before{content:"\f7bd"}.fa-j:before{content:"\4a"}.fa-users-viewfinder:before{content:"\e595"}.fa-file-video:before{content:"\f1c8"}.fa-external-link-alt:before,.fa-up-right-from-square:before{content:"\f35d"}.fa-table-cells:before,.fa-th:before{content:"\f00a"}.fa-file-pdf:before{content:"\f1c1"}.fa-bible:before,.fa-book-bible:before{content:"\f647"}.fa-o:before{content:"\4f"}.fa-medkit:before,.fa-suitcase-medical:before{content:"\f0fa"}.fa-user-secret:before{content:"\f21b"}.fa-otter:before{content:"\f700"}.fa-female:before,.fa-person-dress:before{content:"\f182"}.fa-comment-dollar:before{content:"\f651"}.fa-briefcase-clock:before,.fa-business-time:before{content:"\f64a"}.fa-table-cells-large:before,.fa-th-large:before{content:"\f009"}.fa-book-tanakh:before,.fa-tanakh:before{content:"\f827"}.fa-phone-volume:before,.fa-volume-control-phone:before{content:"\f2a0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-clipboard-user:before{content:"\f7f3"}.fa-child:before{content:"\f1ae"}.fa-lira-sign:before{content:"\f195"}.fa-satellite:before{content:"\f7bf"}.fa-plane-lock:before{content:"\e558"}.fa-tag:before{content:"\f02b"}.fa-comment:before{content:"\f075"}.fa-birthday-cake:before,.fa-cake-candles:before,.fa-cake:before{content:"\f1fd"}.fa-envelope:before{content:"\f0e0"}.fa-angle-double-up:before,.fa-angles-up:before{content:"\f102"}.fa-paperclip:before{content:"\f0c6"}.fa-arrow-right-to-city:before{content:"\e4b3"}.fa-ribbon:before{content:"\f4d6"}.fa-lungs:before{content:"\f604"}.fa-arrow-up-9-1:before,.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-litecoin-sign:before{content:"\e1d3"}.fa-border-none:before{content:"\f850"}.fa-circle-nodes:before{content:"\e4e2"}.fa-parachute-box:before{content:"\f4cd"}.fa-indent:before{content:"\f03c"}.fa-truck-field-un:before{content:"\e58e"}.fa-hourglass-empty:before,.fa-hourglass:before{content:"\f254"}.fa-mountain:before{content:"\f6fc"}.fa-user-doctor:before,.fa-user-md:before{content:"\f0f0"}.fa-circle-info:before,.fa-info-circle:before{content:"\f05a"}.fa-cloud-meatball:before{content:"\f73b"}.fa-camera-alt:before,.fa-camera:before{content:"\f030"}.fa-square-virus:before{content:"\e578"}.fa-meteor:before{content:"\f753"}.fa-car-on:before{content:"\e4dd"}.fa-sleigh:before{content:"\f7cc"}.fa-arrow-down-1-9:before,.fa-sort-numeric-asc:before,.fa-sort-numeric-down:before{content:"\f162"}.fa-hand-holding-droplet:before,.fa-hand-holding-water:before{content:"\f4c1"}.fa-water:before{content:"\f773"}.fa-calendar-check:before{content:"\f274"}.fa-braille:before{content:"\f2a1"}.fa-prescription-bottle-alt:before,.fa-prescription-bottle-medical:before{content:"\f486"}.fa-landmark:before{content:"\f66f"}.fa-truck:before{content:"\f0d1"}.fa-crosshairs:before{content:"\f05b"}.fa-person-cane:before{content:"\e53c"}.fa-tent:before{content:"\e57d"}.fa-vest-patches:before{content:"\e086"}.fa-check-double:before{content:"\f560"}.fa-arrow-down-a-z:before,.fa-sort-alpha-asc:before,.fa-sort-alpha-down:before{content:"\f15d"}.fa-money-bill-wheat:before{content:"\e52a"}.fa-cookie:before{content:"\f563"}.fa-arrow-left-rotate:before,.fa-arrow-rotate-back:before,.fa-arrow-rotate-backward:before,.fa-arrow-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-hard-drive:before,.fa-hdd:before{content:"\f0a0"}.fa-face-grin-squint-tears:before,.fa-grin-squint-tears:before{content:"\f586"}.fa-dumbbell:before{content:"\f44b"}.fa-list-alt:before,.fa-rectangle-list:before{content:"\f022"}.fa-tarp-droplet:before{content:"\e57c"}.fa-house-medical-circle-check:before{content:"\e511"}.fa-person-skiing-nordic:before,.fa-skiing-nordic:before{content:"\f7ca"}.fa-calendar-plus:before{content:"\f271"}.fa-plane-arrival:before{content:"\f5af"}.fa-arrow-alt-circle-left:before,.fa-circle-left:before{content:"\f359"}.fa-subway:before,.fa-train-subway:before{content:"\f239"}.fa-chart-gantt:before{content:"\e0e4"}.fa-indian-rupee-sign:before,.fa-indian-rupee:before,.fa-inr:before{content:"\e1bc"}.fa-crop-alt:before,.fa-crop-simple:before{content:"\f565"}.fa-money-bill-1:before,.fa-money-bill-alt:before{content:"\f3d1"}.fa-left-long:before,.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-dna:before{content:"\f471"}.fa-virus-slash:before{content:"\e075"}.fa-minus:before,.fa-subtract:before{content:"\f068"}.fa-chess:before{content:"\f439"}.fa-arrow-left-long:before,.fa-long-arrow-left:before{content:"\f177"}.fa-plug-circle-check:before{content:"\e55c"}.fa-street-view:before{content:"\f21d"}.fa-franc-sign:before{content:"\e18f"}.fa-volume-off:before{content:"\f026"}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before,.fa-hands-american-sign-language-interpreting:before,.fa-hands-asl-interpreting:before{content:"\f2a3"}.fa-cog:before,.fa-gear:before{content:"\f013"}.fa-droplet-slash:before,.fa-tint-slash:before{content:"\f5c7"}.fa-mosque:before{content:"\f678"}.fa-mosquito:before{content:"\e52b"}.fa-star-of-david:before{content:"\f69a"}.fa-person-military-rifle:before{content:"\e54b"}.fa-cart-shopping:before,.fa-shopping-cart:before{content:"\f07a"}.fa-vials:before{content:"\f493"}.fa-plug-circle-plus:before{content:"\e55f"}.fa-place-of-worship:before{content:"\f67f"}.fa-grip-vertical:before{content:"\f58e"}.fa-arrow-turn-up:before,.fa-level-up:before{content:"\f148"}.fa-u:before{content:"\55"}.fa-square-root-alt:before,.fa-square-root-variable:before{content:"\f698"}.fa-clock-four:before,.fa-clock:before{content:"\f017"}.fa-backward-step:before,.fa-step-backward:before{content:"\f048"}.fa-pallet:before{content:"\f482"}.fa-faucet:before{content:"\e005"}.fa-baseball-bat-ball:before{content:"\f432"}.fa-s:before{content:"\53"}.fa-timeline:before{content:"\e29c"}.fa-keyboard:before{content:"\f11c"}.fa-caret-down:before{content:"\f0d7"}.fa-clinic-medical:before,.fa-house-chimney-medical:before{content:"\f7f2"}.fa-temperature-3:before,.fa-temperature-three-quarters:before,.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-mobile-android-alt:before,.fa-mobile-screen:before{content:"\f3cf"}.fa-plane-up:before{content:"\e22d"}.fa-piggy-bank:before{content:"\f4d3"}.fa-battery-3:before,.fa-battery-half:before{content:"\f242"}.fa-mountain-city:before{content:"\e52e"}.fa-coins:before{content:"\f51e"}.fa-khanda:before{content:"\f66d"}.fa-sliders-h:before,.fa-sliders:before{content:"\f1de"}.fa-folder-tree:before{content:"\f802"}.fa-network-wired:before{content:"\f6ff"}.fa-map-pin:before{content:"\f276"}.fa-hamsa:before{content:"\f665"}.fa-cent-sign:before{content:"\e3f5"}.fa-flask:before{content:"\f0c3"}.fa-person-pregnant:before{content:"\e31e"}.fa-wand-sparkles:before{content:"\f72b"}.fa-ellipsis-v:before,.fa-ellipsis-vertical:before{content:"\f142"}.fa-ticket:before{content:"\f145"}.fa-power-off:before{content:"\f011"}.fa-long-arrow-alt-right:before,.fa-right-long:before{content:"\f30b"}.fa-flag-usa:before{content:"\f74d"}.fa-laptop-file:before{content:"\e51d"}.fa-teletype:before,.fa-tty:before{content:"\f1e4"}.fa-diagram-next:before{content:"\e476"}.fa-person-rifle:before{content:"\e54e"}.fa-house-medical-circle-exclamation:before{content:"\e512"}.fa-closed-captioning:before{content:"\f20a"}.fa-hiking:before,.fa-person-hiking:before{content:"\f6ec"}.fa-venus-double:before{content:"\f226"}.fa-images:before{content:"\f302"}.fa-calculator:before{content:"\f1ec"}.fa-people-pulling:before{content:"\e535"}.fa-n:before{content:"\4e"}.fa-cable-car:before,.fa-tram:before{content:"\f7da"}.fa-cloud-rain:before{content:"\f73d"}.fa-building-circle-xmark:before{content:"\e4d4"}.fa-ship:before{content:"\f21a"}.fa-arrows-down-to-line:before{content:"\e4b8"}.fa-download:before{content:"\f019"}.fa-face-grin:before,.fa-grin:before{content:"\f580"}.fa-backspace:before,.fa-delete-left:before{content:"\f55a"}.fa-eye-dropper-empty:before,.fa-eye-dropper:before,.fa-eyedropper:before{content:"\f1fb"}.fa-file-circle-check:before{content:"\e5a0"}.fa-forward:before{content:"\f04e"}.fa-mobile-android:before,.fa-mobile-phone:before,.fa-mobile:before{content:"\f3ce"}.fa-face-meh:before,.fa-meh:before{content:"\f11a"}.fa-align-center:before{content:"\f037"}.fa-book-dead:before,.fa-book-skull:before{content:"\f6b7"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-heart-circle-exclamation:before{content:"\e4fe"}.fa-home-alt:before,.fa-home-lg-alt:before,.fa-home:before,.fa-house:before{content:"\f015"}.fa-calendar-week:before{content:"\f784"}.fa-laptop-medical:before{content:"\f812"}.fa-b:before{content:"\42"}.fa-file-medical:before{content:"\f477"}.fa-dice-one:before{content:"\f525"}.fa-kiwi-bird:before{content:"\f535"}.fa-arrow-right-arrow-left:before,.fa-exchange:before{content:"\f0ec"}.fa-redo-alt:before,.fa-rotate-forward:before,.fa-rotate-right:before{content:"\f2f9"}.fa-cutlery:before,.fa-utensils:before{content:"\f2e7"}.fa-arrow-up-wide-short:before,.fa-sort-amount-up:before{content:"\f161"}.fa-mill-sign:before{content:"\e1ed"}.fa-bowl-rice:before{content:"\e2eb"}.fa-skull:before{content:"\f54c"}.fa-broadcast-tower:before,.fa-tower-broadcast:before{content:"\f519"}.fa-truck-pickup:before{content:"\f63c"}.fa-long-arrow-alt-up:before,.fa-up-long:before{content:"\f30c"}.fa-stop:before{content:"\f04d"}.fa-code-merge:before{content:"\f387"}.fa-upload:before{content:"\f093"}.fa-hurricane:before{content:"\f751"}.fa-mound:before{content:"\e52d"}.fa-toilet-portable:before{content:"\e583"}.fa-compact-disc:before{content:"\f51f"}.fa-file-arrow-down:before,.fa-file-download:before{content:"\f56d"}.fa-caravan:before{content:"\f8ff"}.fa-shield-cat:before{content:"\e572"}.fa-bolt:before,.fa-zap:before{content:"\f0e7"}.fa-glass-water:before{content:"\e4f4"}.fa-oil-well:before{content:"\e532"}.fa-vault:before{content:"\e2c5"}.fa-mars:before{content:"\f222"}.fa-toilet:before{content:"\f7d8"}.fa-plane-circle-xmark:before{content:"\e557"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen-sign:before,.fa-yen:before{content:"\f157"}.fa-rouble:before,.fa-rub:before,.fa-ruble-sign:before,.fa-ruble:before{content:"\f158"}.fa-sun:before{content:"\f185"}.fa-guitar:before{content:"\f7a6"}.fa-face-laugh-wink:before,.fa-laugh-wink:before{content:"\f59c"}.fa-horse-head:before{content:"\f7ab"}.fa-bore-hole:before{content:"\e4c3"}.fa-industry:before{content:"\f275"}.fa-arrow-alt-circle-down:before,.fa-circle-down:before{content:"\f358"}.fa-arrows-turn-to-dots:before{content:"\e4c1"}.fa-florin-sign:before{content:"\e184"}.fa-arrow-down-short-wide:before,.fa-sort-amount-desc:before,.fa-sort-amount-down-alt:before{content:"\f884"}.fa-less-than:before{content:"\3c"}.fa-angle-down:before{content:"\f107"}.fa-car-tunnel:before{content:"\e4de"}.fa-head-side-cough:before{content:"\e061"}.fa-grip-lines:before{content:"\f7a4"}.fa-thumbs-down:before{content:"\f165"}.fa-user-lock:before{content:"\f502"}.fa-arrow-right-long:before,.fa-long-arrow-right:before{content:"\f178"}.fa-anchor-circle-xmark:before{content:"\e4ac"}.fa-ellipsis-h:before,.fa-ellipsis:before{content:"\f141"}.fa-chess-pawn:before{content:"\f443"}.fa-first-aid:before,.fa-kit-medical:before{content:"\f479"}.fa-person-through-window:before{content:"\e5a9"}.fa-toolbox:before{content:"\f552"}.fa-hands-holding-circle:before{content:"\e4fb"}.fa-bug:before{content:"\f188"}.fa-credit-card-alt:before,.fa-credit-card:before{content:"\f09d"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-hand-holding-hand:before{content:"\e4f7"}.fa-book-open-reader:before,.fa-book-reader:before{content:"\f5da"}.fa-mountain-sun:before{content:"\e52f"}.fa-arrows-left-right-to-line:before{content:"\e4ba"}.fa-dice-d20:before{content:"\f6cf"}.fa-truck-droplet:before{content:"\e58c"}.fa-file-circle-xmark:before{content:"\e5a1"}.fa-temperature-arrow-up:before,.fa-temperature-up:before{content:"\e040"}.fa-medal:before{content:"\f5a2"}.fa-bed:before{content:"\f236"}.fa-h-square:before,.fa-square-h:before{content:"\f0fd"}.fa-podcast:before{content:"\f2ce"}.fa-temperature-4:before,.fa-temperature-full:before,.fa-thermometer-4:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-bell:before{content:"\f0f3"}.fa-superscript:before{content:"\f12b"}.fa-plug-circle-xmark:before{content:"\e560"}.fa-star-of-life:before{content:"\f621"}.fa-phone-slash:before{content:"\f3dd"}.fa-paint-roller:before{content:"\f5aa"}.fa-hands-helping:before,.fa-handshake-angle:before{content:"\f4c4"}.fa-location-dot:before,.fa-map-marker-alt:before{content:"\f3c5"}.fa-file:before{content:"\f15b"}.fa-greater-than:before{content:"\3e"}.fa-person-swimming:before,.fa-swimmer:before{content:"\f5c4"}.fa-arrow-down:before{content:"\f063"}.fa-droplet:before,.fa-tint:before{content:"\f043"}.fa-eraser:before{content:"\f12d"}.fa-earth-america:before,.fa-earth-americas:before,.fa-earth:before,.fa-globe-americas:before{content:"\f57d"}.fa-person-burst:before{content:"\e53b"}.fa-dove:before{content:"\f4ba"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-socks:before{content:"\f696"}.fa-inbox:before{content:"\f01c"}.fa-section:before{content:"\e447"}.fa-gauge-high:before,.fa-tachometer-alt-fast:before,.fa-tachometer-alt:before{content:"\f625"}.fa-envelope-open-text:before{content:"\f658"}.fa-hospital-alt:before,.fa-hospital-wide:before,.fa-hospital:before{content:"\f0f8"}.fa-wine-bottle:before{content:"\f72f"}.fa-chess-rook:before{content:"\f447"}.fa-bars-staggered:before,.fa-reorder:before,.fa-stream:before{content:"\f550"}.fa-dharmachakra:before{content:"\f655"}.fa-hotdog:before{content:"\f80f"}.fa-blind:before,.fa-person-walking-with-cane:before{content:"\f29d"}.fa-drum:before{content:"\f569"}.fa-ice-cream:before{content:"\f810"}.fa-heart-circle-bolt:before{content:"\e4fc"}.fa-fax:before{content:"\f1ac"}.fa-paragraph:before{content:"\f1dd"}.fa-check-to-slot:before,.fa-vote-yea:before{content:"\f772"}.fa-star-half:before{content:"\f089"}.fa-boxes-alt:before,.fa-boxes-stacked:before,.fa-boxes:before{content:"\f468"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-assistive-listening-systems:before,.fa-ear-listen:before{content:"\f2a2"}.fa-tree-city:before{content:"\e587"}.fa-play:before{content:"\f04b"}.fa-font:before{content:"\f031"}.fa-rupiah-sign:before{content:"\e23d"}.fa-magnifying-glass:before,.fa-search:before{content:"\f002"}.fa-ping-pong-paddle-ball:before,.fa-table-tennis-paddle-ball:before,.fa-table-tennis:before{content:"\f45d"}.fa-diagnoses:before,.fa-person-dots-from-line:before{content:"\f470"}.fa-trash-can-arrow-up:before,.fa-trash-restore-alt:before{content:"\f82a"}.fa-naira-sign:before{content:"\e1f6"}.fa-cart-arrow-down:before{content:"\f218"}.fa-walkie-talkie:before{content:"\f8ef"}.fa-file-edit:before,.fa-file-pen:before{content:"\f31c"}.fa-receipt:before{content:"\f543"}.fa-pen-square:before,.fa-pencil-square:before,.fa-square-pen:before{content:"\f14b"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-person-circle-exclamation:before{content:"\e53f"}.fa-chevron-down:before{content:"\f078"}.fa-battery-5:before,.fa-battery-full:before,.fa-battery:before{content:"\f240"}.fa-skull-crossbones:before{content:"\f714"}.fa-code-compare:before{content:"\e13a"}.fa-list-dots:before,.fa-list-ul:before{content:"\f0ca"}.fa-school-lock:before{content:"\e56f"}.fa-tower-cell:before{content:"\e585"}.fa-down-long:before,.fa-long-arrow-alt-down:before{content:"\f309"}.fa-ranking-star:before{content:"\e561"}.fa-chess-king:before{content:"\f43f"}.fa-person-harassing:before{content:"\e549"}.fa-brazilian-real-sign:before{content:"\e46c"}.fa-landmark-alt:before,.fa-landmark-dome:before{content:"\f752"}.fa-arrow-up:before{content:"\f062"}.fa-television:before,.fa-tv-alt:before,.fa-tv:before{content:"\f26c"}.fa-shrimp:before{content:"\e448"}.fa-list-check:before,.fa-tasks:before{content:"\f0ae"}.fa-jug-detergent:before{content:"\e519"}.fa-circle-user:before,.fa-user-circle:before{content:"\f2bd"}.fa-user-shield:before{content:"\f505"}.fa-wind:before{content:"\f72e"}.fa-car-burst:before,.fa-car-crash:before{content:"\f5e1"}.fa-y:before{content:"\59"}.fa-person-snowboarding:before,.fa-snowboarding:before{content:"\f7ce"}.fa-shipping-fast:before,.fa-truck-fast:before{content:"\f48b"}.fa-fish:before{content:"\f578"}.fa-user-graduate:before{content:"\f501"}.fa-adjust:before,.fa-circle-half-stroke:before{content:"\f042"}.fa-clapperboard:before{content:"\e131"}.fa-circle-radiation:before,.fa-radiation-alt:before{content:"\f7ba"}.fa-baseball-ball:before,.fa-baseball:before{content:"\f433"}.fa-jet-fighter-up:before{content:"\e518"}.fa-diagram-project:before,.fa-project-diagram:before{content:"\f542"}.fa-copy:before{content:"\f0c5"}.fa-volume-mute:before,.fa-volume-times:before,.fa-volume-xmark:before{content:"\f6a9"}.fa-hand-sparkles:before{content:"\e05d"}.fa-grip-horizontal:before,.fa-grip:before{content:"\f58d"}.fa-share-from-square:before,.fa-share-square:before{content:"\f14d"}.fa-child-combatant:before,.fa-child-rifle:before{content:"\e4e0"}.fa-gun:before{content:"\e19b"}.fa-phone-square:before,.fa-square-phone:before{content:"\f098"}.fa-add:before,.fa-plus:before{content:"\2b"}.fa-expand:before{content:"\f065"}.fa-computer:before{content:"\e4e5"}.fa-close:before,.fa-multiply:before,.fa-remove:before,.fa-times:before,.fa-xmark:before{content:"\f00d"}.fa-arrows-up-down-left-right:before,.fa-arrows:before{content:"\f047"}.fa-chalkboard-teacher:before,.fa-chalkboard-user:before{content:"\f51c"}.fa-peso-sign:before{content:"\e222"}.fa-building-shield:before{content:"\e4d8"}.fa-baby:before{content:"\f77c"}.fa-users-line:before{content:"\e592"}.fa-quote-left-alt:before,.fa-quote-left:before{content:"\f10d"}.fa-tractor:before{content:"\f722"}.fa-trash-arrow-up:before,.fa-trash-restore:before{content:"\f829"}.fa-arrow-down-up-lock:before{content:"\e4b0"}.fa-lines-leaning:before{content:"\e51e"}.fa-ruler-combined:before{content:"\f546"}.fa-copyright:before{content:"\f1f9"}.fa-equals:before{content:"\3d"}.fa-blender:before{content:"\f517"}.fa-teeth:before{content:"\f62e"}.fa-ils:before,.fa-shekel-sign:before,.fa-shekel:before,.fa-sheqel-sign:before,.fa-sheqel:before{content:"\f20b"}.fa-map:before{content:"\f279"}.fa-rocket:before{content:"\f135"}.fa-photo-film:before,.fa-photo-video:before{content:"\f87c"}.fa-folder-minus:before{content:"\f65d"}.fa-store:before{content:"\f54e"}.fa-arrow-trend-up:before{content:"\e098"}.fa-plug-circle-minus:before{content:"\e55e"}.fa-sign-hanging:before,.fa-sign:before{content:"\f4d9"}.fa-bezier-curve:before{content:"\f55b"}.fa-bell-slash:before{content:"\f1f6"}.fa-tablet-android:before,.fa-tablet:before{content:"\f3fb"}.fa-school-flag:before{content:"\e56e"}.fa-fill:before{content:"\f575"}.fa-angle-up:before{content:"\f106"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-holly-berry:before{content:"\f7aa"}.fa-chevron-left:before{content:"\f053"}.fa-bacteria:before{content:"\e059"}.fa-hand-lizard:before{content:"\f258"}.fa-notdef:before{content:"\e1fe"}.fa-disease:before{content:"\f7fa"}.fa-briefcase-medical:before{content:"\f469"}.fa-genderless:before{content:"\f22d"}.fa-chevron-right:before{content:"\f054"}.fa-retweet:before{content:"\f079"}.fa-car-alt:before,.fa-car-rear:before{content:"\f5de"}.fa-pump-soap:before{content:"\e06b"}.fa-video-slash:before{content:"\f4e2"}.fa-battery-2:before,.fa-battery-quarter:before{content:"\f243"}.fa-radio:before{content:"\f8d7"}.fa-baby-carriage:before,.fa-carriage-baby:before{content:"\f77d"}.fa-traffic-light:before{content:"\f637"}.fa-thermometer:before{content:"\f491"}.fa-vr-cardboard:before{content:"\f729"}.fa-hand-middle-finger:before{content:"\f806"}.fa-percent:before,.fa-percentage:before{content:"\25"}.fa-truck-moving:before{content:"\f4df"}.fa-glass-water-droplet:before{content:"\e4f5"}.fa-display:before{content:"\e163"}.fa-face-smile:before,.fa-smile:before{content:"\f118"}.fa-thumb-tack:before,.fa-thumbtack:before{content:"\f08d"}.fa-trophy:before{content:"\f091"}.fa-person-praying:before,.fa-pray:before{content:"\f683"}.fa-hammer:before{content:"\f6e3"}.fa-hand-peace:before{content:"\f25b"}.fa-rotate:before,.fa-sync-alt:before{content:"\f2f1"}.fa-spinner:before{content:"\f110"}.fa-robot:before{content:"\f544"}.fa-peace:before{content:"\f67c"}.fa-cogs:before,.fa-gears:before{content:"\f085"}.fa-warehouse:before{content:"\f494"}.fa-arrow-up-right-dots:before{content:"\e4b7"}.fa-splotch:before{content:"\f5bc"}.fa-face-grin-hearts:before,.fa-grin-hearts:before{content:"\f584"}.fa-dice-four:before{content:"\f524"}.fa-sim-card:before{content:"\f7c4"}.fa-transgender-alt:before,.fa-transgender:before{content:"\f225"}.fa-mercury:before{content:"\f223"}.fa-arrow-turn-down:before,.fa-level-down:before{content:"\f149"}.fa-person-falling-burst:before{content:"\e547"}.fa-award:before{content:"\f559"}.fa-ticket-alt:before,.fa-ticket-simple:before{content:"\f3ff"}.fa-building:before{content:"\f1ad"}.fa-angle-double-left:before,.fa-angles-left:before{content:"\f100"}.fa-qrcode:before{content:"\f029"}.fa-clock-rotate-left:before,.fa-history:before{content:"\f1da"}.fa-face-grin-beam-sweat:before,.fa-grin-beam-sweat:before{content:"\f583"}.fa-arrow-right-from-file:before,.fa-file-export:before{content:"\f56e"}.fa-shield-blank:before,.fa-shield:before{content:"\f132"}.fa-arrow-up-short-wide:before,.fa-sort-amount-up-alt:before{content:"\f885"}.fa-house-medical:before{content:"\e3b2"}.fa-golf-ball-tee:before,.fa-golf-ball:before{content:"\f450"}.fa-chevron-circle-left:before,.fa-circle-chevron-left:before{content:"\f137"}.fa-house-chimney-window:before{content:"\e00d"}.fa-pen-nib:before{content:"\f5ad"}.fa-tent-arrow-turn-left:before{content:"\e580"}.fa-tents:before{content:"\e582"}.fa-magic:before,.fa-wand-magic:before{content:"\f0d0"}.fa-dog:before{content:"\f6d3"}.fa-carrot:before{content:"\f787"}.fa-moon:before{content:"\f186"}.fa-wine-glass-alt:before,.fa-wine-glass-empty:before{content:"\f5ce"}.fa-cheese:before{content:"\f7ef"}.fa-yin-yang:before{content:"\f6ad"}.fa-music:before{content:"\f001"}.fa-code-commit:before{content:"\f386"}.fa-temperature-low:before{content:"\f76b"}.fa-biking:before,.fa-person-biking:before{content:"\f84a"}.fa-broom:before{content:"\f51a"}.fa-shield-heart:before{content:"\e574"}.fa-gopuram:before{content:"\f664"}.fa-earth-oceania:before,.fa-globe-oceania:before{content:"\e47b"}.fa-square-xmark:before,.fa-times-square:before,.fa-xmark-square:before{content:"\f2d3"}.fa-hashtag:before{content:"\23"}.fa-expand-alt:before,.fa-up-right-and-down-left-from-center:before{content:"\f424"}.fa-oil-can:before{content:"\f613"}.fa-t:before{content:"\54"}.fa-hippo:before{content:"\f6ed"}.fa-chart-column:before{content:"\e0e3"}.fa-infinity:before{content:"\f534"}.fa-vial-circle-check:before{content:"\e596"}.fa-person-arrow-down-to-line:before{content:"\e538"}.fa-voicemail:before{content:"\f897"}.fa-fan:before{content:"\f863"}.fa-person-walking-luggage:before{content:"\e554"}.fa-arrows-alt-v:before,.fa-up-down:before{content:"\f338"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-calendar:before{content:"\f133"}.fa-trailer:before{content:"\e041"}.fa-bahai:before,.fa-haykal:before{content:"\f666"}.fa-sd-card:before{content:"\f7c2"}.fa-dragon:before{content:"\f6d5"}.fa-shoe-prints:before{content:"\f54b"}.fa-circle-plus:before,.fa-plus-circle:before{content:"\f055"}.fa-face-grin-tongue-wink:before,.fa-grin-tongue-wink:before{content:"\f58b"}.fa-hand-holding:before{content:"\f4bd"}.fa-plug-circle-exclamation:before{content:"\e55d"}.fa-chain-broken:before,.fa-chain-slash:before,.fa-link-slash:before,.fa-unlink:before{content:"\f127"}.fa-clone:before{content:"\f24d"}.fa-person-walking-arrow-loop-left:before{content:"\e551"}.fa-arrow-up-z-a:before,.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-fire-alt:before,.fa-fire-flame-curved:before{content:"\f7e4"}.fa-tornado:before{content:"\f76f"}.fa-file-circle-plus:before{content:"\e494"}.fa-book-quran:before,.fa-quran:before{content:"\f687"}.fa-anchor:before{content:"\f13d"}.fa-border-all:before{content:"\f84c"}.fa-angry:before,.fa-face-angry:before{content:"\f556"}.fa-cookie-bite:before{content:"\f564"}.fa-arrow-trend-down:before{content:"\e097"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-draw-polygon:before{content:"\f5ee"}.fa-balance-scale:before,.fa-scale-balanced:before{content:"\f24e"}.fa-gauge-simple-high:before,.fa-tachometer-fast:before,.fa-tachometer:before{content:"\f62a"}.fa-shower:before{content:"\f2cc"}.fa-desktop-alt:before,.fa-desktop:before{content:"\f390"}.fa-m:before{content:"\4d"}.fa-table-list:before,.fa-th-list:before{content:"\f00b"}.fa-comment-sms:before,.fa-sms:before{content:"\f7cd"}.fa-book:before{content:"\f02d"}.fa-user-plus:before{content:"\f234"}.fa-check:before{content:"\f00c"}.fa-battery-4:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-house-circle-check:before{content:"\e509"}.fa-angle-left:before{content:"\f104"}.fa-diagram-successor:before{content:"\e47a"}.fa-truck-arrow-right:before{content:"\e58b"}.fa-arrows-split-up-and-left:before{content:"\e4bc"}.fa-fist-raised:before,.fa-hand-fist:before{content:"\f6de"}.fa-cloud-moon:before{content:"\f6c3"}.fa-briefcase:before{content:"\f0b1"}.fa-person-falling:before{content:"\e546"}.fa-image-portrait:before,.fa-portrait:before{content:"\f3e0"}.fa-user-tag:before{content:"\f507"}.fa-rug:before{content:"\e569"}.fa-earth-europe:before,.fa-globe-europe:before{content:"\f7a2"}.fa-cart-flatbed-suitcase:before,.fa-luggage-cart:before{content:"\f59d"}.fa-rectangle-times:before,.fa-rectangle-xmark:before,.fa-times-rectangle:before,.fa-window-close:before{content:"\f410"}.fa-baht-sign:before{content:"\e0ac"}.fa-book-open:before{content:"\f518"}.fa-book-journal-whills:before,.fa-journal-whills:before{content:"\f66a"}.fa-handcuffs:before{content:"\e4f8"}.fa-exclamation-triangle:before,.fa-triangle-exclamation:before,.fa-warning:before{content:"\f071"}.fa-database:before{content:"\f1c0"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-bottle-droplet:before{content:"\e4c4"}.fa-mask-face:before{content:"\e1d7"}.fa-hill-rockslide:before{content:"\e508"}.fa-exchange-alt:before,.fa-right-left:before{content:"\f362"}.fa-paper-plane:before{content:"\f1d8"}.fa-road-circle-exclamation:before{content:"\e565"}.fa-dungeon:before{content:"\f6d9"}.fa-align-right:before{content:"\f038"}.fa-money-bill-1-wave:before,.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-life-ring:before{content:"\f1cd"}.fa-hands:before,.fa-sign-language:before,.fa-signing:before{content:"\f2a7"}.fa-calendar-day:before{content:"\f783"}.fa-ladder-water:before,.fa-swimming-pool:before,.fa-water-ladder:before{content:"\f5c5"}.fa-arrows-up-down:before,.fa-arrows-v:before{content:"\f07d"}.fa-face-grimace:before,.fa-grimace:before{content:"\f57f"}.fa-wheelchair-alt:before,.fa-wheelchair-move:before{content:"\e2ce"}.fa-level-down-alt:before,.fa-turn-down:before{content:"\f3be"}.fa-person-walking-arrow-right:before{content:"\e552"}.fa-envelope-square:before,.fa-square-envelope:before{content:"\f199"}.fa-dice:before{content:"\f522"}.fa-bowling-ball:before{content:"\f436"}.fa-brain:before{content:"\f5dc"}.fa-band-aid:before,.fa-bandage:before{content:"\f462"}.fa-calendar-minus:before{content:"\f272"}.fa-circle-xmark:before,.fa-times-circle:before,.fa-xmark-circle:before{content:"\f057"}.fa-gifts:before{content:"\f79c"}.fa-hotel:before{content:"\f594"}.fa-earth-asia:before,.fa-globe-asia:before{content:"\f57e"}.fa-id-card-alt:before,.fa-id-card-clip:before{content:"\f47f"}.fa-magnifying-glass-plus:before,.fa-search-plus:before{content:"\f00e"}.fa-thumbs-up:before{content:"\f164"}.fa-user-clock:before{content:"\f4fd"}.fa-allergies:before,.fa-hand-dots:before{content:"\f461"}.fa-file-invoice:before{content:"\f570"}.fa-window-minimize:before{content:"\f2d1"}.fa-coffee:before,.fa-mug-saucer:before{content:"\f0f4"}.fa-brush:before{content:"\f55d"}.fa-mask:before{content:"\f6fa"}.fa-magnifying-glass-minus:before,.fa-search-minus:before{content:"\f010"}.fa-ruler-vertical:before{content:"\f548"}.fa-user-alt:before,.fa-user-large:before{content:"\f406"}.fa-train-tram:before{content:"\e5b4"}.fa-user-nurse:before{content:"\f82f"}.fa-syringe:before{content:"\f48e"}.fa-cloud-sun:before{content:"\f6c4"}.fa-stopwatch-20:before{content:"\e06f"}.fa-square-full:before{content:"\f45c"}.fa-magnet:before{content:"\f076"}.fa-jar:before{content:"\e516"}.fa-note-sticky:before,.fa-sticky-note:before{content:"\f249"}.fa-bug-slash:before{content:"\e490"}.fa-arrow-up-from-water-pump:before{content:"\e4b6"}.fa-bone:before{content:"\f5d7"}.fa-user-injured:before{content:"\f728"}.fa-face-sad-tear:before,.fa-sad-tear:before{content:"\f5b4"}.fa-plane:before{content:"\f072"}.fa-tent-arrows-down:before{content:"\e581"}.fa-exclamation:before{content:"\21"}.fa-arrows-spin:before{content:"\e4bb"}.fa-print:before{content:"\f02f"}.fa-try:before,.fa-turkish-lira-sign:before,.fa-turkish-lira:before{content:"\e2bb"}.fa-dollar-sign:before,.fa-dollar:before,.fa-usd:before{content:"\24"}.fa-x:before{content:"\58"}.fa-magnifying-glass-dollar:before,.fa-search-dollar:before{content:"\f688"}.fa-users-cog:before,.fa-users-gear:before{content:"\f509"}.fa-person-military-pointing:before{content:"\e54a"}.fa-bank:before,.fa-building-columns:before,.fa-institution:before,.fa-museum:before,.fa-university:before{content:"\f19c"}.fa-umbrella:before{content:"\f0e9"}.fa-trowel:before{content:"\e589"}.fa-d:before{content:"\44"}.fa-stapler:before{content:"\e5af"}.fa-masks-theater:before,.fa-theater-masks:before{content:"\f630"}.fa-kip-sign:before{content:"\e1c4"}.fa-hand-point-left:before{content:"\f0a5"}.fa-handshake-alt:before,.fa-handshake-simple:before{content:"\f4c6"}.fa-fighter-jet:before,.fa-jet-fighter:before{content:"\f0fb"}.fa-share-alt-square:before,.fa-square-share-nodes:before{content:"\f1e1"}.fa-barcode:before{content:"\f02a"}.fa-plus-minus:before{content:"\e43c"}.fa-video-camera:before,.fa-video:before{content:"\f03d"}.fa-graduation-cap:before,.fa-mortar-board:before{content:"\f19d"}.fa-hand-holding-medical:before{content:"\e05c"}.fa-person-circle-check:before{content:"\e53e"}.fa-level-up-alt:before,.fa-turn-up:before{content:"\f3bf"} -.fa-sr-only,.fa-sr-only-focusable:not(:focus),.sr-only,.sr-only-focusable:not(:focus){position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0} \ No newline at end of file diff --git a/site/css/solid.min.css b/site/css/solid.min.css deleted file mode 100644 index 7e1fb2d..0000000 --- a/site/css/solid.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2023 Fonticons, Inc. - */ -:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900} \ No newline at end of file diff --git a/site/css/v4-font-face.min.css b/site/css/v4-font-face.min.css deleted file mode 100644 index dadd6c5..0000000 --- a/site/css/v4-font-face.min.css +++ /dev/null @@ -1,6 +0,0 @@ -/*! - * Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com - * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) - * Copyright 2023 Fonticons, Inc. - */ -@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a} \ No newline at end of file diff --git a/site/img/favicon.ico b/site/img/favicon.ico deleted file mode 100644 index e85006a3ce1c6fd81faa6d5a13095519c4a6fc96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmd6lF-yZh9L1kl>(HSEK`2y^4yB6->f+$wD)=oNY!UheIt03Q=;qj=;8*Bap_4*& za8yAl;wmmx5Yyi^7dXN-WYdJ-{qNqpcez|5t#Fr0qTSYcPTG`I2PBk8r$~4kg^0zN zCJe(rhix3do!L$bZ+IuZ{i08x=JR3=e+M4pv0KsKA??{u_*EFfo|`p&t`Vf=jn{)F z1fKk9hWsmYwqWAP^JO*5u*R;*L&dX3H$%S7oB$f0{ISh{QVXuncnzN67WQH2`lip7 zhX+VI$6x$1+$8gMjh4+1l0N#8_0Fh=N#EwpKk{SeE!)SHFB@xQFX3y+8sF#_@!bDW eIdI-IC`$c%>bk?KbPeN9RHtL<1^)v~#xMt8oB^@` diff --git a/site/img/grid.png b/site/img/grid.png deleted file mode 100644 index 878c3ed5c196539c4e2da35b7787ab08e98b9cca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1458 zcmeAS@N?(olHy`uVBq!ia0vp^Q49=>MjUKFR#nCEMj*vm;1OBOz`!jG!i)^F=12fl zLsS+C#C9D4%n8IWc}2f)ZEm(l45;BJwtuC;Xu7MDalsFrAb+- z$t7TS!;J%bz$r0ZA4%9oA5*oBKFCE#E`)d=EDH3$9hZ$hJS^?Fp4#&|GB7Z|@^o^SSJTd6tq0S!DeK!2h*Tl*`P5Yzc8-3Bx*#7*P z_lIZyDoaaS`}OwX=Dx>2?#BS1xgR(Q!d=p|X>EOCN` zXA4VQu*xH8*v`wH|7Kg_&!-n1cjuav&3^o%1B-!38l2qsw5vX{)ww9+?vCFTf>ud~ zg*GO3KC`e=!r@T3xzf`*c)d-IUlfFk;PBjy4K6tmi!A&4@cAEP$Px9s?lqTci7~T+ z-}^{4afY_30{uixxSHt*N>9t^Tda&0H5mQ_1`yCs#p`NH*8Km)_~-KFoNo=!_8c#s zWAa>N-HQ`bo%5fbxey)esBZQ2{nIXNu`Os-bmok|{*PU&?;Wq;K7ViC-rR_~+KOL= zH4)jidxUns0>)Izao*FaI~PF{%uT~Dk@j=8|5Dta{K8wv>d|%Hcb{Lgz3+r2sU6kg zmTAw9&-`i8w14I8wx>P5N6NF;+MlVs*O$JfT6WJou)_P>@A@uXTleG5F;Ur%rwkr} z9Cy=jOL!Yh{`u60)j+55f37_IN$UUe9sghL7uuB@5hwlYz5Q2Eoi? z8|G~6tcc3~n|batFcfpX-rfHA^NYK3=QY>WxaPaUGs?d6cXxkJIsW|O^e4z^d}6ZQ z{XhH5lWzwfnEw0KbC6*c*P{6UH^(HL+Z_Lz)%(e&^e>X(pJ#64-W$DObB_40RoL^? hufEOi_HxMn - - - - - - - - - - Promptolution Documentation - - - - - - - - - - - - - - - - -
-
-
-
- -

Welcome to Promptolution

-

Promptolution is a library for optimizing prompts for large language models.

-

Features

-
    -
  • Various LLM implementations
  • -
  • Optimization algorithms for prompt tuning
  • -
  • Task-specific modules
  • -
  • Flexible configuration options
  • -
-

Getting Started

-

To get started with Promptolution, check out our API reference for detailed information on each module.

-

API Reference

-
-
-
- - - - - - - - - - - - - diff --git a/site/js/base.js b/site/js/base.js deleted file mode 100644 index 957ccad..0000000 --- a/site/js/base.js +++ /dev/null @@ -1,287 +0,0 @@ -function getSearchTerm() { - var sPageURL = window.location.search.substring(1); - var sURLVariables = sPageURL.split('&'); - for (var i = 0; i < sURLVariables.length; i++) { - var sParameterName = sURLVariables[i].split('='); - if (sParameterName[0] == 'q') { - return sParameterName[1]; - } - } -} - -function applyTopPadding() { - // Update various absolute positions to match where the main container - // starts. This is necessary for handling multi-line nav headers, since - // that pushes the main container down. - var container = document.querySelector('body > .container'); - var offset = container.offsetTop; - - document.documentElement.style.scrollPaddingTop = offset + 'px'; - document.querySelectorAll('.bs-sidebar.affix').forEach(function(sidebar) { - sidebar.style.top = offset + 'px'; - }); -} - -document.addEventListener("DOMContentLoaded", function () { - var search_term = getSearchTerm(); - var search_modal = new bootstrap.Modal(document.getElementById('mkdocs_search_modal')); - var keyboard_modal = new bootstrap.Modal(document.getElementById('mkdocs_keyboard_modal')); - - if (search_term) { - search_modal.show(); - } - - // make sure search input gets autofocus every time modal opens. - document.getElementById('mkdocs_search_modal').addEventListener('shown.bs.modal', function() { - document.getElementById('mkdocs-search-query').focus(); - }); - - // Close search modal when result is selected - // The links get added later so listen to parent - document.getElementById('mkdocs-search-results').addEventListener('click', function(e) { - if (e.target.tagName === 'A') { - search_modal.hide(); - } - }); - - // Populate keyboard modal with proper Keys - document.querySelector('.help.shortcut kbd').innerHTML = keyCodes[shortcuts.help]; - document.querySelector('.prev.shortcut kbd').innerHTML = keyCodes[shortcuts.previous]; - document.querySelector('.next.shortcut kbd').innerHTML = keyCodes[shortcuts.next]; - document.querySelector('.search.shortcut kbd').innerHTML = keyCodes[shortcuts.search]; - - // Keyboard navigation - document.addEventListener("keydown", function(e) { - if (e.target.tagName === 'INPUT' || e.target.tagName === 'TEXTAREA') return true; - var key = e.which || e.keyCode || window.event && window.event.keyCode; - var page; - switch (key) { - case shortcuts.next: - page = document.querySelector('.navbar a[rel="next"]'); - break; - case shortcuts.previous: - page = document.querySelector('.navbar a[rel="prev"]'); - break; - case shortcuts.search: - e.preventDefault(); - keyboard_modal.hide(); - search_modal.show(); - document.getElementById('mkdocs-search-query').focus(); - break; - case shortcuts.help: - search_modal.hide(); - keyboard_modal.show(); - break; - default: break; - } - if (page && page.hasAttribute('href')) { - keyboard_modal.hide(); - window.location.href = page.getAttribute('href'); - } - }); - - document.querySelectorAll('table').forEach(function(table) { - table.classList.add('table', 'table-striped', 'table-hover'); - }); - - function showInnerDropdown(item) { - var popup = item.nextElementSibling; - popup.classList.add('show'); - item.classList.add('open'); - - // First, close any sibling dropdowns. - var container = item.parentElement.parentElement; - container.querySelectorAll(':scope > .dropdown-submenu > a').forEach(function(el) { - if (el !== item) { - hideInnerDropdown(el); - } - }); - - var popupMargin = 10; - var maxBottom = window.innerHeight - popupMargin; - var bounds = item.getBoundingClientRect(); - - popup.style.left = bounds.right + 'px'; - if (bounds.top + popup.clientHeight > maxBottom && - bounds.top > window.innerHeight / 2) { - popup.style.top = (bounds.bottom - popup.clientHeight) + 'px'; - popup.style.maxHeight = (bounds.bottom - popupMargin) + 'px'; - } else { - popup.style.top = bounds.top + 'px'; - popup.style.maxHeight = (maxBottom - bounds.top) + 'px'; - } - } - - function hideInnerDropdown(item) { - var popup = item.nextElementSibling; - popup.classList.remove('show'); - item.classList.remove('open'); - - popup.scrollTop = 0; - var menu = popup.querySelector('.dropdown-menu'); - if (menu) { - menu.scrollTop = 0; - } - var dropdown = popup.querySelector('.dropdown-submenu > a'); - if (dropdown) { - dropdown.classList.remove('open'); - } - } - - document.querySelectorAll('.dropdown-submenu > a').forEach(function(item) { - item.addEventListener('click', function(e) { - if (item.nextElementSibling.classList.contains('show')) { - hideInnerDropdown(item); - } else { - showInnerDropdown(item); - } - - e.stopPropagation(); - e.preventDefault(); - }); - }); - - document.querySelectorAll('.dropdown-menu').forEach(function(menu) { - menu.parentElement.addEventListener('hide.bs.dropdown', function() { - menu.scrollTop = 0; - var dropdown = menu.querySelector('.dropdown-submenu > a'); - if (dropdown) { - dropdown.classList.remove('open'); - } - menu.querySelectorAll('.dropdown-menu .dropdown-menu').forEach(function(submenu) { - submenu.classList.remove('show'); - }); - }); - }); - - applyTopPadding(); -}); - -window.addEventListener('resize', applyTopPadding); - -var scrollSpy = new bootstrap.ScrollSpy(document.body, { - target: '.bs-sidebar' -}); - -/* Prevent disabled links from causing a page reload */ -document.querySelectorAll("li.disabled a").forEach(function(item) { - item.addEventListener("click", function(event) { - event.preventDefault(); - }); -}); - -// See https://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes -// We only list common keys below. Obscure keys are omitted and their use is discouraged. -var keyCodes = { - 8: 'backspace', - 9: 'tab', - 13: 'enter', - 16: 'shift', - 17: 'ctrl', - 18: 'alt', - 19: 'pause/break', - 20: 'caps lock', - 27: 'escape', - 32: 'spacebar', - 33: 'page up', - 34: 'page down', - 35: 'end', - 36: 'home', - 37: '←', - 38: '↑', - 39: '→', - 40: '↓', - 45: 'insert', - 46: 'delete', - 48: '0', - 49: '1', - 50: '2', - 51: '3', - 52: '4', - 53: '5', - 54: '6', - 55: '7', - 56: '8', - 57: '9', - 65: 'a', - 66: 'b', - 67: 'c', - 68: 'd', - 69: 'e', - 70: 'f', - 71: 'g', - 72: 'h', - 73: 'i', - 74: 'j', - 75: 'k', - 76: 'l', - 77: 'm', - 78: 'n', - 79: 'o', - 80: 'p', - 81: 'q', - 82: 'r', - 83: 's', - 84: 't', - 85: 'u', - 86: 'v', - 87: 'w', - 88: 'x', - 89: 'y', - 90: 'z', - 91: 'Left Windows Key / Left ⌘', - 92: 'Right Windows Key', - 93: 'Windows Menu / Right ⌘', - 96: 'numpad 0', - 97: 'numpad 1', - 98: 'numpad 2', - 99: 'numpad 3', - 100: 'numpad 4', - 101: 'numpad 5', - 102: 'numpad 6', - 103: 'numpad 7', - 104: 'numpad 8', - 105: 'numpad 9', - 106: 'multiply', - 107: 'add', - 109: 'subtract', - 110: 'decimal point', - 111: 'divide', - 112: 'f1', - 113: 'f2', - 114: 'f3', - 115: 'f4', - 116: 'f5', - 117: 'f6', - 118: 'f7', - 119: 'f8', - 120: 'f9', - 121: 'f10', - 122: 'f11', - 123: 'f12', - 124: 'f13', - 125: 'f14', - 126: 'f15', - 127: 'f16', - 128: 'f17', - 129: 'f18', - 130: 'f19', - 131: 'f20', - 132: 'f21', - 133: 'f22', - 134: 'f23', - 135: 'f24', - 144: 'num lock', - 145: 'scroll lock', - 186: ';', - 187: '=', - 188: ',', - 189: '‐', - 190: '.', - 191: '?', - 192: '`', - 219: '[', - 220: '\', - 221: ']', - 222: ''', -}; diff --git a/site/js/bootstrap.bundle.min.js b/site/js/bootstrap.bundle.min.js deleted file mode 100644 index b1999d9..0000000 --- a/site/js/bootstrap.bundle.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * Bootstrap v5.3.2 (https://getbootstrap.com/) - * Copyright 2011-2023 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).bootstrap=e()}(this,(function(){"use strict";const t=new Map,e={set(e,i,n){t.has(e)||t.set(e,new Map);const s=t.get(e);s.has(i)||0===s.size?s.set(i,n):console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(s.keys())[0]}.`)},get:(e,i)=>t.has(e)&&t.get(e).get(i)||null,remove(e,i){if(!t.has(e))return;const n=t.get(e);n.delete(i),0===n.size&&t.delete(e)}},i="transitionend",n=t=>(t&&window.CSS&&window.CSS.escape&&(t=t.replace(/#([^\s"#']+)/g,((t,e)=>`#${CSS.escape(e)}`))),t),s=t=>{t.dispatchEvent(new Event(i))},o=t=>!(!t||"object"!=typeof t)&&(void 0!==t.jquery&&(t=t[0]),void 0!==t.nodeType),r=t=>o(t)?t.jquery?t[0]:t:"string"==typeof t&&t.length>0?document.querySelector(n(t)):null,a=t=>{if(!o(t)||0===t.getClientRects().length)return!1;const e="visible"===getComputedStyle(t).getPropertyValue("visibility"),i=t.closest("details:not([open])");if(!i)return e;if(i!==t){const e=t.closest("summary");if(e&&e.parentNode!==i)return!1;if(null===e)return!1}return e},l=t=>!t||t.nodeType!==Node.ELEMENT_NODE||!!t.classList.contains("disabled")||(void 0!==t.disabled?t.disabled:t.hasAttribute("disabled")&&"false"!==t.getAttribute("disabled")),c=t=>{if(!document.documentElement.attachShadow)return null;if("function"==typeof t.getRootNode){const e=t.getRootNode();return e instanceof ShadowRoot?e:null}return t instanceof ShadowRoot?t:t.parentNode?c(t.parentNode):null},h=()=>{},d=t=>{t.offsetHeight},u=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,f=[],p=()=>"rtl"===document.documentElement.dir,m=t=>{var e;e=()=>{const e=u();if(e){const i=t.NAME,n=e.fn[i];e.fn[i]=t.jQueryInterface,e.fn[i].Constructor=t,e.fn[i].noConflict=()=>(e.fn[i]=n,t.jQueryInterface)}},"loading"===document.readyState?(f.length||document.addEventListener("DOMContentLoaded",(()=>{for(const t of f)t()})),f.push(e)):e()},g=(t,e=[],i=t)=>"function"==typeof t?t(...e):i,_=(t,e,n=!0)=>{if(!n)return void g(t);const o=(t=>{if(!t)return 0;let{transitionDuration:e,transitionDelay:i}=window.getComputedStyle(t);const n=Number.parseFloat(e),s=Number.parseFloat(i);return n||s?(e=e.split(",")[0],i=i.split(",")[0],1e3*(Number.parseFloat(e)+Number.parseFloat(i))):0})(e)+5;let r=!1;const a=({target:n})=>{n===e&&(r=!0,e.removeEventListener(i,a),g(t))};e.addEventListener(i,a),setTimeout((()=>{r||s(e)}),o)},b=(t,e,i,n)=>{const s=t.length;let o=t.indexOf(e);return-1===o?!i&&n?t[s-1]:t[0]:(o+=i?1:-1,n&&(o=(o+s)%s),t[Math.max(0,Math.min(o,s-1))])},v=/[^.]*(?=\..*)\.|.*/,y=/\..*/,w=/::\d+$/,A={};let E=1;const T={mouseenter:"mouseover",mouseleave:"mouseout"},C=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function O(t,e){return e&&`${e}::${E++}`||t.uidEvent||E++}function x(t){const e=O(t);return t.uidEvent=e,A[e]=A[e]||{},A[e]}function k(t,e,i=null){return Object.values(t).find((t=>t.callable===e&&t.delegationSelector===i))}function L(t,e,i){const n="string"==typeof e,s=n?i:e||i;let o=I(t);return C.has(o)||(o=t),[n,s,o]}function S(t,e,i,n,s){if("string"!=typeof e||!t)return;let[o,r,a]=L(e,i,n);if(e in T){const t=t=>function(e){if(!e.relatedTarget||e.relatedTarget!==e.delegateTarget&&!e.delegateTarget.contains(e.relatedTarget))return t.call(this,e)};r=t(r)}const l=x(t),c=l[a]||(l[a]={}),h=k(c,r,o?i:null);if(h)return void(h.oneOff=h.oneOff&&s);const d=O(r,e.replace(v,"")),u=o?function(t,e,i){return function n(s){const o=t.querySelectorAll(e);for(let{target:r}=s;r&&r!==this;r=r.parentNode)for(const a of o)if(a===r)return P(s,{delegateTarget:r}),n.oneOff&&N.off(t,s.type,e,i),i.apply(r,[s])}}(t,i,r):function(t,e){return function i(n){return P(n,{delegateTarget:t}),i.oneOff&&N.off(t,n.type,e),e.apply(t,[n])}}(t,r);u.delegationSelector=o?i:null,u.callable=r,u.oneOff=s,u.uidEvent=d,c[d]=u,t.addEventListener(a,u,o)}function D(t,e,i,n,s){const o=k(e[i],n,s);o&&(t.removeEventListener(i,o,Boolean(s)),delete e[i][o.uidEvent])}function $(t,e,i,n){const s=e[i]||{};for(const[o,r]of Object.entries(s))o.includes(n)&&D(t,e,i,r.callable,r.delegationSelector)}function I(t){return t=t.replace(y,""),T[t]||t}const N={on(t,e,i,n){S(t,e,i,n,!1)},one(t,e,i,n){S(t,e,i,n,!0)},off(t,e,i,n){if("string"!=typeof e||!t)return;const[s,o,r]=L(e,i,n),a=r!==e,l=x(t),c=l[r]||{},h=e.startsWith(".");if(void 0===o){if(h)for(const i of Object.keys(l))$(t,l,i,e.slice(1));for(const[i,n]of Object.entries(c)){const s=i.replace(w,"");a&&!e.includes(s)||D(t,l,r,n.callable,n.delegationSelector)}}else{if(!Object.keys(c).length)return;D(t,l,r,o,s?i:null)}},trigger(t,e,i){if("string"!=typeof e||!t)return null;const n=u();let s=null,o=!0,r=!0,a=!1;e!==I(e)&&n&&(s=n.Event(e,i),n(t).trigger(s),o=!s.isPropagationStopped(),r=!s.isImmediatePropagationStopped(),a=s.isDefaultPrevented());const l=P(new Event(e,{bubbles:o,cancelable:!0}),i);return a&&l.preventDefault(),r&&t.dispatchEvent(l),l.defaultPrevented&&s&&s.preventDefault(),l}};function P(t,e={}){for(const[i,n]of Object.entries(e))try{t[i]=n}catch(e){Object.defineProperty(t,i,{configurable:!0,get:()=>n})}return t}function M(t){if("true"===t)return!0;if("false"===t)return!1;if(t===Number(t).toString())return Number(t);if(""===t||"null"===t)return null;if("string"!=typeof t)return t;try{return JSON.parse(decodeURIComponent(t))}catch(e){return t}}function j(t){return t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}const F={setDataAttribute(t,e,i){t.setAttribute(`data-bs-${j(e)}`,i)},removeDataAttribute(t,e){t.removeAttribute(`data-bs-${j(e)}`)},getDataAttributes(t){if(!t)return{};const e={},i=Object.keys(t.dataset).filter((t=>t.startsWith("bs")&&!t.startsWith("bsConfig")));for(const n of i){let i=n.replace(/^bs/,"");i=i.charAt(0).toLowerCase()+i.slice(1,i.length),e[i]=M(t.dataset[n])}return e},getDataAttribute:(t,e)=>M(t.getAttribute(`data-bs-${j(e)}`))};class H{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(t){return t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t}_mergeConfigObj(t,e){const i=o(e)?F.getDataAttribute(e,"config"):{};return{...this.constructor.Default,..."object"==typeof i?i:{},...o(e)?F.getDataAttributes(e):{},..."object"==typeof t?t:{}}}_typeCheckConfig(t,e=this.constructor.DefaultType){for(const[n,s]of Object.entries(e)){const e=t[n],r=o(e)?"element":null==(i=e)?`${i}`:Object.prototype.toString.call(i).match(/\s([a-z]+)/i)[1].toLowerCase();if(!new RegExp(s).test(r))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${n}" provided type "${r}" but expected type "${s}".`)}var i}}class W extends H{constructor(t,i){super(),(t=r(t))&&(this._element=t,this._config=this._getConfig(i),e.set(this._element,this.constructor.DATA_KEY,this))}dispose(){e.remove(this._element,this.constructor.DATA_KEY),N.off(this._element,this.constructor.EVENT_KEY);for(const t of Object.getOwnPropertyNames(this))this[t]=null}_queueCallback(t,e,i=!0){_(t,e,i)}_getConfig(t){return t=this._mergeConfigObj(t,this._element),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}static getInstance(t){return e.get(r(t),this.DATA_KEY)}static getOrCreateInstance(t,e={}){return this.getInstance(t)||new this(t,"object"==typeof e?e:null)}static get VERSION(){return"5.3.2"}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(t){return`${t}${this.EVENT_KEY}`}}const B=t=>{let e=t.getAttribute("data-bs-target");if(!e||"#"===e){let i=t.getAttribute("href");if(!i||!i.includes("#")&&!i.startsWith("."))return null;i.includes("#")&&!i.startsWith("#")&&(i=`#${i.split("#")[1]}`),e=i&&"#"!==i?n(i.trim()):null}return e},z={find:(t,e=document.documentElement)=>[].concat(...Element.prototype.querySelectorAll.call(e,t)),findOne:(t,e=document.documentElement)=>Element.prototype.querySelector.call(e,t),children:(t,e)=>[].concat(...t.children).filter((t=>t.matches(e))),parents(t,e){const i=[];let n=t.parentNode.closest(e);for(;n;)i.push(n),n=n.parentNode.closest(e);return i},prev(t,e){let i=t.previousElementSibling;for(;i;){if(i.matches(e))return[i];i=i.previousElementSibling}return[]},next(t,e){let i=t.nextElementSibling;for(;i;){if(i.matches(e))return[i];i=i.nextElementSibling}return[]},focusableChildren(t){const e=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map((t=>`${t}:not([tabindex^="-"])`)).join(",");return this.find(e,t).filter((t=>!l(t)&&a(t)))},getSelectorFromElement(t){const e=B(t);return e&&z.findOne(e)?e:null},getElementFromSelector(t){const e=B(t);return e?z.findOne(e):null},getMultipleElementsFromSelector(t){const e=B(t);return e?z.find(e):[]}},R=(t,e="hide")=>{const i=`click.dismiss${t.EVENT_KEY}`,n=t.NAME;N.on(document,i,`[data-bs-dismiss="${n}"]`,(function(i){if(["A","AREA"].includes(this.tagName)&&i.preventDefault(),l(this))return;const s=z.getElementFromSelector(this)||this.closest(`.${n}`);t.getOrCreateInstance(s)[e]()}))},q=".bs.alert",V=`close${q}`,K=`closed${q}`;class Q extends W{static get NAME(){return"alert"}close(){if(N.trigger(this._element,V).defaultPrevented)return;this._element.classList.remove("show");const t=this._element.classList.contains("fade");this._queueCallback((()=>this._destroyElement()),this._element,t)}_destroyElement(){this._element.remove(),N.trigger(this._element,K),this.dispose()}static jQueryInterface(t){return this.each((function(){const e=Q.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}R(Q,"close"),m(Q);const X='[data-bs-toggle="button"]';class Y extends W{static get NAME(){return"button"}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle("active"))}static jQueryInterface(t){return this.each((function(){const e=Y.getOrCreateInstance(this);"toggle"===t&&e[t]()}))}}N.on(document,"click.bs.button.data-api",X,(t=>{t.preventDefault();const e=t.target.closest(X);Y.getOrCreateInstance(e).toggle()})),m(Y);const U=".bs.swipe",G=`touchstart${U}`,J=`touchmove${U}`,Z=`touchend${U}`,tt=`pointerdown${U}`,et=`pointerup${U}`,it={endCallback:null,leftCallback:null,rightCallback:null},nt={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class st extends H{constructor(t,e){super(),this._element=t,t&&st.isSupported()&&(this._config=this._getConfig(e),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents())}static get Default(){return it}static get DefaultType(){return nt}static get NAME(){return"swipe"}dispose(){N.off(this._element,U)}_start(t){this._supportPointerEvents?this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX):this._deltaX=t.touches[0].clientX}_end(t){this._eventIsPointerPenTouch(t)&&(this._deltaX=t.clientX-this._deltaX),this._handleSwipe(),g(this._config.endCallback)}_move(t){this._deltaX=t.touches&&t.touches.length>1?0:t.touches[0].clientX-this._deltaX}_handleSwipe(){const t=Math.abs(this._deltaX);if(t<=40)return;const e=t/this._deltaX;this._deltaX=0,e&&g(e>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(N.on(this._element,tt,(t=>this._start(t))),N.on(this._element,et,(t=>this._end(t))),this._element.classList.add("pointer-event")):(N.on(this._element,G,(t=>this._start(t))),N.on(this._element,J,(t=>this._move(t))),N.on(this._element,Z,(t=>this._end(t))))}_eventIsPointerPenTouch(t){return this._supportPointerEvents&&("pen"===t.pointerType||"touch"===t.pointerType)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const ot=".bs.carousel",rt=".data-api",at="next",lt="prev",ct="left",ht="right",dt=`slide${ot}`,ut=`slid${ot}`,ft=`keydown${ot}`,pt=`mouseenter${ot}`,mt=`mouseleave${ot}`,gt=`dragstart${ot}`,_t=`load${ot}${rt}`,bt=`click${ot}${rt}`,vt="carousel",yt="active",wt=".active",At=".carousel-item",Et=wt+At,Tt={ArrowLeft:ht,ArrowRight:ct},Ct={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},Ot={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class xt extends W{constructor(t,e){super(t,e),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=z.findOne(".carousel-indicators",this._element),this._addEventListeners(),this._config.ride===vt&&this.cycle()}static get Default(){return Ct}static get DefaultType(){return Ot}static get NAME(){return"carousel"}next(){this._slide(at)}nextWhenVisible(){!document.hidden&&a(this._element)&&this.next()}prev(){this._slide(lt)}pause(){this._isSliding&&s(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval((()=>this.nextWhenVisible()),this._config.interval)}_maybeEnableCycle(){this._config.ride&&(this._isSliding?N.one(this._element,ut,(()=>this.cycle())):this.cycle())}to(t){const e=this._getItems();if(t>e.length-1||t<0)return;if(this._isSliding)return void N.one(this._element,ut,(()=>this.to(t)));const i=this._getItemIndex(this._getActive());if(i===t)return;const n=t>i?at:lt;this._slide(n,e[t])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(t){return t.defaultInterval=t.interval,t}_addEventListeners(){this._config.keyboard&&N.on(this._element,ft,(t=>this._keydown(t))),"hover"===this._config.pause&&(N.on(this._element,pt,(()=>this.pause())),N.on(this._element,mt,(()=>this._maybeEnableCycle()))),this._config.touch&&st.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const t of z.find(".carousel-item img",this._element))N.on(t,gt,(t=>t.preventDefault()));const t={leftCallback:()=>this._slide(this._directionToOrder(ct)),rightCallback:()=>this._slide(this._directionToOrder(ht)),endCallback:()=>{"hover"===this._config.pause&&(this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout((()=>this._maybeEnableCycle()),500+this._config.interval))}};this._swipeHelper=new st(this._element,t)}_keydown(t){if(/input|textarea/i.test(t.target.tagName))return;const e=Tt[t.key];e&&(t.preventDefault(),this._slide(this._directionToOrder(e)))}_getItemIndex(t){return this._getItems().indexOf(t)}_setActiveIndicatorElement(t){if(!this._indicatorsElement)return;const e=z.findOne(wt,this._indicatorsElement);e.classList.remove(yt),e.removeAttribute("aria-current");const i=z.findOne(`[data-bs-slide-to="${t}"]`,this._indicatorsElement);i&&(i.classList.add(yt),i.setAttribute("aria-current","true"))}_updateInterval(){const t=this._activeElement||this._getActive();if(!t)return;const e=Number.parseInt(t.getAttribute("data-bs-interval"),10);this._config.interval=e||this._config.defaultInterval}_slide(t,e=null){if(this._isSliding)return;const i=this._getActive(),n=t===at,s=e||b(this._getItems(),i,n,this._config.wrap);if(s===i)return;const o=this._getItemIndex(s),r=e=>N.trigger(this._element,e,{relatedTarget:s,direction:this._orderToDirection(t),from:this._getItemIndex(i),to:o});if(r(dt).defaultPrevented)return;if(!i||!s)return;const a=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(o),this._activeElement=s;const l=n?"carousel-item-start":"carousel-item-end",c=n?"carousel-item-next":"carousel-item-prev";s.classList.add(c),d(s),i.classList.add(l),s.classList.add(l),this._queueCallback((()=>{s.classList.remove(l,c),s.classList.add(yt),i.classList.remove(yt,c,l),this._isSliding=!1,r(ut)}),i,this._isAnimated()),a&&this.cycle()}_isAnimated(){return this._element.classList.contains("slide")}_getActive(){return z.findOne(Et,this._element)}_getItems(){return z.find(At,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(t){return p()?t===ct?lt:at:t===ct?at:lt}_orderToDirection(t){return p()?t===lt?ct:ht:t===lt?ht:ct}static jQueryInterface(t){return this.each((function(){const e=xt.getOrCreateInstance(this,t);if("number"!=typeof t){if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}else e.to(t)}))}}N.on(document,bt,"[data-bs-slide], [data-bs-slide-to]",(function(t){const e=z.getElementFromSelector(this);if(!e||!e.classList.contains(vt))return;t.preventDefault();const i=xt.getOrCreateInstance(e),n=this.getAttribute("data-bs-slide-to");return n?(i.to(n),void i._maybeEnableCycle()):"next"===F.getDataAttribute(this,"slide")?(i.next(),void i._maybeEnableCycle()):(i.prev(),void i._maybeEnableCycle())})),N.on(window,_t,(()=>{const t=z.find('[data-bs-ride="carousel"]');for(const e of t)xt.getOrCreateInstance(e)})),m(xt);const kt=".bs.collapse",Lt=`show${kt}`,St=`shown${kt}`,Dt=`hide${kt}`,$t=`hidden${kt}`,It=`click${kt}.data-api`,Nt="show",Pt="collapse",Mt="collapsing",jt=`:scope .${Pt} .${Pt}`,Ft='[data-bs-toggle="collapse"]',Ht={parent:null,toggle:!0},Wt={parent:"(null|element)",toggle:"boolean"};class Bt extends W{constructor(t,e){super(t,e),this._isTransitioning=!1,this._triggerArray=[];const i=z.find(Ft);for(const t of i){const e=z.getSelectorFromElement(t),i=z.find(e).filter((t=>t===this._element));null!==e&&i.length&&this._triggerArray.push(t)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Ht}static get DefaultType(){return Wt}static get NAME(){return"collapse"}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let t=[];if(this._config.parent&&(t=this._getFirstLevelChildren(".collapse.show, .collapse.collapsing").filter((t=>t!==this._element)).map((t=>Bt.getOrCreateInstance(t,{toggle:!1})))),t.length&&t[0]._isTransitioning)return;if(N.trigger(this._element,Lt).defaultPrevented)return;for(const e of t)e.hide();const e=this._getDimension();this._element.classList.remove(Pt),this._element.classList.add(Mt),this._element.style[e]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const i=`scroll${e[0].toUpperCase()+e.slice(1)}`;this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt,Nt),this._element.style[e]="",N.trigger(this._element,St)}),this._element,!0),this._element.style[e]=`${this._element[i]}px`}hide(){if(this._isTransitioning||!this._isShown())return;if(N.trigger(this._element,Dt).defaultPrevented)return;const t=this._getDimension();this._element.style[t]=`${this._element.getBoundingClientRect()[t]}px`,d(this._element),this._element.classList.add(Mt),this._element.classList.remove(Pt,Nt);for(const t of this._triggerArray){const e=z.getElementFromSelector(t);e&&!this._isShown(e)&&this._addAriaAndCollapsedClass([t],!1)}this._isTransitioning=!0,this._element.style[t]="",this._queueCallback((()=>{this._isTransitioning=!1,this._element.classList.remove(Mt),this._element.classList.add(Pt),N.trigger(this._element,$t)}),this._element,!0)}_isShown(t=this._element){return t.classList.contains(Nt)}_configAfterMerge(t){return t.toggle=Boolean(t.toggle),t.parent=r(t.parent),t}_getDimension(){return this._element.classList.contains("collapse-horizontal")?"width":"height"}_initializeChildren(){if(!this._config.parent)return;const t=this._getFirstLevelChildren(Ft);for(const e of t){const t=z.getElementFromSelector(e);t&&this._addAriaAndCollapsedClass([e],this._isShown(t))}}_getFirstLevelChildren(t){const e=z.find(jt,this._config.parent);return z.find(t,this._config.parent).filter((t=>!e.includes(t)))}_addAriaAndCollapsedClass(t,e){if(t.length)for(const i of t)i.classList.toggle("collapsed",!e),i.setAttribute("aria-expanded",e)}static jQueryInterface(t){const e={};return"string"==typeof t&&/show|hide/.test(t)&&(e.toggle=!1),this.each((function(){const i=Bt.getOrCreateInstance(this,e);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t]()}}))}}N.on(document,It,Ft,(function(t){("A"===t.target.tagName||t.delegateTarget&&"A"===t.delegateTarget.tagName)&&t.preventDefault();for(const t of z.getMultipleElementsFromSelector(this))Bt.getOrCreateInstance(t,{toggle:!1}).toggle()})),m(Bt);var zt="top",Rt="bottom",qt="right",Vt="left",Kt="auto",Qt=[zt,Rt,qt,Vt],Xt="start",Yt="end",Ut="clippingParents",Gt="viewport",Jt="popper",Zt="reference",te=Qt.reduce((function(t,e){return t.concat([e+"-"+Xt,e+"-"+Yt])}),[]),ee=[].concat(Qt,[Kt]).reduce((function(t,e){return t.concat([e,e+"-"+Xt,e+"-"+Yt])}),[]),ie="beforeRead",ne="read",se="afterRead",oe="beforeMain",re="main",ae="afterMain",le="beforeWrite",ce="write",he="afterWrite",de=[ie,ne,se,oe,re,ae,le,ce,he];function ue(t){return t?(t.nodeName||"").toLowerCase():null}function fe(t){if(null==t)return window;if("[object Window]"!==t.toString()){var e=t.ownerDocument;return e&&e.defaultView||window}return t}function pe(t){return t instanceof fe(t).Element||t instanceof Element}function me(t){return t instanceof fe(t).HTMLElement||t instanceof HTMLElement}function ge(t){return"undefined"!=typeof ShadowRoot&&(t instanceof fe(t).ShadowRoot||t instanceof ShadowRoot)}const _e={name:"applyStyles",enabled:!0,phase:"write",fn:function(t){var e=t.state;Object.keys(e.elements).forEach((function(t){var i=e.styles[t]||{},n=e.attributes[t]||{},s=e.elements[t];me(s)&&ue(s)&&(Object.assign(s.style,i),Object.keys(n).forEach((function(t){var e=n[t];!1===e?s.removeAttribute(t):s.setAttribute(t,!0===e?"":e)})))}))},effect:function(t){var e=t.state,i={popper:{position:e.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(e.elements.popper.style,i.popper),e.styles=i,e.elements.arrow&&Object.assign(e.elements.arrow.style,i.arrow),function(){Object.keys(e.elements).forEach((function(t){var n=e.elements[t],s=e.attributes[t]||{},o=Object.keys(e.styles.hasOwnProperty(t)?e.styles[t]:i[t]).reduce((function(t,e){return t[e]="",t}),{});me(n)&&ue(n)&&(Object.assign(n.style,o),Object.keys(s).forEach((function(t){n.removeAttribute(t)})))}))}},requires:["computeStyles"]};function be(t){return t.split("-")[0]}var ve=Math.max,ye=Math.min,we=Math.round;function Ae(){var t=navigator.userAgentData;return null!=t&&t.brands&&Array.isArray(t.brands)?t.brands.map((function(t){return t.brand+"/"+t.version})).join(" "):navigator.userAgent}function Ee(){return!/^((?!chrome|android).)*safari/i.test(Ae())}function Te(t,e,i){void 0===e&&(e=!1),void 0===i&&(i=!1);var n=t.getBoundingClientRect(),s=1,o=1;e&&me(t)&&(s=t.offsetWidth>0&&we(n.width)/t.offsetWidth||1,o=t.offsetHeight>0&&we(n.height)/t.offsetHeight||1);var r=(pe(t)?fe(t):window).visualViewport,a=!Ee()&&i,l=(n.left+(a&&r?r.offsetLeft:0))/s,c=(n.top+(a&&r?r.offsetTop:0))/o,h=n.width/s,d=n.height/o;return{width:h,height:d,top:c,right:l+h,bottom:c+d,left:l,x:l,y:c}}function Ce(t){var e=Te(t),i=t.offsetWidth,n=t.offsetHeight;return Math.abs(e.width-i)<=1&&(i=e.width),Math.abs(e.height-n)<=1&&(n=e.height),{x:t.offsetLeft,y:t.offsetTop,width:i,height:n}}function Oe(t,e){var i=e.getRootNode&&e.getRootNode();if(t.contains(e))return!0;if(i&&ge(i)){var n=e;do{if(n&&t.isSameNode(n))return!0;n=n.parentNode||n.host}while(n)}return!1}function xe(t){return fe(t).getComputedStyle(t)}function ke(t){return["table","td","th"].indexOf(ue(t))>=0}function Le(t){return((pe(t)?t.ownerDocument:t.document)||window.document).documentElement}function Se(t){return"html"===ue(t)?t:t.assignedSlot||t.parentNode||(ge(t)?t.host:null)||Le(t)}function De(t){return me(t)&&"fixed"!==xe(t).position?t.offsetParent:null}function $e(t){for(var e=fe(t),i=De(t);i&&ke(i)&&"static"===xe(i).position;)i=De(i);return i&&("html"===ue(i)||"body"===ue(i)&&"static"===xe(i).position)?e:i||function(t){var e=/firefox/i.test(Ae());if(/Trident/i.test(Ae())&&me(t)&&"fixed"===xe(t).position)return null;var i=Se(t);for(ge(i)&&(i=i.host);me(i)&&["html","body"].indexOf(ue(i))<0;){var n=xe(i);if("none"!==n.transform||"none"!==n.perspective||"paint"===n.contain||-1!==["transform","perspective"].indexOf(n.willChange)||e&&"filter"===n.willChange||e&&n.filter&&"none"!==n.filter)return i;i=i.parentNode}return null}(t)||e}function Ie(t){return["top","bottom"].indexOf(t)>=0?"x":"y"}function Ne(t,e,i){return ve(t,ye(e,i))}function Pe(t){return Object.assign({},{top:0,right:0,bottom:0,left:0},t)}function Me(t,e){return e.reduce((function(e,i){return e[i]=t,e}),{})}const je={name:"arrow",enabled:!0,phase:"main",fn:function(t){var e,i=t.state,n=t.name,s=t.options,o=i.elements.arrow,r=i.modifiersData.popperOffsets,a=be(i.placement),l=Ie(a),c=[Vt,qt].indexOf(a)>=0?"height":"width";if(o&&r){var h=function(t,e){return Pe("number"!=typeof(t="function"==typeof t?t(Object.assign({},e.rects,{placement:e.placement})):t)?t:Me(t,Qt))}(s.padding,i),d=Ce(o),u="y"===l?zt:Vt,f="y"===l?Rt:qt,p=i.rects.reference[c]+i.rects.reference[l]-r[l]-i.rects.popper[c],m=r[l]-i.rects.reference[l],g=$e(o),_=g?"y"===l?g.clientHeight||0:g.clientWidth||0:0,b=p/2-m/2,v=h[u],y=_-d[c]-h[f],w=_/2-d[c]/2+b,A=Ne(v,w,y),E=l;i.modifiersData[n]=((e={})[E]=A,e.centerOffset=A-w,e)}},effect:function(t){var e=t.state,i=t.options.element,n=void 0===i?"[data-popper-arrow]":i;null!=n&&("string"!=typeof n||(n=e.elements.popper.querySelector(n)))&&Oe(e.elements.popper,n)&&(e.elements.arrow=n)},requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function Fe(t){return t.split("-")[1]}var He={top:"auto",right:"auto",bottom:"auto",left:"auto"};function We(t){var e,i=t.popper,n=t.popperRect,s=t.placement,o=t.variation,r=t.offsets,a=t.position,l=t.gpuAcceleration,c=t.adaptive,h=t.roundOffsets,d=t.isFixed,u=r.x,f=void 0===u?0:u,p=r.y,m=void 0===p?0:p,g="function"==typeof h?h({x:f,y:m}):{x:f,y:m};f=g.x,m=g.y;var _=r.hasOwnProperty("x"),b=r.hasOwnProperty("y"),v=Vt,y=zt,w=window;if(c){var A=$e(i),E="clientHeight",T="clientWidth";A===fe(i)&&"static"!==xe(A=Le(i)).position&&"absolute"===a&&(E="scrollHeight",T="scrollWidth"),(s===zt||(s===Vt||s===qt)&&o===Yt)&&(y=Rt,m-=(d&&A===w&&w.visualViewport?w.visualViewport.height:A[E])-n.height,m*=l?1:-1),s!==Vt&&(s!==zt&&s!==Rt||o!==Yt)||(v=qt,f-=(d&&A===w&&w.visualViewport?w.visualViewport.width:A[T])-n.width,f*=l?1:-1)}var C,O=Object.assign({position:a},c&&He),x=!0===h?function(t,e){var i=t.x,n=t.y,s=e.devicePixelRatio||1;return{x:we(i*s)/s||0,y:we(n*s)/s||0}}({x:f,y:m},fe(i)):{x:f,y:m};return f=x.x,m=x.y,l?Object.assign({},O,((C={})[y]=b?"0":"",C[v]=_?"0":"",C.transform=(w.devicePixelRatio||1)<=1?"translate("+f+"px, "+m+"px)":"translate3d("+f+"px, "+m+"px, 0)",C)):Object.assign({},O,((e={})[y]=b?m+"px":"",e[v]=_?f+"px":"",e.transform="",e))}const Be={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:function(t){var e=t.state,i=t.options,n=i.gpuAcceleration,s=void 0===n||n,o=i.adaptive,r=void 0===o||o,a=i.roundOffsets,l=void 0===a||a,c={placement:be(e.placement),variation:Fe(e.placement),popper:e.elements.popper,popperRect:e.rects.popper,gpuAcceleration:s,isFixed:"fixed"===e.options.strategy};null!=e.modifiersData.popperOffsets&&(e.styles.popper=Object.assign({},e.styles.popper,We(Object.assign({},c,{offsets:e.modifiersData.popperOffsets,position:e.options.strategy,adaptive:r,roundOffsets:l})))),null!=e.modifiersData.arrow&&(e.styles.arrow=Object.assign({},e.styles.arrow,We(Object.assign({},c,{offsets:e.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets:l})))),e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-placement":e.placement})},data:{}};var ze={passive:!0};const Re={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect:function(t){var e=t.state,i=t.instance,n=t.options,s=n.scroll,o=void 0===s||s,r=n.resize,a=void 0===r||r,l=fe(e.elements.popper),c=[].concat(e.scrollParents.reference,e.scrollParents.popper);return o&&c.forEach((function(t){t.addEventListener("scroll",i.update,ze)})),a&&l.addEventListener("resize",i.update,ze),function(){o&&c.forEach((function(t){t.removeEventListener("scroll",i.update,ze)})),a&&l.removeEventListener("resize",i.update,ze)}},data:{}};var qe={left:"right",right:"left",bottom:"top",top:"bottom"};function Ve(t){return t.replace(/left|right|bottom|top/g,(function(t){return qe[t]}))}var Ke={start:"end",end:"start"};function Qe(t){return t.replace(/start|end/g,(function(t){return Ke[t]}))}function Xe(t){var e=fe(t);return{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function Ye(t){return Te(Le(t)).left+Xe(t).scrollLeft}function Ue(t){var e=xe(t),i=e.overflow,n=e.overflowX,s=e.overflowY;return/auto|scroll|overlay|hidden/.test(i+s+n)}function Ge(t){return["html","body","#document"].indexOf(ue(t))>=0?t.ownerDocument.body:me(t)&&Ue(t)?t:Ge(Se(t))}function Je(t,e){var i;void 0===e&&(e=[]);var n=Ge(t),s=n===(null==(i=t.ownerDocument)?void 0:i.body),o=fe(n),r=s?[o].concat(o.visualViewport||[],Ue(n)?n:[]):n,a=e.concat(r);return s?a:a.concat(Je(Se(r)))}function Ze(t){return Object.assign({},t,{left:t.x,top:t.y,right:t.x+t.width,bottom:t.y+t.height})}function ti(t,e,i){return e===Gt?Ze(function(t,e){var i=fe(t),n=Le(t),s=i.visualViewport,o=n.clientWidth,r=n.clientHeight,a=0,l=0;if(s){o=s.width,r=s.height;var c=Ee();(c||!c&&"fixed"===e)&&(a=s.offsetLeft,l=s.offsetTop)}return{width:o,height:r,x:a+Ye(t),y:l}}(t,i)):pe(e)?function(t,e){var i=Te(t,!1,"fixed"===e);return i.top=i.top+t.clientTop,i.left=i.left+t.clientLeft,i.bottom=i.top+t.clientHeight,i.right=i.left+t.clientWidth,i.width=t.clientWidth,i.height=t.clientHeight,i.x=i.left,i.y=i.top,i}(e,i):Ze(function(t){var e,i=Le(t),n=Xe(t),s=null==(e=t.ownerDocument)?void 0:e.body,o=ve(i.scrollWidth,i.clientWidth,s?s.scrollWidth:0,s?s.clientWidth:0),r=ve(i.scrollHeight,i.clientHeight,s?s.scrollHeight:0,s?s.clientHeight:0),a=-n.scrollLeft+Ye(t),l=-n.scrollTop;return"rtl"===xe(s||i).direction&&(a+=ve(i.clientWidth,s?s.clientWidth:0)-o),{width:o,height:r,x:a,y:l}}(Le(t)))}function ei(t){var e,i=t.reference,n=t.element,s=t.placement,o=s?be(s):null,r=s?Fe(s):null,a=i.x+i.width/2-n.width/2,l=i.y+i.height/2-n.height/2;switch(o){case zt:e={x:a,y:i.y-n.height};break;case Rt:e={x:a,y:i.y+i.height};break;case qt:e={x:i.x+i.width,y:l};break;case Vt:e={x:i.x-n.width,y:l};break;default:e={x:i.x,y:i.y}}var c=o?Ie(o):null;if(null!=c){var h="y"===c?"height":"width";switch(r){case Xt:e[c]=e[c]-(i[h]/2-n[h]/2);break;case Yt:e[c]=e[c]+(i[h]/2-n[h]/2)}}return e}function ii(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=void 0===n?t.placement:n,o=i.strategy,r=void 0===o?t.strategy:o,a=i.boundary,l=void 0===a?Ut:a,c=i.rootBoundary,h=void 0===c?Gt:c,d=i.elementContext,u=void 0===d?Jt:d,f=i.altBoundary,p=void 0!==f&&f,m=i.padding,g=void 0===m?0:m,_=Pe("number"!=typeof g?g:Me(g,Qt)),b=u===Jt?Zt:Jt,v=t.rects.popper,y=t.elements[p?b:u],w=function(t,e,i,n){var s="clippingParents"===e?function(t){var e=Je(Se(t)),i=["absolute","fixed"].indexOf(xe(t).position)>=0&&me(t)?$e(t):t;return pe(i)?e.filter((function(t){return pe(t)&&Oe(t,i)&&"body"!==ue(t)})):[]}(t):[].concat(e),o=[].concat(s,[i]),r=o[0],a=o.reduce((function(e,i){var s=ti(t,i,n);return e.top=ve(s.top,e.top),e.right=ye(s.right,e.right),e.bottom=ye(s.bottom,e.bottom),e.left=ve(s.left,e.left),e}),ti(t,r,n));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}(pe(y)?y:y.contextElement||Le(t.elements.popper),l,h,r),A=Te(t.elements.reference),E=ei({reference:A,element:v,strategy:"absolute",placement:s}),T=Ze(Object.assign({},v,E)),C=u===Jt?T:A,O={top:w.top-C.top+_.top,bottom:C.bottom-w.bottom+_.bottom,left:w.left-C.left+_.left,right:C.right-w.right+_.right},x=t.modifiersData.offset;if(u===Jt&&x){var k=x[s];Object.keys(O).forEach((function(t){var e=[qt,Rt].indexOf(t)>=0?1:-1,i=[zt,Rt].indexOf(t)>=0?"y":"x";O[t]+=k[i]*e}))}return O}function ni(t,e){void 0===e&&(e={});var i=e,n=i.placement,s=i.boundary,o=i.rootBoundary,r=i.padding,a=i.flipVariations,l=i.allowedAutoPlacements,c=void 0===l?ee:l,h=Fe(n),d=h?a?te:te.filter((function(t){return Fe(t)===h})):Qt,u=d.filter((function(t){return c.indexOf(t)>=0}));0===u.length&&(u=d);var f=u.reduce((function(e,i){return e[i]=ii(t,{placement:i,boundary:s,rootBoundary:o,padding:r})[be(i)],e}),{});return Object.keys(f).sort((function(t,e){return f[t]-f[e]}))}const si={name:"flip",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name;if(!e.modifiersData[n]._skip){for(var s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0===r||r,l=i.fallbackPlacements,c=i.padding,h=i.boundary,d=i.rootBoundary,u=i.altBoundary,f=i.flipVariations,p=void 0===f||f,m=i.allowedAutoPlacements,g=e.options.placement,_=be(g),b=l||(_!==g&&p?function(t){if(be(t)===Kt)return[];var e=Ve(t);return[Qe(t),e,Qe(e)]}(g):[Ve(g)]),v=[g].concat(b).reduce((function(t,i){return t.concat(be(i)===Kt?ni(e,{placement:i,boundary:h,rootBoundary:d,padding:c,flipVariations:p,allowedAutoPlacements:m}):i)}),[]),y=e.rects.reference,w=e.rects.popper,A=new Map,E=!0,T=v[0],C=0;C=0,S=L?"width":"height",D=ii(e,{placement:O,boundary:h,rootBoundary:d,altBoundary:u,padding:c}),$=L?k?qt:Vt:k?Rt:zt;y[S]>w[S]&&($=Ve($));var I=Ve($),N=[];if(o&&N.push(D[x]<=0),a&&N.push(D[$]<=0,D[I]<=0),N.every((function(t){return t}))){T=O,E=!1;break}A.set(O,N)}if(E)for(var P=function(t){var e=v.find((function(e){var i=A.get(e);if(i)return i.slice(0,t).every((function(t){return t}))}));if(e)return T=e,"break"},M=p?3:1;M>0&&"break"!==P(M);M--);e.placement!==T&&(e.modifiersData[n]._skip=!0,e.placement=T,e.reset=!0)}},requiresIfExists:["offset"],data:{_skip:!1}};function oi(t,e,i){return void 0===i&&(i={x:0,y:0}),{top:t.top-e.height-i.y,right:t.right-e.width+i.x,bottom:t.bottom-e.height+i.y,left:t.left-e.width-i.x}}function ri(t){return[zt,qt,Rt,Vt].some((function(e){return t[e]>=0}))}const ai={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:function(t){var e=t.state,i=t.name,n=e.rects.reference,s=e.rects.popper,o=e.modifiersData.preventOverflow,r=ii(e,{elementContext:"reference"}),a=ii(e,{altBoundary:!0}),l=oi(r,n),c=oi(a,s,o),h=ri(l),d=ri(c);e.modifiersData[i]={referenceClippingOffsets:l,popperEscapeOffsets:c,isReferenceHidden:h,hasPopperEscaped:d},e.attributes.popper=Object.assign({},e.attributes.popper,{"data-popper-reference-hidden":h,"data-popper-escaped":d})}},li={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.offset,o=void 0===s?[0,0]:s,r=ee.reduce((function(t,i){return t[i]=function(t,e,i){var n=be(t),s=[Vt,zt].indexOf(n)>=0?-1:1,o="function"==typeof i?i(Object.assign({},e,{placement:t})):i,r=o[0],a=o[1];return r=r||0,a=(a||0)*s,[Vt,qt].indexOf(n)>=0?{x:a,y:r}:{x:r,y:a}}(i,e.rects,o),t}),{}),a=r[e.placement],l=a.x,c=a.y;null!=e.modifiersData.popperOffsets&&(e.modifiersData.popperOffsets.x+=l,e.modifiersData.popperOffsets.y+=c),e.modifiersData[n]=r}},ci={name:"popperOffsets",enabled:!0,phase:"read",fn:function(t){var e=t.state,i=t.name;e.modifiersData[i]=ei({reference:e.rects.reference,element:e.rects.popper,strategy:"absolute",placement:e.placement})},data:{}},hi={name:"preventOverflow",enabled:!0,phase:"main",fn:function(t){var e=t.state,i=t.options,n=t.name,s=i.mainAxis,o=void 0===s||s,r=i.altAxis,a=void 0!==r&&r,l=i.boundary,c=i.rootBoundary,h=i.altBoundary,d=i.padding,u=i.tether,f=void 0===u||u,p=i.tetherOffset,m=void 0===p?0:p,g=ii(e,{boundary:l,rootBoundary:c,padding:d,altBoundary:h}),_=be(e.placement),b=Fe(e.placement),v=!b,y=Ie(_),w="x"===y?"y":"x",A=e.modifiersData.popperOffsets,E=e.rects.reference,T=e.rects.popper,C="function"==typeof m?m(Object.assign({},e.rects,{placement:e.placement})):m,O="number"==typeof C?{mainAxis:C,altAxis:C}:Object.assign({mainAxis:0,altAxis:0},C),x=e.modifiersData.offset?e.modifiersData.offset[e.placement]:null,k={x:0,y:0};if(A){if(o){var L,S="y"===y?zt:Vt,D="y"===y?Rt:qt,$="y"===y?"height":"width",I=A[y],N=I+g[S],P=I-g[D],M=f?-T[$]/2:0,j=b===Xt?E[$]:T[$],F=b===Xt?-T[$]:-E[$],H=e.elements.arrow,W=f&&H?Ce(H):{width:0,height:0},B=e.modifiersData["arrow#persistent"]?e.modifiersData["arrow#persistent"].padding:{top:0,right:0,bottom:0,left:0},z=B[S],R=B[D],q=Ne(0,E[$],W[$]),V=v?E[$]/2-M-q-z-O.mainAxis:j-q-z-O.mainAxis,K=v?-E[$]/2+M+q+R+O.mainAxis:F+q+R+O.mainAxis,Q=e.elements.arrow&&$e(e.elements.arrow),X=Q?"y"===y?Q.clientTop||0:Q.clientLeft||0:0,Y=null!=(L=null==x?void 0:x[y])?L:0,U=I+K-Y,G=Ne(f?ye(N,I+V-Y-X):N,I,f?ve(P,U):P);A[y]=G,k[y]=G-I}if(a){var J,Z="x"===y?zt:Vt,tt="x"===y?Rt:qt,et=A[w],it="y"===w?"height":"width",nt=et+g[Z],st=et-g[tt],ot=-1!==[zt,Vt].indexOf(_),rt=null!=(J=null==x?void 0:x[w])?J:0,at=ot?nt:et-E[it]-T[it]-rt+O.altAxis,lt=ot?et+E[it]+T[it]-rt-O.altAxis:st,ct=f&&ot?function(t,e,i){var n=Ne(t,e,i);return n>i?i:n}(at,et,lt):Ne(f?at:nt,et,f?lt:st);A[w]=ct,k[w]=ct-et}e.modifiersData[n]=k}},requiresIfExists:["offset"]};function di(t,e,i){void 0===i&&(i=!1);var n,s,o=me(e),r=me(e)&&function(t){var e=t.getBoundingClientRect(),i=we(e.width)/t.offsetWidth||1,n=we(e.height)/t.offsetHeight||1;return 1!==i||1!==n}(e),a=Le(e),l=Te(t,r,i),c={scrollLeft:0,scrollTop:0},h={x:0,y:0};return(o||!o&&!i)&&(("body"!==ue(e)||Ue(a))&&(c=(n=e)!==fe(n)&&me(n)?{scrollLeft:(s=n).scrollLeft,scrollTop:s.scrollTop}:Xe(n)),me(e)?((h=Te(e,!0)).x+=e.clientLeft,h.y+=e.clientTop):a&&(h.x=Ye(a))),{x:l.left+c.scrollLeft-h.x,y:l.top+c.scrollTop-h.y,width:l.width,height:l.height}}function ui(t){var e=new Map,i=new Set,n=[];function s(t){i.add(t.name),[].concat(t.requires||[],t.requiresIfExists||[]).forEach((function(t){if(!i.has(t)){var n=e.get(t);n&&s(n)}})),n.push(t)}return t.forEach((function(t){e.set(t.name,t)})),t.forEach((function(t){i.has(t.name)||s(t)})),n}var fi={placement:"bottom",modifiers:[],strategy:"absolute"};function pi(){for(var t=arguments.length,e=new Array(t),i=0;iNumber.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_getPopperConfig(){const t={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||"static"===this._config.display)&&(F.setDataAttribute(this._menu,"popper","static"),t.modifiers=[{name:"applyStyles",enabled:!1}]),{...t,...g(this._config.popperConfig,[t])}}_selectMenuItem({key:t,target:e}){const i=z.find(".dropdown-menu .dropdown-item:not(.disabled):not(:disabled)",this._menu).filter((t=>a(t)));i.length&&b(i,e,t===Ti,!i.includes(e)).focus()}static jQueryInterface(t){return this.each((function(){const e=qi.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}static clearMenus(t){if(2===t.button||"keyup"===t.type&&"Tab"!==t.key)return;const e=z.find(Ni);for(const i of e){const e=qi.getInstance(i);if(!e||!1===e._config.autoClose)continue;const n=t.composedPath(),s=n.includes(e._menu);if(n.includes(e._element)||"inside"===e._config.autoClose&&!s||"outside"===e._config.autoClose&&s)continue;if(e._menu.contains(t.target)&&("keyup"===t.type&&"Tab"===t.key||/input|select|option|textarea|form/i.test(t.target.tagName)))continue;const o={relatedTarget:e._element};"click"===t.type&&(o.clickEvent=t),e._completeHide(o)}}static dataApiKeydownHandler(t){const e=/input|textarea/i.test(t.target.tagName),i="Escape"===t.key,n=[Ei,Ti].includes(t.key);if(!n&&!i)return;if(e&&!i)return;t.preventDefault();const s=this.matches(Ii)?this:z.prev(this,Ii)[0]||z.next(this,Ii)[0]||z.findOne(Ii,t.delegateTarget.parentNode),o=qi.getOrCreateInstance(s);if(n)return t.stopPropagation(),o.show(),void o._selectMenuItem(t);o._isShown()&&(t.stopPropagation(),o.hide(),s.focus())}}N.on(document,Si,Ii,qi.dataApiKeydownHandler),N.on(document,Si,Pi,qi.dataApiKeydownHandler),N.on(document,Li,qi.clearMenus),N.on(document,Di,qi.clearMenus),N.on(document,Li,Ii,(function(t){t.preventDefault(),qi.getOrCreateInstance(this).toggle()})),m(qi);const Vi="backdrop",Ki="show",Qi=`mousedown.bs.${Vi}`,Xi={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},Yi={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Ui extends H{constructor(t){super(),this._config=this._getConfig(t),this._isAppended=!1,this._element=null}static get Default(){return Xi}static get DefaultType(){return Yi}static get NAME(){return Vi}show(t){if(!this._config.isVisible)return void g(t);this._append();const e=this._getElement();this._config.isAnimated&&d(e),e.classList.add(Ki),this._emulateAnimation((()=>{g(t)}))}hide(t){this._config.isVisible?(this._getElement().classList.remove(Ki),this._emulateAnimation((()=>{this.dispose(),g(t)}))):g(t)}dispose(){this._isAppended&&(N.off(this._element,Qi),this._element.remove(),this._isAppended=!1)}_getElement(){if(!this._element){const t=document.createElement("div");t.className=this._config.className,this._config.isAnimated&&t.classList.add("fade"),this._element=t}return this._element}_configAfterMerge(t){return t.rootElement=r(t.rootElement),t}_append(){if(this._isAppended)return;const t=this._getElement();this._config.rootElement.append(t),N.on(t,Qi,(()=>{g(this._config.clickCallback)})),this._isAppended=!0}_emulateAnimation(t){_(t,this._getElement(),this._config.isAnimated)}}const Gi=".bs.focustrap",Ji=`focusin${Gi}`,Zi=`keydown.tab${Gi}`,tn="backward",en={autofocus:!0,trapElement:null},nn={autofocus:"boolean",trapElement:"element"};class sn extends H{constructor(t){super(),this._config=this._getConfig(t),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return en}static get DefaultType(){return nn}static get NAME(){return"focustrap"}activate(){this._isActive||(this._config.autofocus&&this._config.trapElement.focus(),N.off(document,Gi),N.on(document,Ji,(t=>this._handleFocusin(t))),N.on(document,Zi,(t=>this._handleKeydown(t))),this._isActive=!0)}deactivate(){this._isActive&&(this._isActive=!1,N.off(document,Gi))}_handleFocusin(t){const{trapElement:e}=this._config;if(t.target===document||t.target===e||e.contains(t.target))return;const i=z.focusableChildren(e);0===i.length?e.focus():this._lastTabNavDirection===tn?i[i.length-1].focus():i[0].focus()}_handleKeydown(t){"Tab"===t.key&&(this._lastTabNavDirection=t.shiftKey?tn:"forward")}}const on=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",rn=".sticky-top",an="padding-right",ln="margin-right";class cn{constructor(){this._element=document.body}getWidth(){const t=document.documentElement.clientWidth;return Math.abs(window.innerWidth-t)}hide(){const t=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,an,(e=>e+t)),this._setElementAttributes(on,an,(e=>e+t)),this._setElementAttributes(rn,ln,(e=>e-t))}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,an),this._resetElementAttributes(on,an),this._resetElementAttributes(rn,ln)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(t,e,i){const n=this.getWidth();this._applyManipulationCallback(t,(t=>{if(t!==this._element&&window.innerWidth>t.clientWidth+n)return;this._saveInitialAttribute(t,e);const s=window.getComputedStyle(t).getPropertyValue(e);t.style.setProperty(e,`${i(Number.parseFloat(s))}px`)}))}_saveInitialAttribute(t,e){const i=t.style.getPropertyValue(e);i&&F.setDataAttribute(t,e,i)}_resetElementAttributes(t,e){this._applyManipulationCallback(t,(t=>{const i=F.getDataAttribute(t,e);null!==i?(F.removeDataAttribute(t,e),t.style.setProperty(e,i)):t.style.removeProperty(e)}))}_applyManipulationCallback(t,e){if(o(t))e(t);else for(const i of z.find(t,this._element))e(i)}}const hn=".bs.modal",dn=`hide${hn}`,un=`hidePrevented${hn}`,fn=`hidden${hn}`,pn=`show${hn}`,mn=`shown${hn}`,gn=`resize${hn}`,_n=`click.dismiss${hn}`,bn=`mousedown.dismiss${hn}`,vn=`keydown.dismiss${hn}`,yn=`click${hn}.data-api`,wn="modal-open",An="show",En="modal-static",Tn={backdrop:!0,focus:!0,keyboard:!0},Cn={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class On extends W{constructor(t,e){super(t,e),this._dialog=z.findOne(".modal-dialog",this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new cn,this._addEventListeners()}static get Default(){return Tn}static get DefaultType(){return Cn}static get NAME(){return"modal"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||this._isTransitioning||N.trigger(this._element,pn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(wn),this._adjustDialog(),this._backdrop.show((()=>this._showElement(t))))}hide(){this._isShown&&!this._isTransitioning&&(N.trigger(this._element,dn).defaultPrevented||(this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(An),this._queueCallback((()=>this._hideModal()),this._element,this._isAnimated())))}dispose(){N.off(window,hn),N.off(this._dialog,hn),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Ui({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_showElement(t){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const e=z.findOne(".modal-body",this._dialog);e&&(e.scrollTop=0),d(this._element),this._element.classList.add(An),this._queueCallback((()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,N.trigger(this._element,mn,{relatedTarget:t})}),this._dialog,this._isAnimated())}_addEventListeners(){N.on(this._element,vn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():this._triggerBackdropTransition())})),N.on(window,gn,(()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()})),N.on(this._element,bn,(t=>{N.one(this._element,_n,(e=>{this._element===t.target&&this._element===e.target&&("static"!==this._config.backdrop?this._config.backdrop&&this.hide():this._triggerBackdropTransition())}))}))}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide((()=>{document.body.classList.remove(wn),this._resetAdjustments(),this._scrollBar.reset(),N.trigger(this._element,fn)}))}_isAnimated(){return this._element.classList.contains("fade")}_triggerBackdropTransition(){if(N.trigger(this._element,un).defaultPrevented)return;const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._element.style.overflowY;"hidden"===e||this._element.classList.contains(En)||(t||(this._element.style.overflowY="hidden"),this._element.classList.add(En),this._queueCallback((()=>{this._element.classList.remove(En),this._queueCallback((()=>{this._element.style.overflowY=e}),this._dialog)}),this._dialog),this._element.focus())}_adjustDialog(){const t=this._element.scrollHeight>document.documentElement.clientHeight,e=this._scrollBar.getWidth(),i=e>0;if(i&&!t){const t=p()?"paddingLeft":"paddingRight";this._element.style[t]=`${e}px`}if(!i&&t){const t=p()?"paddingRight":"paddingLeft";this._element.style[t]=`${e}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(t,e){return this.each((function(){const i=On.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===i[t])throw new TypeError(`No method named "${t}"`);i[t](e)}}))}}N.on(document,yn,'[data-bs-toggle="modal"]',(function(t){const e=z.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&t.preventDefault(),N.one(e,pn,(t=>{t.defaultPrevented||N.one(e,fn,(()=>{a(this)&&this.focus()}))}));const i=z.findOne(".modal.show");i&&On.getInstance(i).hide(),On.getOrCreateInstance(e).toggle(this)})),R(On),m(On);const xn=".bs.offcanvas",kn=".data-api",Ln=`load${xn}${kn}`,Sn="show",Dn="showing",$n="hiding",In=".offcanvas.show",Nn=`show${xn}`,Pn=`shown${xn}`,Mn=`hide${xn}`,jn=`hidePrevented${xn}`,Fn=`hidden${xn}`,Hn=`resize${xn}`,Wn=`click${xn}${kn}`,Bn=`keydown.dismiss${xn}`,zn={backdrop:!0,keyboard:!0,scroll:!1},Rn={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class qn extends W{constructor(t,e){super(t,e),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return zn}static get DefaultType(){return Rn}static get NAME(){return"offcanvas"}toggle(t){return this._isShown?this.hide():this.show(t)}show(t){this._isShown||N.trigger(this._element,Nn,{relatedTarget:t}).defaultPrevented||(this._isShown=!0,this._backdrop.show(),this._config.scroll||(new cn).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(Dn),this._queueCallback((()=>{this._config.scroll&&!this._config.backdrop||this._focustrap.activate(),this._element.classList.add(Sn),this._element.classList.remove(Dn),N.trigger(this._element,Pn,{relatedTarget:t})}),this._element,!0))}hide(){this._isShown&&(N.trigger(this._element,Mn).defaultPrevented||(this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add($n),this._backdrop.hide(),this._queueCallback((()=>{this._element.classList.remove(Sn,$n),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new cn).reset(),N.trigger(this._element,Fn)}),this._element,!0)))}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const t=Boolean(this._config.backdrop);return new Ui({className:"offcanvas-backdrop",isVisible:t,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:t?()=>{"static"!==this._config.backdrop?this.hide():N.trigger(this._element,jn)}:null})}_initializeFocusTrap(){return new sn({trapElement:this._element})}_addEventListeners(){N.on(this._element,Bn,(t=>{"Escape"===t.key&&(this._config.keyboard?this.hide():N.trigger(this._element,jn))}))}static jQueryInterface(t){return this.each((function(){const e=qn.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}N.on(document,Wn,'[data-bs-toggle="offcanvas"]',(function(t){const e=z.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this))return;N.one(e,Fn,(()=>{a(this)&&this.focus()}));const i=z.findOne(In);i&&i!==e&&qn.getInstance(i).hide(),qn.getOrCreateInstance(e).toggle(this)})),N.on(window,Ln,(()=>{for(const t of z.find(In))qn.getOrCreateInstance(t).show()})),N.on(window,Hn,(()=>{for(const t of z.find("[aria-modal][class*=show][class*=offcanvas-]"))"fixed"!==getComputedStyle(t).position&&qn.getOrCreateInstance(t).hide()})),R(qn),m(qn);const Vn={"*":["class","dir","id","lang","role",/^aria-[\w-]*$/i],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],div:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},Kn=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),Qn=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,Xn=(t,e)=>{const i=t.nodeName.toLowerCase();return e.includes(i)?!Kn.has(i)||Boolean(Qn.test(t.nodeValue)):e.filter((t=>t instanceof RegExp)).some((t=>t.test(i)))},Yn={allowList:Vn,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
"},Un={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},Gn={entry:"(string|element|function|null)",selector:"(string|element)"};class Jn extends H{constructor(t){super(),this._config=this._getConfig(t)}static get Default(){return Yn}static get DefaultType(){return Un}static get NAME(){return"TemplateFactory"}getContent(){return Object.values(this._config.content).map((t=>this._resolvePossibleFunction(t))).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(t){return this._checkContent(t),this._config.content={...this._config.content,...t},this}toHtml(){const t=document.createElement("div");t.innerHTML=this._maybeSanitize(this._config.template);for(const[e,i]of Object.entries(this._config.content))this._setContent(t,i,e);const e=t.children[0],i=this._resolvePossibleFunction(this._config.extraClass);return i&&e.classList.add(...i.split(" ")),e}_typeCheckConfig(t){super._typeCheckConfig(t),this._checkContent(t.content)}_checkContent(t){for(const[e,i]of Object.entries(t))super._typeCheckConfig({selector:e,entry:i},Gn)}_setContent(t,e,i){const n=z.findOne(i,t);n&&((e=this._resolvePossibleFunction(e))?o(e)?this._putElementInTemplate(r(e),n):this._config.html?n.innerHTML=this._maybeSanitize(e):n.textContent=e:n.remove())}_maybeSanitize(t){return this._config.sanitize?function(t,e,i){if(!t.length)return t;if(i&&"function"==typeof i)return i(t);const n=(new window.DOMParser).parseFromString(t,"text/html"),s=[].concat(...n.body.querySelectorAll("*"));for(const t of s){const i=t.nodeName.toLowerCase();if(!Object.keys(e).includes(i)){t.remove();continue}const n=[].concat(...t.attributes),s=[].concat(e["*"]||[],e[i]||[]);for(const e of n)Xn(e,s)||t.removeAttribute(e.nodeName)}return n.body.innerHTML}(t,this._config.allowList,this._config.sanitizeFn):t}_resolvePossibleFunction(t){return g(t,[this])}_putElementInTemplate(t,e){if(this._config.html)return e.innerHTML="",void e.append(t);e.textContent=t.textContent}}const Zn=new Set(["sanitize","allowList","sanitizeFn"]),ts="fade",es="show",is=".modal",ns="hide.bs.modal",ss="hover",os="focus",rs={AUTO:"auto",TOP:"top",RIGHT:p()?"left":"right",BOTTOM:"bottom",LEFT:p()?"right":"left"},as={allowList:Vn,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},ls={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class cs extends W{constructor(t,e){if(void 0===vi)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(t,e),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return as}static get DefaultType(){return ls}static get NAME(){return"tooltip"}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){this._isEnabled&&(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()?this._leave():this._enter())}dispose(){clearTimeout(this._timeout),N.off(this._element.closest(is),ns,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if("none"===this._element.style.display)throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const t=N.trigger(this._element,this.constructor.eventName("show")),e=(c(this._element)||this._element.ownerDocument.documentElement).contains(this._element);if(t.defaultPrevented||!e)return;this._disposePopper();const i=this._getTipElement();this._element.setAttribute("aria-describedby",i.getAttribute("id"));const{container:n}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(n.append(i),N.trigger(this._element,this.constructor.eventName("inserted"))),this._popper=this._createPopper(i),i.classList.add(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.on(t,"mouseover",h);this._queueCallback((()=>{N.trigger(this._element,this.constructor.eventName("shown")),!1===this._isHovered&&this._leave(),this._isHovered=!1}),this.tip,this._isAnimated())}hide(){if(this._isShown()&&!N.trigger(this._element,this.constructor.eventName("hide")).defaultPrevented){if(this._getTipElement().classList.remove(es),"ontouchstart"in document.documentElement)for(const t of[].concat(...document.body.children))N.off(t,"mouseover",h);this._activeTrigger.click=!1,this._activeTrigger[os]=!1,this._activeTrigger[ss]=!1,this._isHovered=null,this._queueCallback((()=>{this._isWithActiveTrigger()||(this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),N.trigger(this._element,this.constructor.eventName("hidden")))}),this.tip,this._isAnimated())}}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(t){const e=this._getTemplateFactory(t).toHtml();if(!e)return null;e.classList.remove(ts,es),e.classList.add(`bs-${this.constructor.NAME}-auto`);const i=(t=>{do{t+=Math.floor(1e6*Math.random())}while(document.getElementById(t));return t})(this.constructor.NAME).toString();return e.setAttribute("id",i),this._isAnimated()&&e.classList.add(ts),e}setContent(t){this._newContent=t,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(t){return this._templateFactory?this._templateFactory.changeContent(t):this._templateFactory=new Jn({...this._config,content:t,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{".tooltip-inner":this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(t){return this.constructor.getOrCreateInstance(t.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(ts)}_isShown(){return this.tip&&this.tip.classList.contains(es)}_createPopper(t){const e=g(this._config.placement,[this,t,this._element]),i=rs[e.toUpperCase()];return bi(this._element,t,this._getPopperConfig(i))}_getOffset(){const{offset:t}=this._config;return"string"==typeof t?t.split(",").map((t=>Number.parseInt(t,10))):"function"==typeof t?e=>t(e,this._element):t}_resolvePossibleFunction(t){return g(t,[this._element])}_getPopperConfig(t){const e={placement:t,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:t=>{this._getTipElement().setAttribute("data-popper-placement",t.state.placement)}}]};return{...e,...g(this._config.popperConfig,[e])}}_setListeners(){const t=this._config.trigger.split(" ");for(const e of t)if("click"===e)N.on(this._element,this.constructor.eventName("click"),this._config.selector,(t=>{this._initializeOnDelegatedTarget(t).toggle()}));else if("manual"!==e){const t=e===ss?this.constructor.eventName("mouseenter"):this.constructor.eventName("focusin"),i=e===ss?this.constructor.eventName("mouseleave"):this.constructor.eventName("focusout");N.on(this._element,t,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusin"===t.type?os:ss]=!0,e._enter()})),N.on(this._element,i,this._config.selector,(t=>{const e=this._initializeOnDelegatedTarget(t);e._activeTrigger["focusout"===t.type?os:ss]=e._element.contains(t.relatedTarget),e._leave()}))}this._hideModalHandler=()=>{this._element&&this.hide()},N.on(this._element.closest(is),ns,this._hideModalHandler)}_fixTitle(){const t=this._element.getAttribute("title");t&&(this._element.getAttribute("aria-label")||this._element.textContent.trim()||this._element.setAttribute("aria-label",t),this._element.setAttribute("data-bs-original-title",t),this._element.removeAttribute("title"))}_enter(){this._isShown()||this._isHovered?this._isHovered=!0:(this._isHovered=!0,this._setTimeout((()=>{this._isHovered&&this.show()}),this._config.delay.show))}_leave(){this._isWithActiveTrigger()||(this._isHovered=!1,this._setTimeout((()=>{this._isHovered||this.hide()}),this._config.delay.hide))}_setTimeout(t,e){clearTimeout(this._timeout),this._timeout=setTimeout(t,e)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(t){const e=F.getDataAttributes(this._element);for(const t of Object.keys(e))Zn.has(t)&&delete e[t];return t={...e,..."object"==typeof t&&t?t:{}},t=this._mergeConfigObj(t),t=this._configAfterMerge(t),this._typeCheckConfig(t),t}_configAfterMerge(t){return t.container=!1===t.container?document.body:r(t.container),"number"==typeof t.delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),t}_getDelegateConfig(){const t={};for(const[e,i]of Object.entries(this._config))this.constructor.Default[e]!==i&&(t[e]=i);return t.selector=!1,t.trigger="manual",t}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(t){return this.each((function(){const e=cs.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(cs);const hs={...cs.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},ds={...cs.DefaultType,content:"(null|string|element|function)"};class us extends cs{static get Default(){return hs}static get DefaultType(){return ds}static get NAME(){return"popover"}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{".popover-header":this._getTitle(),".popover-body":this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(t){return this.each((function(){const e=us.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t]()}}))}}m(us);const fs=".bs.scrollspy",ps=`activate${fs}`,ms=`click${fs}`,gs=`load${fs}.data-api`,_s="active",bs="[href]",vs=".nav-link",ys=`${vs}, .nav-item > ${vs}, .list-group-item`,ws={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},As={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class Es extends W{constructor(t,e){super(t,e),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement="visible"===getComputedStyle(this._element).overflowY?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return ws}static get DefaultType(){return As}static get NAME(){return"scrollspy"}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const t of this._observableSections.values())this._observer.observe(t)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(t){return t.target=r(t.target)||document.body,t.rootMargin=t.offset?`${t.offset}px 0px -30%`:t.rootMargin,"string"==typeof t.threshold&&(t.threshold=t.threshold.split(",").map((t=>Number.parseFloat(t)))),t}_maybeEnableSmoothScroll(){this._config.smoothScroll&&(N.off(this._config.target,ms),N.on(this._config.target,ms,bs,(t=>{const e=this._observableSections.get(t.target.hash);if(e){t.preventDefault();const i=this._rootElement||window,n=e.offsetTop-this._element.offsetTop;if(i.scrollTo)return void i.scrollTo({top:n,behavior:"smooth"});i.scrollTop=n}})))}_getNewObserver(){const t={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver((t=>this._observerCallback(t)),t)}_observerCallback(t){const e=t=>this._targetLinks.get(`#${t.target.id}`),i=t=>{this._previousScrollData.visibleEntryTop=t.target.offsetTop,this._process(e(t))},n=(this._rootElement||document.documentElement).scrollTop,s=n>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=n;for(const o of t){if(!o.isIntersecting){this._activeTarget=null,this._clearActiveClass(e(o));continue}const t=o.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(s&&t){if(i(o),!n)return}else s||t||i(o)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const t=z.find(bs,this._config.target);for(const e of t){if(!e.hash||l(e))continue;const t=z.findOne(decodeURI(e.hash),this._element);a(t)&&(this._targetLinks.set(decodeURI(e.hash),e),this._observableSections.set(e.hash,t))}}_process(t){this._activeTarget!==t&&(this._clearActiveClass(this._config.target),this._activeTarget=t,t.classList.add(_s),this._activateParents(t),N.trigger(this._element,ps,{relatedTarget:t}))}_activateParents(t){if(t.classList.contains("dropdown-item"))z.findOne(".dropdown-toggle",t.closest(".dropdown")).classList.add(_s);else for(const e of z.parents(t,".nav, .list-group"))for(const t of z.prev(e,ys))t.classList.add(_s)}_clearActiveClass(t){t.classList.remove(_s);const e=z.find(`${bs}.${_s}`,t);for(const t of e)t.classList.remove(_s)}static jQueryInterface(t){return this.each((function(){const e=Es.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(window,gs,(()=>{for(const t of z.find('[data-bs-spy="scroll"]'))Es.getOrCreateInstance(t)})),m(Es);const Ts=".bs.tab",Cs=`hide${Ts}`,Os=`hidden${Ts}`,xs=`show${Ts}`,ks=`shown${Ts}`,Ls=`click${Ts}`,Ss=`keydown${Ts}`,Ds=`load${Ts}`,$s="ArrowLeft",Is="ArrowRight",Ns="ArrowUp",Ps="ArrowDown",Ms="Home",js="End",Fs="active",Hs="fade",Ws="show",Bs=".dropdown-toggle",zs=`:not(${Bs})`,Rs='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',qs=`.nav-link${zs}, .list-group-item${zs}, [role="tab"]${zs}, ${Rs}`,Vs=`.${Fs}[data-bs-toggle="tab"], .${Fs}[data-bs-toggle="pill"], .${Fs}[data-bs-toggle="list"]`;class Ks extends W{constructor(t){super(t),this._parent=this._element.closest('.list-group, .nav, [role="tablist"]'),this._parent&&(this._setInitialAttributes(this._parent,this._getChildren()),N.on(this._element,Ss,(t=>this._keydown(t))))}static get NAME(){return"tab"}show(){const t=this._element;if(this._elemIsActive(t))return;const e=this._getActiveElem(),i=e?N.trigger(e,Cs,{relatedTarget:t}):null;N.trigger(t,xs,{relatedTarget:e}).defaultPrevented||i&&i.defaultPrevented||(this._deactivate(e,t),this._activate(t,e))}_activate(t,e){t&&(t.classList.add(Fs),this._activate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.removeAttribute("tabindex"),t.setAttribute("aria-selected",!0),this._toggleDropDown(t,!0),N.trigger(t,ks,{relatedTarget:e})):t.classList.add(Ws)}),t,t.classList.contains(Hs)))}_deactivate(t,e){t&&(t.classList.remove(Fs),t.blur(),this._deactivate(z.getElementFromSelector(t)),this._queueCallback((()=>{"tab"===t.getAttribute("role")?(t.setAttribute("aria-selected",!1),t.setAttribute("tabindex","-1"),this._toggleDropDown(t,!1),N.trigger(t,Os,{relatedTarget:e})):t.classList.remove(Ws)}),t,t.classList.contains(Hs)))}_keydown(t){if(![$s,Is,Ns,Ps,Ms,js].includes(t.key))return;t.stopPropagation(),t.preventDefault();const e=this._getChildren().filter((t=>!l(t)));let i;if([Ms,js].includes(t.key))i=e[t.key===Ms?0:e.length-1];else{const n=[Is,Ps].includes(t.key);i=b(e,t.target,n,!0)}i&&(i.focus({preventScroll:!0}),Ks.getOrCreateInstance(i).show())}_getChildren(){return z.find(qs,this._parent)}_getActiveElem(){return this._getChildren().find((t=>this._elemIsActive(t)))||null}_setInitialAttributes(t,e){this._setAttributeIfNotExists(t,"role","tablist");for(const t of e)this._setInitialAttributesOnChild(t)}_setInitialAttributesOnChild(t){t=this._getInnerElement(t);const e=this._elemIsActive(t),i=this._getOuterElement(t);t.setAttribute("aria-selected",e),i!==t&&this._setAttributeIfNotExists(i,"role","presentation"),e||t.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(t,"role","tab"),this._setInitialAttributesOnTargetPanel(t)}_setInitialAttributesOnTargetPanel(t){const e=z.getElementFromSelector(t);e&&(this._setAttributeIfNotExists(e,"role","tabpanel"),t.id&&this._setAttributeIfNotExists(e,"aria-labelledby",`${t.id}`))}_toggleDropDown(t,e){const i=this._getOuterElement(t);if(!i.classList.contains("dropdown"))return;const n=(t,n)=>{const s=z.findOne(t,i);s&&s.classList.toggle(n,e)};n(Bs,Fs),n(".dropdown-menu",Ws),i.setAttribute("aria-expanded",e)}_setAttributeIfNotExists(t,e,i){t.hasAttribute(e)||t.setAttribute(e,i)}_elemIsActive(t){return t.classList.contains(Fs)}_getInnerElement(t){return t.matches(qs)?t:z.findOne(qs,t)}_getOuterElement(t){return t.closest(".nav-item, .list-group-item")||t}static jQueryInterface(t){return this.each((function(){const e=Ks.getOrCreateInstance(this);if("string"==typeof t){if(void 0===e[t]||t.startsWith("_")||"constructor"===t)throw new TypeError(`No method named "${t}"`);e[t]()}}))}}N.on(document,Ls,Rs,(function(t){["A","AREA"].includes(this.tagName)&&t.preventDefault(),l(this)||Ks.getOrCreateInstance(this).show()})),N.on(window,Ds,(()=>{for(const t of z.find(Vs))Ks.getOrCreateInstance(t)})),m(Ks);const Qs=".bs.toast",Xs=`mouseover${Qs}`,Ys=`mouseout${Qs}`,Us=`focusin${Qs}`,Gs=`focusout${Qs}`,Js=`hide${Qs}`,Zs=`hidden${Qs}`,to=`show${Qs}`,eo=`shown${Qs}`,io="hide",no="show",so="showing",oo={animation:"boolean",autohide:"boolean",delay:"number"},ro={animation:!0,autohide:!0,delay:5e3};class ao extends W{constructor(t,e){super(t,e),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return ro}static get DefaultType(){return oo}static get NAME(){return"toast"}show(){N.trigger(this._element,to).defaultPrevented||(this._clearTimeout(),this._config.animation&&this._element.classList.add("fade"),this._element.classList.remove(io),d(this._element),this._element.classList.add(no,so),this._queueCallback((()=>{this._element.classList.remove(so),N.trigger(this._element,eo),this._maybeScheduleHide()}),this._element,this._config.animation))}hide(){this.isShown()&&(N.trigger(this._element,Js).defaultPrevented||(this._element.classList.add(so),this._queueCallback((()=>{this._element.classList.add(io),this._element.classList.remove(so,no),N.trigger(this._element,Zs)}),this._element,this._config.animation)))}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(no),super.dispose()}isShown(){return this._element.classList.contains(no)}_maybeScheduleHide(){this._config.autohide&&(this._hasMouseInteraction||this._hasKeyboardInteraction||(this._timeout=setTimeout((()=>{this.hide()}),this._config.delay)))}_onInteraction(t,e){switch(t.type){case"mouseover":case"mouseout":this._hasMouseInteraction=e;break;case"focusin":case"focusout":this._hasKeyboardInteraction=e}if(e)return void this._clearTimeout();const i=t.relatedTarget;this._element===i||this._element.contains(i)||this._maybeScheduleHide()}_setListeners(){N.on(this._element,Xs,(t=>this._onInteraction(t,!0))),N.on(this._element,Ys,(t=>this._onInteraction(t,!1))),N.on(this._element,Us,(t=>this._onInteraction(t,!0))),N.on(this._element,Gs,(t=>this._onInteraction(t,!1)))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(t){return this.each((function(){const e=ao.getOrCreateInstance(this,t);if("string"==typeof t){if(void 0===e[t])throw new TypeError(`No method named "${t}"`);e[t](this)}}))}}return R(ao),m(ao),{Alert:Q,Button:Y,Carousel:xt,Collapse:Bt,Dropdown:qi,Modal:On,Offcanvas:qn,Popover:us,ScrollSpy:Es,Tab:Ks,Toast:ao,Tooltip:cs}})); -//# sourceMappingURL=bootstrap.bundle.min.js.map \ No newline at end of file diff --git a/site/js/bootstrap.bundle.min.js.map b/site/js/bootstrap.bundle.min.js.map deleted file mode 100644 index 7cd8480..0000000 --- a/site/js/bootstrap.bundle.min.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"names":["elementMap","Map","Data","set","element","key","instance","has","instanceMap","get","size","console","error","Array","from","keys","remove","delete","TRANSITION_END","parseSelector","selector","window","CSS","escape","replace","match","id","triggerTransitionEnd","dispatchEvent","Event","isElement","object","jquery","nodeType","getElement","length","document","querySelector","isVisible","getClientRects","elementIsVisible","getComputedStyle","getPropertyValue","closedDetails","closest","summary","parentNode","isDisabled","Node","ELEMENT_NODE","classList","contains","disabled","hasAttribute","getAttribute","findShadowRoot","documentElement","attachShadow","getRootNode","root","ShadowRoot","noop","reflow","offsetHeight","getjQuery","jQuery","body","DOMContentLoadedCallbacks","isRTL","dir","defineJQueryPlugin","plugin","callback","$","name","NAME","JQUERY_NO_CONFLICT","fn","jQueryInterface","Constructor","noConflict","readyState","addEventListener","push","execute","possibleCallback","args","defaultValue","executeAfterTransition","transitionElement","waitForTransition","emulatedDuration","transitionDuration","transitionDelay","floatTransitionDuration","Number","parseFloat","floatTransitionDelay","split","getTransitionDurationFromElement","called","handler","target","removeEventListener","setTimeout","getNextActiveElement","list","activeElement","shouldGetNext","isCycleAllowed","listLength","index","indexOf","Math","max","min","namespaceRegex","stripNameRegex","stripUidRegex","eventRegistry","uidEvent","customEvents","mouseenter","mouseleave","nativeEvents","Set","makeEventUid","uid","getElementEvents","findHandler","events","callable","delegationSelector","Object","values","find","event","normalizeParameters","originalTypeEvent","delegationFunction","isDelegated","typeEvent","getTypeEvent","addHandler","oneOff","wrapFunction","relatedTarget","delegateTarget","call","this","handlers","previousFunction","domElements","querySelectorAll","domElement","hydrateObj","EventHandler","off","type","apply","bootstrapDelegationHandler","bootstrapHandler","removeHandler","Boolean","removeNamespacedHandlers","namespace","storeElementEvent","handlerKey","entries","includes","on","one","inNamespace","isNamespace","startsWith","elementEvent","slice","keyHandlers","trigger","jQueryEvent","bubbles","nativeDispatch","defaultPrevented","isPropagationStopped","isImmediatePropagationStopped","isDefaultPrevented","evt","cancelable","preventDefault","obj","meta","value","_unused","defineProperty","configurable","normalizeData","toString","JSON","parse","decodeURIComponent","normalizeDataKey","chr","toLowerCase","Manipulator","setDataAttribute","setAttribute","removeDataAttribute","removeAttribute","getDataAttributes","attributes","bsKeys","dataset","filter","pureKey","charAt","getDataAttribute","Config","Default","DefaultType","Error","_getConfig","config","_mergeConfigObj","_configAfterMerge","_typeCheckConfig","jsonConfig","constructor","configTypes","property","expectedTypes","valueType","prototype","RegExp","test","TypeError","toUpperCase","BaseComponent","super","_element","_config","DATA_KEY","dispose","EVENT_KEY","propertyName","getOwnPropertyNames","_queueCallback","isAnimated","getInstance","getOrCreateInstance","VERSION","eventName","getSelector","hrefAttribute","trim","SelectorEngine","concat","Element","findOne","children","child","matches","parents","ancestor","prev","previous","previousElementSibling","next","nextElementSibling","focusableChildren","focusables","map","join","el","getSelectorFromElement","getElementFromSelector","getMultipleElementsFromSelector","enableDismissTrigger","component","method","clickEvent","tagName","EVENT_CLOSE","EVENT_CLOSED","Alert","close","_destroyElement","each","data","undefined","SELECTOR_DATA_TOGGLE","Button","toggle","button","EVENT_TOUCHSTART","EVENT_TOUCHMOVE","EVENT_TOUCHEND","EVENT_POINTERDOWN","EVENT_POINTERUP","endCallback","leftCallback","rightCallback","Swipe","isSupported","_deltaX","_supportPointerEvents","PointerEvent","_initEvents","_start","_eventIsPointerPenTouch","clientX","touches","_end","_handleSwipe","_move","absDeltaX","abs","direction","add","pointerType","navigator","maxTouchPoints","DATA_API_KEY","ORDER_NEXT","ORDER_PREV","DIRECTION_LEFT","DIRECTION_RIGHT","EVENT_SLIDE","EVENT_SLID","EVENT_KEYDOWN","EVENT_MOUSEENTER","EVENT_MOUSELEAVE","EVENT_DRAG_START","EVENT_LOAD_DATA_API","EVENT_CLICK_DATA_API","CLASS_NAME_CAROUSEL","CLASS_NAME_ACTIVE","SELECTOR_ACTIVE","SELECTOR_ITEM","SELECTOR_ACTIVE_ITEM","KEY_TO_DIRECTION","ArrowLeft","ArrowRight","interval","keyboard","pause","ride","touch","wrap","Carousel","_interval","_activeElement","_isSliding","touchTimeout","_swipeHelper","_indicatorsElement","_addEventListeners","cycle","_slide","nextWhenVisible","hidden","_clearInterval","_updateInterval","setInterval","_maybeEnableCycle","to","items","_getItems","activeIndex","_getItemIndex","_getActive","order","defaultInterval","_keydown","_addTouchEventListeners","img","swipeConfig","_directionToOrder","endCallBack","clearTimeout","_setActiveIndicatorElement","activeIndicator","newActiveIndicator","elementInterval","parseInt","isNext","nextElement","nextElementIndex","triggerEvent","_orderToDirection","isCycling","directionalClassName","orderClassName","completeCallBack","_isAnimated","clearInterval","carousel","slideIndex","carousels","EVENT_SHOW","EVENT_SHOWN","EVENT_HIDE","EVENT_HIDDEN","CLASS_NAME_SHOW","CLASS_NAME_COLLAPSE","CLASS_NAME_COLLAPSING","CLASS_NAME_DEEPER_CHILDREN","parent","Collapse","_isTransitioning","_triggerArray","toggleList","elem","filterElement","foundElement","_initializeChildren","_addAriaAndCollapsedClass","_isShown","hide","show","activeChildren","_getFirstLevelChildren","activeInstance","dimension","_getDimension","style","scrollSize","complete","getBoundingClientRect","selected","triggerArray","isOpen","top","bottom","right","left","auto","basePlacements","start","end","clippingParents","viewport","popper","reference","variationPlacements","reduce","acc","placement","placements","beforeRead","read","afterRead","beforeMain","main","afterMain","beforeWrite","write","afterWrite","modifierPhases","getNodeName","nodeName","getWindow","node","ownerDocument","defaultView","isHTMLElement","HTMLElement","isShadowRoot","applyStyles$1","enabled","phase","_ref","state","elements","forEach","styles","assign","effect","_ref2","initialStyles","position","options","strategy","margin","arrow","hasOwnProperty","attribute","requires","getBasePlacement","round","getUAString","uaData","userAgentData","brands","isArray","item","brand","version","userAgent","isLayoutViewport","includeScale","isFixedStrategy","clientRect","scaleX","scaleY","offsetWidth","width","height","visualViewport","addVisualOffsets","x","offsetLeft","y","offsetTop","getLayoutRect","rootNode","isSameNode","host","isTableElement","getDocumentElement","getParentNode","assignedSlot","getTrueOffsetParent","offsetParent","getOffsetParent","isFirefox","currentNode","css","transform","perspective","contain","willChange","getContainingBlock","getMainAxisFromPlacement","within","mathMax","mathMin","mergePaddingObject","paddingObject","expandToHashMap","hashMap","arrow$1","_state$modifiersData$","arrowElement","popperOffsets","modifiersData","basePlacement","axis","len","padding","rects","toPaddingObject","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","clientHeight","clientWidth","centerToReference","center","offset","axisProp","centerOffset","_options$element","requiresIfExists","getVariation","unsetSides","mapToStyles","_Object$assign2","popperRect","variation","offsets","gpuAcceleration","adaptive","roundOffsets","isFixed","_offsets$x","_offsets$y","_ref3","hasX","hasY","sideX","sideY","win","heightProp","widthProp","_Object$assign","commonStyles","_ref4","dpr","devicePixelRatio","roundOffsetsByDPR","computeStyles$1","_ref5","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","passive","eventListeners","_options$scroll","scroll","_options$resize","resize","scrollParents","scrollParent","update","hash","getOppositePlacement","matched","getOppositeVariationPlacement","getWindowScroll","scrollLeft","pageXOffset","scrollTop","pageYOffset","getWindowScrollBarX","isScrollParent","_getComputedStyle","overflow","overflowX","overflowY","getScrollParent","listScrollParents","_element$ownerDocumen","isBody","updatedList","rectToClientRect","rect","getClientRectFromMixedType","clippingParent","html","layoutViewport","getViewportRect","clientTop","clientLeft","getInnerBoundingClientRect","winScroll","scrollWidth","scrollHeight","getDocumentRect","computeOffsets","commonX","commonY","mainAxis","detectOverflow","_options","_options$placement","_options$strategy","_options$boundary","boundary","_options$rootBoundary","rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","clippingClientRect","mainClippingParents","clipperElement","getClippingParents","firstClippingParent","clippingRect","accRect","getClippingRect","contextElement","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","computeAutoPlacement","flipVariations","_options$allowedAutoP","allowedAutoPlacements","allPlacements","allowedPlacements","overflows","sort","a","b","flip$1","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","preferredPlacement","oppositePlacement","getExpandedFallbackPlacements","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","i","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","every","check","_loop","_i","fittingPlacement","reset","getSideOffsets","preventedOffsets","isAnySideFullyClipped","some","side","hide$1","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","offset$1","_options$offset","invertDistance","skidding","distance","distanceAndSkiddingToXY","_data$state$placement","popperOffsets$1","preventOverflow$1","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","tetherOffsetValue","normalizedTetherOffsetValue","offsetModifierState","_offsetModifierState$","mainSide","altSide","additive","minLen","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMax","preventedOffset","_offsetModifierState$2","_mainSide","_altSide","_offset","_len","_min","_max","isOriginSide","_offsetModifierValue","_tetherMin","_tetherMax","_preventedOffset","v","withinMaxClamp","getCompositeRect","elementOrVirtualElement","isOffsetParentAnElement","offsetParentIsScaled","isElementScaled","modifiers","visited","result","modifier","dep","depModifier","DEFAULT_OPTIONS","areValidElements","arguments","_key","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","pending","orderedModifiers","effectCleanupFns","isDestroyed","setOptions","setOptionsAction","cleanupModifierEffects","merged","orderModifiers","current","existing","m","_ref$options","cleanupFn","forceUpdate","_state$elements","_state$orderedModifie","_state$orderedModifie2","Promise","resolve","then","destroy","onFirstUpdate","createPopper","computeStyles","applyStyles","flip","ARROW_UP_KEY","ARROW_DOWN_KEY","EVENT_KEYDOWN_DATA_API","EVENT_KEYUP_DATA_API","SELECTOR_DATA_TOGGLE_SHOWN","SELECTOR_MENU","PLACEMENT_TOP","PLACEMENT_TOPEND","PLACEMENT_BOTTOM","PLACEMENT_BOTTOMEND","PLACEMENT_RIGHT","PLACEMENT_LEFT","autoClose","display","popperConfig","Dropdown","_popper","_parent","_menu","_inNavbar","_detectNavbar","_createPopper","focus","_completeHide","Popper","referenceElement","_getPopperConfig","_getPlacement","parentDropdown","isEnd","_getOffset","popperData","defaultBsPopperConfig","_selectMenuItem","clearMenus","openToggles","context","composedPath","isMenuTarget","dataApiKeydownHandler","isInput","isEscapeEvent","isUpOrDownEvent","getToggleButton","stopPropagation","EVENT_MOUSEDOWN","className","clickCallback","rootElement","Backdrop","_isAppended","_append","_getElement","_emulateAnimation","backdrop","createElement","append","EVENT_FOCUSIN","EVENT_KEYDOWN_TAB","TAB_NAV_BACKWARD","autofocus","trapElement","FocusTrap","_isActive","_lastTabNavDirection","activate","_handleFocusin","_handleKeydown","deactivate","shiftKey","SELECTOR_FIXED_CONTENT","SELECTOR_STICKY_CONTENT","PROPERTY_PADDING","PROPERTY_MARGIN","ScrollBarHelper","getWidth","documentWidth","innerWidth","_disableOverFlow","_setElementAttributes","calculatedValue","_resetElementAttributes","isOverflowing","_saveInitialAttribute","styleProperty","scrollbarWidth","_applyManipulationCallback","setProperty","actualValue","removeProperty","callBack","sel","EVENT_HIDE_PREVENTED","EVENT_RESIZE","EVENT_CLICK_DISMISS","EVENT_MOUSEDOWN_DISMISS","EVENT_KEYDOWN_DISMISS","CLASS_NAME_OPEN","CLASS_NAME_STATIC","Modal","_dialog","_backdrop","_initializeBackDrop","_focustrap","_initializeFocusTrap","_scrollBar","_adjustDialog","_showElement","_hideModal","handleUpdate","modalBody","transitionComplete","_triggerBackdropTransition","event2","_resetAdjustments","isModalOverflowing","initialOverflowY","isBodyOverflowing","paddingLeft","paddingRight","showEvent","alreadyOpen","CLASS_NAME_SHOWING","CLASS_NAME_HIDING","OPEN_SELECTOR","Offcanvas","blur","completeCallback","DefaultAllowlist","area","br","col","code","div","em","hr","h1","h2","h3","h4","h5","h6","li","ol","p","pre","s","small","span","sub","sup","strong","u","ul","uriAttributes","SAFE_URL_PATTERN","allowedAttribute","allowedAttributeList","attributeName","nodeValue","attributeRegex","regex","allowList","content","extraClass","sanitize","sanitizeFn","template","DefaultContentType","entry","TemplateFactory","getContent","_resolvePossibleFunction","hasContent","changeContent","_checkContent","toHtml","templateWrapper","innerHTML","_maybeSanitize","text","_setContent","arg","templateElement","_putElementInTemplate","textContent","unsafeHtml","sanitizeFunction","createdDocument","DOMParser","parseFromString","elementName","attributeList","allowedAttributes","sanitizeHtml","DISALLOWED_ATTRIBUTES","CLASS_NAME_FADE","SELECTOR_MODAL","EVENT_MODAL_HIDE","TRIGGER_HOVER","TRIGGER_FOCUS","AttachmentMap","AUTO","TOP","RIGHT","BOTTOM","LEFT","animation","container","customClass","delay","title","Tooltip","_isEnabled","_timeout","_isHovered","_activeTrigger","_templateFactory","_newContent","tip","_setListeners","_fixTitle","enable","disable","toggleEnabled","click","_leave","_enter","_hideModalHandler","_disposePopper","_isWithContent","isInTheDom","_getTipElement","_isWithActiveTrigger","_getTitle","_createTipElement","_getContentForTemplate","_getTemplateFactory","tipId","prefix","floor","random","getElementById","getUID","setContent","_initializeOnDelegatedTarget","_getDelegateConfig","attachment","triggers","eventIn","eventOut","_setTimeout","timeout","dataAttributes","dataAttribute","Popover","_getContent","EVENT_ACTIVATE","EVENT_CLICK","SELECTOR_TARGET_LINKS","SELECTOR_NAV_LINKS","SELECTOR_LINK_ITEMS","rootMargin","smoothScroll","threshold","ScrollSpy","_targetLinks","_observableSections","_rootElement","_activeTarget","_observer","_previousScrollData","visibleEntryTop","parentScrollTop","refresh","_initializeTargetsAndObservables","_maybeEnableSmoothScroll","disconnect","_getNewObserver","section","observe","observableSection","scrollTo","behavior","IntersectionObserver","_observerCallback","targetElement","_process","userScrollsDown","isIntersecting","_clearActiveClass","entryIsLowerThanPrevious","targetLinks","anchor","decodeURI","_activateParents","listGroup","activeNodes","spy","ARROW_LEFT_KEY","ARROW_RIGHT_KEY","HOME_KEY","END_KEY","SELECTOR_DROPDOWN_TOGGLE","NOT_SELECTOR_DROPDOWN_TOGGLE","SELECTOR_INNER_ELEM","SELECTOR_DATA_TOGGLE_ACTIVE","Tab","_setInitialAttributes","_getChildren","innerElem","_elemIsActive","active","_getActiveElem","hideEvent","_deactivate","_activate","relatedElem","_toggleDropDown","nextActiveElement","preventScroll","_setAttributeIfNotExists","_setInitialAttributesOnChild","_getInnerElement","isActive","outerElem","_getOuterElement","_setInitialAttributesOnTargetPanel","open","EVENT_MOUSEOVER","EVENT_MOUSEOUT","EVENT_FOCUSOUT","CLASS_NAME_HIDE","autohide","Toast","_hasMouseInteraction","_hasKeyboardInteraction","_clearTimeout","_maybeScheduleHide","isShown","_onInteraction","isInteracting"],"sources":["../../js/src/dom/data.js","../../js/src/util/index.js","../../js/src/dom/event-handler.js","../../js/src/dom/manipulator.js","../../js/src/util/config.js","../../js/src/base-component.js","../../js/src/dom/selector-engine.js","../../js/src/util/component-functions.js","../../js/src/alert.js","../../js/src/button.js","../../js/src/util/swipe.js","../../js/src/carousel.js","../../js/src/collapse.js","../../node_modules/@popperjs/core/lib/enums.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeName.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindow.js","../../node_modules/@popperjs/core/lib/dom-utils/instanceOf.js","../../node_modules/@popperjs/core/lib/modifiers/applyStyles.js","../../node_modules/@popperjs/core/lib/utils/getBasePlacement.js","../../node_modules/@popperjs/core/lib/utils/math.js","../../node_modules/@popperjs/core/lib/utils/userAgent.js","../../node_modules/@popperjs/core/lib/dom-utils/isLayoutViewport.js","../../node_modules/@popperjs/core/lib/dom-utils/getBoundingClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getLayoutRect.js","../../node_modules/@popperjs/core/lib/dom-utils/contains.js","../../node_modules/@popperjs/core/lib/dom-utils/getComputedStyle.js","../../node_modules/@popperjs/core/lib/dom-utils/isTableElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentElement.js","../../node_modules/@popperjs/core/lib/dom-utils/getParentNode.js","../../node_modules/@popperjs/core/lib/dom-utils/getOffsetParent.js","../../node_modules/@popperjs/core/lib/utils/getMainAxisFromPlacement.js","../../node_modules/@popperjs/core/lib/utils/within.js","../../node_modules/@popperjs/core/lib/utils/mergePaddingObject.js","../../node_modules/@popperjs/core/lib/utils/getFreshSideObject.js","../../node_modules/@popperjs/core/lib/utils/expandToHashMap.js","../../node_modules/@popperjs/core/lib/modifiers/arrow.js","../../node_modules/@popperjs/core/lib/utils/getVariation.js","../../node_modules/@popperjs/core/lib/modifiers/computeStyles.js","../../node_modules/@popperjs/core/lib/modifiers/eventListeners.js","../../node_modules/@popperjs/core/lib/utils/getOppositePlacement.js","../../node_modules/@popperjs/core/lib/utils/getOppositeVariationPlacement.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getWindowScrollBarX.js","../../node_modules/@popperjs/core/lib/dom-utils/isScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/getScrollParent.js","../../node_modules/@popperjs/core/lib/dom-utils/listScrollParents.js","../../node_modules/@popperjs/core/lib/utils/rectToClientRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getClippingRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getViewportRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getDocumentRect.js","../../node_modules/@popperjs/core/lib/utils/computeOffsets.js","../../node_modules/@popperjs/core/lib/utils/detectOverflow.js","../../node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js","../../node_modules/@popperjs/core/lib/modifiers/flip.js","../../node_modules/@popperjs/core/lib/modifiers/hide.js","../../node_modules/@popperjs/core/lib/modifiers/offset.js","../../node_modules/@popperjs/core/lib/modifiers/popperOffsets.js","../../node_modules/@popperjs/core/lib/modifiers/preventOverflow.js","../../node_modules/@popperjs/core/lib/utils/getAltAxis.js","../../node_modules/@popperjs/core/lib/dom-utils/getCompositeRect.js","../../node_modules/@popperjs/core/lib/dom-utils/getNodeScroll.js","../../node_modules/@popperjs/core/lib/dom-utils/getHTMLElementScroll.js","../../node_modules/@popperjs/core/lib/utils/orderModifiers.js","../../node_modules/@popperjs/core/lib/createPopper.js","../../node_modules/@popperjs/core/lib/utils/debounce.js","../../node_modules/@popperjs/core/lib/utils/mergeByName.js","../../node_modules/@popperjs/core/lib/popper-lite.js","../../node_modules/@popperjs/core/lib/popper.js","../../js/src/dropdown.js","../../js/src/util/backdrop.js","../../js/src/util/focustrap.js","../../js/src/util/scrollbar.js","../../js/src/modal.js","../../js/src/offcanvas.js","../../js/src/util/sanitizer.js","../../js/src/util/template-factory.js","../../js/src/tooltip.js","../../js/src/popover.js","../../js/src/scrollspy.js","../../js/src/tab.js","../../js/src/toast.js","../../js/index.umd.js"],"sourcesContent":["/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/data.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n/**\n * Constants\n */\n\nconst elementMap = new Map()\n\nexport default {\n set(element, key, instance) {\n if (!elementMap.has(element)) {\n elementMap.set(element, new Map())\n }\n\n const instanceMap = elementMap.get(element)\n\n // make it clear we only want one instance per element\n // can be removed later when multiple key/instances are fine to be used\n if (!instanceMap.has(key) && instanceMap.size !== 0) {\n // eslint-disable-next-line no-console\n console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`)\n return\n }\n\n instanceMap.set(key, instance)\n },\n\n get(element, key) {\n if (elementMap.has(element)) {\n return elementMap.get(element).get(key) || null\n }\n\n return null\n },\n\n remove(element, key) {\n if (!elementMap.has(element)) {\n return\n }\n\n const instanceMap = elementMap.get(element)\n\n instanceMap.delete(key)\n\n // free up element references if there are no instances left for an element\n if (instanceMap.size === 0) {\n elementMap.delete(element)\n }\n }\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nconst MAX_UID = 1_000_000\nconst MILLISECONDS_MULTIPLIER = 1000\nconst TRANSITION_END = 'transitionend'\n\n/**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\nconst parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`)\n }\n\n return selector\n}\n\n// Shout-out Angus Croll (https://goo.gl/pxwQGp)\nconst toType = object => {\n if (object === null || object === undefined) {\n return `${object}`\n }\n\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase()\n}\n\n/**\n * Public Util API\n */\n\nconst getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID)\n } while (document.getElementById(prefix))\n\n return prefix\n}\n\nconst getTransitionDurationFromElement = element => {\n if (!element) {\n return 0\n }\n\n // Get transition-duration of the element\n let { transitionDuration, transitionDelay } = window.getComputedStyle(element)\n\n const floatTransitionDuration = Number.parseFloat(transitionDuration)\n const floatTransitionDelay = Number.parseFloat(transitionDelay)\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0]\n transitionDelay = transitionDelay.split(',')[0]\n\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER\n}\n\nconst triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END))\n}\n\nconst isElement = object => {\n if (!object || typeof object !== 'object') {\n return false\n }\n\n if (typeof object.jquery !== 'undefined') {\n object = object[0]\n }\n\n return typeof object.nodeType !== 'undefined'\n}\n\nconst getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object\n }\n\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object))\n }\n\n return null\n}\n\nconst isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false\n }\n\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible'\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])')\n\n if (!closedDetails) {\n return elementIsVisible\n }\n\n if (closedDetails !== element) {\n const summary = element.closest('summary')\n if (summary && summary.parentNode !== closedDetails) {\n return false\n }\n\n if (summary === null) {\n return false\n }\n }\n\n return elementIsVisible\n}\n\nconst isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true\n }\n\n if (element.classList.contains('disabled')) {\n return true\n }\n\n if (typeof element.disabled !== 'undefined') {\n return element.disabled\n }\n\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false'\n}\n\nconst findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode()\n return root instanceof ShadowRoot ? root : null\n }\n\n if (element instanceof ShadowRoot) {\n return element\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null\n }\n\n return findShadowRoot(element.parentNode)\n}\n\nconst noop = () => {}\n\n/**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\nconst reflow = element => {\n element.offsetHeight // eslint-disable-line no-unused-expressions\n}\n\nconst getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery\n }\n\n return null\n}\n\nconst DOMContentLoadedCallbacks = []\n\nconst onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback()\n }\n })\n }\n\n DOMContentLoadedCallbacks.push(callback)\n } else {\n callback()\n }\n}\n\nconst isRTL = () => document.documentElement.dir === 'rtl'\n\nconst defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery()\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME\n const JQUERY_NO_CONFLICT = $.fn[name]\n $.fn[name] = plugin.jQueryInterface\n $.fn[name].Constructor = plugin\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT\n return plugin.jQueryInterface\n }\n }\n })\n}\n\nconst execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue\n}\n\nconst executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback)\n return\n }\n\n const durationPadding = 5\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding\n\n let called = false\n\n const handler = ({ target }) => {\n if (target !== transitionElement) {\n return\n }\n\n called = true\n transitionElement.removeEventListener(TRANSITION_END, handler)\n execute(callback)\n }\n\n transitionElement.addEventListener(TRANSITION_END, handler)\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement)\n }\n }, emulatedDuration)\n}\n\n/**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\nconst getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length\n let index = list.indexOf(activeElement)\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0]\n }\n\n index += shouldGetNext ? 1 : -1\n\n if (isCycleAllowed) {\n index = (index + listLength) % listLength\n }\n\n return list[Math.max(0, Math.min(index, listLength - 1))]\n}\n\nexport {\n defineJQueryPlugin,\n execute,\n executeAfterTransition,\n findShadowRoot,\n getElement,\n getjQuery,\n getNextActiveElement,\n getTransitionDurationFromElement,\n getUID,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop,\n onDOMContentLoaded,\n parseSelector,\n reflow,\n triggerTransitionEnd,\n toType\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/event-handler.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { getjQuery } from '../util/index.js'\n\n/**\n * Constants\n */\n\nconst namespaceRegex = /[^.]*(?=\\..*)\\.|.*/\nconst stripNameRegex = /\\..*/\nconst stripUidRegex = /::\\d+$/\nconst eventRegistry = {} // Events storage\nlet uidEvent = 1\nconst customEvents = {\n mouseenter: 'mouseover',\n mouseleave: 'mouseout'\n}\n\nconst nativeEvents = new Set([\n 'click',\n 'dblclick',\n 'mouseup',\n 'mousedown',\n 'contextmenu',\n 'mousewheel',\n 'DOMMouseScroll',\n 'mouseover',\n 'mouseout',\n 'mousemove',\n 'selectstart',\n 'selectend',\n 'keydown',\n 'keypress',\n 'keyup',\n 'orientationchange',\n 'touchstart',\n 'touchmove',\n 'touchend',\n 'touchcancel',\n 'pointerdown',\n 'pointermove',\n 'pointerup',\n 'pointerleave',\n 'pointercancel',\n 'gesturestart',\n 'gesturechange',\n 'gestureend',\n 'focus',\n 'blur',\n 'change',\n 'reset',\n 'select',\n 'submit',\n 'focusin',\n 'focusout',\n 'load',\n 'unload',\n 'beforeunload',\n 'resize',\n 'move',\n 'DOMContentLoaded',\n 'readystatechange',\n 'error',\n 'abort',\n 'scroll'\n])\n\n/**\n * Private methods\n */\n\nfunction makeEventUid(element, uid) {\n return (uid && `${uid}::${uidEvent++}`) || element.uidEvent || uidEvent++\n}\n\nfunction getElementEvents(element) {\n const uid = makeEventUid(element)\n\n element.uidEvent = uid\n eventRegistry[uid] = eventRegistry[uid] || {}\n\n return eventRegistry[uid]\n}\n\nfunction bootstrapHandler(element, fn) {\n return function handler(event) {\n hydrateObj(event, { delegateTarget: element })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, fn)\n }\n\n return fn.apply(element, [event])\n }\n}\n\nfunction bootstrapDelegationHandler(element, selector, fn) {\n return function handler(event) {\n const domElements = element.querySelectorAll(selector)\n\n for (let { target } = event; target && target !== this; target = target.parentNode) {\n for (const domElement of domElements) {\n if (domElement !== target) {\n continue\n }\n\n hydrateObj(event, { delegateTarget: target })\n\n if (handler.oneOff) {\n EventHandler.off(element, event.type, selector, fn)\n }\n\n return fn.apply(target, [event])\n }\n }\n }\n}\n\nfunction findHandler(events, callable, delegationSelector = null) {\n return Object.values(events)\n .find(event => event.callable === callable && event.delegationSelector === delegationSelector)\n}\n\nfunction normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string'\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : (handler || delegationFunction)\n let typeEvent = getTypeEvent(originalTypeEvent)\n\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent\n }\n\n return [isDelegated, callable, typeEvent]\n}\n\nfunction addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || (event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget))) {\n return fn.call(this, event)\n }\n }\n }\n\n callable = wrapFunction(callable)\n }\n\n const events = getElementEvents(element)\n const handlers = events[typeEvent] || (events[typeEvent] = {})\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null)\n\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff\n\n return\n }\n\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''))\n const fn = isDelegated ?\n bootstrapDelegationHandler(element, handler, callable) :\n bootstrapHandler(element, callable)\n\n fn.delegationSelector = isDelegated ? handler : null\n fn.callable = callable\n fn.oneOff = oneOff\n fn.uidEvent = uid\n handlers[uid] = fn\n\n element.addEventListener(typeEvent, fn, isDelegated)\n}\n\nfunction removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector)\n\n if (!fn) {\n return\n }\n\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector))\n delete events[typeEvent][fn.uidEvent]\n}\n\nfunction removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {}\n\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n}\n\nfunction getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '')\n return customEvents[event] || event\n}\n\nconst EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false)\n },\n\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true)\n },\n\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return\n }\n\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction)\n const inNamespace = typeEvent !== originalTypeEvent\n const events = getElementEvents(element)\n const storeElementEvent = events[typeEvent] || {}\n const isNamespace = originalTypeEvent.startsWith('.')\n\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return\n }\n\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null)\n return\n }\n\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1))\n }\n }\n\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '')\n\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector)\n }\n }\n },\n\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null\n }\n\n const $ = getjQuery()\n const typeEvent = getTypeEvent(event)\n const inNamespace = event !== typeEvent\n\n let jQueryEvent = null\n let bubbles = true\n let nativeDispatch = true\n let defaultPrevented = false\n\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args)\n\n $(element).trigger(jQueryEvent)\n bubbles = !jQueryEvent.isPropagationStopped()\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped()\n defaultPrevented = jQueryEvent.isDefaultPrevented()\n }\n\n const evt = hydrateObj(new Event(event, { bubbles, cancelable: true }), args)\n\n if (defaultPrevented) {\n evt.preventDefault()\n }\n\n if (nativeDispatch) {\n element.dispatchEvent(evt)\n }\n\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault()\n }\n\n return evt\n }\n}\n\nfunction hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value\n } catch {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value\n }\n })\n }\n }\n\n return obj\n}\n\nexport default EventHandler\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nfunction normalizeData(value) {\n if (value === 'true') {\n return true\n }\n\n if (value === 'false') {\n return false\n }\n\n if (value === Number(value).toString()) {\n return Number(value)\n }\n\n if (value === '' || value === 'null') {\n return null\n }\n\n if (typeof value !== 'string') {\n return value\n }\n\n try {\n return JSON.parse(decodeURIComponent(value))\n } catch {\n return value\n }\n}\n\nfunction normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`)\n}\n\nconst Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value)\n },\n\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)\n },\n\n getDataAttributes(element) {\n if (!element) {\n return {}\n }\n\n const attributes = {}\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'))\n\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '')\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length)\n attributes[pureKey] = normalizeData(element.dataset[key])\n }\n\n return attributes\n },\n\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))\n }\n}\n\nexport default Manipulator\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport { isElement, toType } from './index.js'\n\n/**\n * Class definition\n */\n\nclass Config {\n // Getters\n static get Default() {\n return {}\n }\n\n static get DefaultType() {\n return {}\n }\n\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!')\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n return config\n }\n\n _mergeConfigObj(config, element) {\n const jsonConfig = isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {} // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n }\n }\n\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property]\n const valueType = isElement(value) ? 'element' : toType(value)\n\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(\n `${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`\n )\n }\n }\n }\n}\n\nexport default Config\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap base-component.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Data from './dom/data.js'\nimport EventHandler from './dom/event-handler.js'\nimport Config from './util/config.js'\nimport { executeAfterTransition, getElement } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst VERSION = '5.3.2'\n\n/**\n * Class definition\n */\n\nclass BaseComponent extends Config {\n constructor(element, config) {\n super()\n\n element = getElement(element)\n if (!element) {\n return\n }\n\n this._element = element\n this._config = this._getConfig(config)\n\n Data.set(this._element, this.constructor.DATA_KEY, this)\n }\n\n // Public\n dispose() {\n Data.remove(this._element, this.constructor.DATA_KEY)\n EventHandler.off(this._element, this.constructor.EVENT_KEY)\n\n for (const propertyName of Object.getOwnPropertyNames(this)) {\n this[propertyName] = null\n }\n }\n\n _queueCallback(callback, element, isAnimated = true) {\n executeAfterTransition(callback, element, isAnimated)\n }\n\n _getConfig(config) {\n config = this._mergeConfigObj(config, this._element)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n // Static\n static getInstance(element) {\n return Data.get(getElement(element), this.DATA_KEY)\n }\n\n static getOrCreateInstance(element, config = {}) {\n return this.getInstance(element) || new this(element, typeof config === 'object' ? config : null)\n }\n\n static get VERSION() {\n return VERSION\n }\n\n static get DATA_KEY() {\n return `bs.${this.NAME}`\n }\n\n static get EVENT_KEY() {\n return `.${this.DATA_KEY}`\n }\n\n static eventName(name) {\n return `${name}${this.EVENT_KEY}`\n }\n}\n\nexport default BaseComponent\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport { isDisabled, isVisible, parseSelector } from '../util/index.js'\n\nconst getSelector = element => {\n let selector = element.getAttribute('data-bs-target')\n\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href')\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || (!hrefAttribute.includes('#') && !hrefAttribute.startsWith('.'))) {\n return null\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`\n }\n\n selector = hrefAttribute && hrefAttribute !== '#' ? parseSelector(hrefAttribute.trim()) : null\n }\n\n return selector\n}\n\nconst SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector))\n },\n\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector)\n },\n\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector))\n },\n\n parents(element, selector) {\n const parents = []\n let ancestor = element.parentNode.closest(selector)\n\n while (ancestor) {\n parents.push(ancestor)\n ancestor = ancestor.parentNode.closest(selector)\n }\n\n return parents\n },\n\n prev(element, selector) {\n let previous = element.previousElementSibling\n\n while (previous) {\n if (previous.matches(selector)) {\n return [previous]\n }\n\n previous = previous.previousElementSibling\n }\n\n return []\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling\n\n while (next) {\n if (next.matches(selector)) {\n return [next]\n }\n\n next = next.nextElementSibling\n }\n\n return []\n },\n\n focusableChildren(element) {\n const focusables = [\n 'a',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'details',\n '[tabindex]',\n '[contenteditable=\"true\"]'\n ].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',')\n\n return this.find(focusables, element).filter(el => !isDisabled(el) && isVisible(el))\n },\n\n getSelectorFromElement(element) {\n const selector = getSelector(element)\n\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null\n }\n\n return null\n },\n\n getElementFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.findOne(selector) : null\n },\n\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element)\n\n return selector ? SelectorEngine.find(selector) : []\n }\n}\n\nexport default SelectorEngine\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isDisabled } from './index.js'\n\nconst enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`\n const name = component.NAME\n\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`)\n const instance = component.getOrCreateInstance(target)\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]()\n })\n}\n\nexport {\n enableDismissTrigger\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap alert.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'alert'\nconst DATA_KEY = 'bs.alert'\nconst EVENT_KEY = `.${DATA_KEY}`\n\nconst EVENT_CLOSE = `close${EVENT_KEY}`\nconst EVENT_CLOSED = `closed${EVENT_KEY}`\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\n\n/**\n * Class definition\n */\n\nclass Alert extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n close() {\n const closeEvent = EventHandler.trigger(this._element, EVENT_CLOSE)\n\n if (closeEvent.defaultPrevented) {\n return\n }\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n const isAnimated = this._element.classList.contains(CLASS_NAME_FADE)\n this._queueCallback(() => this._destroyElement(), this._element, isAnimated)\n }\n\n // Private\n _destroyElement() {\n this._element.remove()\n EventHandler.trigger(this._element, EVENT_CLOSED)\n this.dispose()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Alert.getOrCreateInstance(this)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nenableDismissTrigger(Alert, 'close')\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Alert)\n\nexport default Alert\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap button.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'button'\nconst DATA_KEY = 'bs.button'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst CLASS_NAME_ACTIVE = 'active'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"button\"]'\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\n/**\n * Class definition\n */\n\nclass Button extends BaseComponent {\n // Getters\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n // Toggle class and sync the `aria-pressed` attribute with the return value of the `.toggle()` method\n this._element.setAttribute('aria-pressed', this._element.classList.toggle(CLASS_NAME_ACTIVE))\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Button.getOrCreateInstance(this)\n\n if (config === 'toggle') {\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => {\n event.preventDefault()\n\n const button = event.target.closest(SELECTOR_DATA_TOGGLE)\n const data = Button.getOrCreateInstance(button)\n\n data.toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Button)\n\nexport default Button\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/swipe.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'swipe'\nconst EVENT_KEY = '.bs.swipe'\nconst EVENT_TOUCHSTART = `touchstart${EVENT_KEY}`\nconst EVENT_TOUCHMOVE = `touchmove${EVENT_KEY}`\nconst EVENT_TOUCHEND = `touchend${EVENT_KEY}`\nconst EVENT_POINTERDOWN = `pointerdown${EVENT_KEY}`\nconst EVENT_POINTERUP = `pointerup${EVENT_KEY}`\nconst POINTER_TYPE_TOUCH = 'touch'\nconst POINTER_TYPE_PEN = 'pen'\nconst CLASS_NAME_POINTER_EVENT = 'pointer-event'\nconst SWIPE_THRESHOLD = 40\n\nconst Default = {\n endCallback: null,\n leftCallback: null,\n rightCallback: null\n}\n\nconst DefaultType = {\n endCallback: '(function|null)',\n leftCallback: '(function|null)',\n rightCallback: '(function|null)'\n}\n\n/**\n * Class definition\n */\n\nclass Swipe extends Config {\n constructor(element, config) {\n super()\n this._element = element\n\n if (!element || !Swipe.isSupported()) {\n return\n }\n\n this._config = this._getConfig(config)\n this._deltaX = 0\n this._supportPointerEvents = Boolean(window.PointerEvent)\n this._initEvents()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n dispose() {\n EventHandler.off(this._element, EVENT_KEY)\n }\n\n // Private\n _start(event) {\n if (!this._supportPointerEvents) {\n this._deltaX = event.touches[0].clientX\n\n return\n }\n\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX\n }\n }\n\n _end(event) {\n if (this._eventIsPointerPenTouch(event)) {\n this._deltaX = event.clientX - this._deltaX\n }\n\n this._handleSwipe()\n execute(this._config.endCallback)\n }\n\n _move(event) {\n this._deltaX = event.touches && event.touches.length > 1 ?\n 0 :\n event.touches[0].clientX - this._deltaX\n }\n\n _handleSwipe() {\n const absDeltaX = Math.abs(this._deltaX)\n\n if (absDeltaX <= SWIPE_THRESHOLD) {\n return\n }\n\n const direction = absDeltaX / this._deltaX\n\n this._deltaX = 0\n\n if (!direction) {\n return\n }\n\n execute(direction > 0 ? this._config.rightCallback : this._config.leftCallback)\n }\n\n _initEvents() {\n if (this._supportPointerEvents) {\n EventHandler.on(this._element, EVENT_POINTERDOWN, event => this._start(event))\n EventHandler.on(this._element, EVENT_POINTERUP, event => this._end(event))\n\n this._element.classList.add(CLASS_NAME_POINTER_EVENT)\n } else {\n EventHandler.on(this._element, EVENT_TOUCHSTART, event => this._start(event))\n EventHandler.on(this._element, EVENT_TOUCHMOVE, event => this._move(event))\n EventHandler.on(this._element, EVENT_TOUCHEND, event => this._end(event))\n }\n }\n\n _eventIsPointerPenTouch(event) {\n return this._supportPointerEvents && (event.pointerType === POINTER_TYPE_PEN || event.pointerType === POINTER_TYPE_TOUCH)\n }\n\n // Static\n static isSupported() {\n return 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0\n }\n}\n\nexport default Swipe\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap carousel.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getNextActiveElement,\n isRTL,\n isVisible,\n reflow,\n triggerTransitionEnd\n} from './util/index.js'\nimport Swipe from './util/swipe.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'carousel'\nconst DATA_KEY = 'bs.carousel'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ARROW_LEFT_KEY = 'ArrowLeft'\nconst ARROW_RIGHT_KEY = 'ArrowRight'\nconst TOUCHEVENT_COMPAT_WAIT = 500 // Time for mouse compat events to fire after touch\n\nconst ORDER_NEXT = 'next'\nconst ORDER_PREV = 'prev'\nconst DIRECTION_LEFT = 'left'\nconst DIRECTION_RIGHT = 'right'\n\nconst EVENT_SLIDE = `slide${EVENT_KEY}`\nconst EVENT_SLID = `slid${EVENT_KEY}`\nconst EVENT_KEYDOWN = `keydown${EVENT_KEY}`\nconst EVENT_MOUSEENTER = `mouseenter${EVENT_KEY}`\nconst EVENT_MOUSELEAVE = `mouseleave${EVENT_KEY}`\nconst EVENT_DRAG_START = `dragstart${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_CAROUSEL = 'carousel'\nconst CLASS_NAME_ACTIVE = 'active'\nconst CLASS_NAME_SLIDE = 'slide'\nconst CLASS_NAME_END = 'carousel-item-end'\nconst CLASS_NAME_START = 'carousel-item-start'\nconst CLASS_NAME_NEXT = 'carousel-item-next'\nconst CLASS_NAME_PREV = 'carousel-item-prev'\n\nconst SELECTOR_ACTIVE = '.active'\nconst SELECTOR_ITEM = '.carousel-item'\nconst SELECTOR_ACTIVE_ITEM = SELECTOR_ACTIVE + SELECTOR_ITEM\nconst SELECTOR_ITEM_IMG = '.carousel-item img'\nconst SELECTOR_INDICATORS = '.carousel-indicators'\nconst SELECTOR_DATA_SLIDE = '[data-bs-slide], [data-bs-slide-to]'\nconst SELECTOR_DATA_RIDE = '[data-bs-ride=\"carousel\"]'\n\nconst KEY_TO_DIRECTION = {\n [ARROW_LEFT_KEY]: DIRECTION_RIGHT,\n [ARROW_RIGHT_KEY]: DIRECTION_LEFT\n}\n\nconst Default = {\n interval: 5000,\n keyboard: true,\n pause: 'hover',\n ride: false,\n touch: true,\n wrap: true\n}\n\nconst DefaultType = {\n interval: '(number|boolean)', // TODO:v6 remove boolean support\n keyboard: 'boolean',\n pause: '(string|boolean)',\n ride: '(boolean|string)',\n touch: 'boolean',\n wrap: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Carousel extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._interval = null\n this._activeElement = null\n this._isSliding = false\n this.touchTimeout = null\n this._swipeHelper = null\n\n this._indicatorsElement = SelectorEngine.findOne(SELECTOR_INDICATORS, this._element)\n this._addEventListeners()\n\n if (this._config.ride === CLASS_NAME_CAROUSEL) {\n this.cycle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n next() {\n this._slide(ORDER_NEXT)\n }\n\n nextWhenVisible() {\n // FIXME TODO use `document.visibilityState`\n // Don't call next when the page isn't visible\n // or the carousel or its parent isn't visible\n if (!document.hidden && isVisible(this._element)) {\n this.next()\n }\n }\n\n prev() {\n this._slide(ORDER_PREV)\n }\n\n pause() {\n if (this._isSliding) {\n triggerTransitionEnd(this._element)\n }\n\n this._clearInterval()\n }\n\n cycle() {\n this._clearInterval()\n this._updateInterval()\n\n this._interval = setInterval(() => this.nextWhenVisible(), this._config.interval)\n }\n\n _maybeEnableCycle() {\n if (!this._config.ride) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.cycle())\n return\n }\n\n this.cycle()\n }\n\n to(index) {\n const items = this._getItems()\n if (index > items.length - 1 || index < 0) {\n return\n }\n\n if (this._isSliding) {\n EventHandler.one(this._element, EVENT_SLID, () => this.to(index))\n return\n }\n\n const activeIndex = this._getItemIndex(this._getActive())\n if (activeIndex === index) {\n return\n }\n\n const order = index > activeIndex ? ORDER_NEXT : ORDER_PREV\n\n this._slide(order, items[index])\n }\n\n dispose() {\n if (this._swipeHelper) {\n this._swipeHelper.dispose()\n }\n\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n config.defaultInterval = config.interval\n return config\n }\n\n _addEventListeners() {\n if (this._config.keyboard) {\n EventHandler.on(this._element, EVENT_KEYDOWN, event => this._keydown(event))\n }\n\n if (this._config.pause === 'hover') {\n EventHandler.on(this._element, EVENT_MOUSEENTER, () => this.pause())\n EventHandler.on(this._element, EVENT_MOUSELEAVE, () => this._maybeEnableCycle())\n }\n\n if (this._config.touch && Swipe.isSupported()) {\n this._addTouchEventListeners()\n }\n }\n\n _addTouchEventListeners() {\n for (const img of SelectorEngine.find(SELECTOR_ITEM_IMG, this._element)) {\n EventHandler.on(img, EVENT_DRAG_START, event => event.preventDefault())\n }\n\n const endCallBack = () => {\n if (this._config.pause !== 'hover') {\n return\n }\n\n // If it's a touch-enabled device, mouseenter/leave are fired as\n // part of the mouse compatibility events on first tap - the carousel\n // would stop cycling until user tapped out of it;\n // here, we listen for touchend, explicitly pause the carousel\n // (as if it's the second time we tap on it, mouseenter compat event\n // is NOT fired) and after a timeout (to allow for mouse compatibility\n // events to fire) we explicitly restart cycling\n\n this.pause()\n if (this.touchTimeout) {\n clearTimeout(this.touchTimeout)\n }\n\n this.touchTimeout = setTimeout(() => this._maybeEnableCycle(), TOUCHEVENT_COMPAT_WAIT + this._config.interval)\n }\n\n const swipeConfig = {\n leftCallback: () => this._slide(this._directionToOrder(DIRECTION_LEFT)),\n rightCallback: () => this._slide(this._directionToOrder(DIRECTION_RIGHT)),\n endCallback: endCallBack\n }\n\n this._swipeHelper = new Swipe(this._element, swipeConfig)\n }\n\n _keydown(event) {\n if (/input|textarea/i.test(event.target.tagName)) {\n return\n }\n\n const direction = KEY_TO_DIRECTION[event.key]\n if (direction) {\n event.preventDefault()\n this._slide(this._directionToOrder(direction))\n }\n }\n\n _getItemIndex(element) {\n return this._getItems().indexOf(element)\n }\n\n _setActiveIndicatorElement(index) {\n if (!this._indicatorsElement) {\n return\n }\n\n const activeIndicator = SelectorEngine.findOne(SELECTOR_ACTIVE, this._indicatorsElement)\n\n activeIndicator.classList.remove(CLASS_NAME_ACTIVE)\n activeIndicator.removeAttribute('aria-current')\n\n const newActiveIndicator = SelectorEngine.findOne(`[data-bs-slide-to=\"${index}\"]`, this._indicatorsElement)\n\n if (newActiveIndicator) {\n newActiveIndicator.classList.add(CLASS_NAME_ACTIVE)\n newActiveIndicator.setAttribute('aria-current', 'true')\n }\n }\n\n _updateInterval() {\n const element = this._activeElement || this._getActive()\n\n if (!element) {\n return\n }\n\n const elementInterval = Number.parseInt(element.getAttribute('data-bs-interval'), 10)\n\n this._config.interval = elementInterval || this._config.defaultInterval\n }\n\n _slide(order, element = null) {\n if (this._isSliding) {\n return\n }\n\n const activeElement = this._getActive()\n const isNext = order === ORDER_NEXT\n const nextElement = element || getNextActiveElement(this._getItems(), activeElement, isNext, this._config.wrap)\n\n if (nextElement === activeElement) {\n return\n }\n\n const nextElementIndex = this._getItemIndex(nextElement)\n\n const triggerEvent = eventName => {\n return EventHandler.trigger(this._element, eventName, {\n relatedTarget: nextElement,\n direction: this._orderToDirection(order),\n from: this._getItemIndex(activeElement),\n to: nextElementIndex\n })\n }\n\n const slideEvent = triggerEvent(EVENT_SLIDE)\n\n if (slideEvent.defaultPrevented) {\n return\n }\n\n if (!activeElement || !nextElement) {\n // Some weirdness is happening, so we bail\n // TODO: change tests that use empty divs to avoid this check\n return\n }\n\n const isCycling = Boolean(this._interval)\n this.pause()\n\n this._isSliding = true\n\n this._setActiveIndicatorElement(nextElementIndex)\n this._activeElement = nextElement\n\n const directionalClassName = isNext ? CLASS_NAME_START : CLASS_NAME_END\n const orderClassName = isNext ? CLASS_NAME_NEXT : CLASS_NAME_PREV\n\n nextElement.classList.add(orderClassName)\n\n reflow(nextElement)\n\n activeElement.classList.add(directionalClassName)\n nextElement.classList.add(directionalClassName)\n\n const completeCallBack = () => {\n nextElement.classList.remove(directionalClassName, orderClassName)\n nextElement.classList.add(CLASS_NAME_ACTIVE)\n\n activeElement.classList.remove(CLASS_NAME_ACTIVE, orderClassName, directionalClassName)\n\n this._isSliding = false\n\n triggerEvent(EVENT_SLID)\n }\n\n this._queueCallback(completeCallBack, activeElement, this._isAnimated())\n\n if (isCycling) {\n this.cycle()\n }\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_SLIDE)\n }\n\n _getActive() {\n return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM, this._element)\n }\n\n _getItems() {\n return SelectorEngine.find(SELECTOR_ITEM, this._element)\n }\n\n _clearInterval() {\n if (this._interval) {\n clearInterval(this._interval)\n this._interval = null\n }\n }\n\n _directionToOrder(direction) {\n if (isRTL()) {\n return direction === DIRECTION_LEFT ? ORDER_PREV : ORDER_NEXT\n }\n\n return direction === DIRECTION_LEFT ? ORDER_NEXT : ORDER_PREV\n }\n\n _orderToDirection(order) {\n if (isRTL()) {\n return order === ORDER_PREV ? DIRECTION_LEFT : DIRECTION_RIGHT\n }\n\n return order === ORDER_PREV ? DIRECTION_RIGHT : DIRECTION_LEFT\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Carousel.getOrCreateInstance(this, config)\n\n if (typeof config === 'number') {\n data.to(config)\n return\n }\n\n if (typeof config === 'string') {\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_SLIDE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (!target || !target.classList.contains(CLASS_NAME_CAROUSEL)) {\n return\n }\n\n event.preventDefault()\n\n const carousel = Carousel.getOrCreateInstance(target)\n const slideIndex = this.getAttribute('data-bs-slide-to')\n\n if (slideIndex) {\n carousel.to(slideIndex)\n carousel._maybeEnableCycle()\n return\n }\n\n if (Manipulator.getDataAttribute(this, 'slide') === 'next') {\n carousel.next()\n carousel._maybeEnableCycle()\n return\n }\n\n carousel.prev()\n carousel._maybeEnableCycle()\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n const carousels = SelectorEngine.find(SELECTOR_DATA_RIDE)\n\n for (const carousel of carousels) {\n Carousel.getOrCreateInstance(carousel)\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Carousel)\n\nexport default Carousel\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap collapse.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n getElement,\n reflow\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'collapse'\nconst DATA_KEY = 'bs.collapse'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_COLLAPSE = 'collapse'\nconst CLASS_NAME_COLLAPSING = 'collapsing'\nconst CLASS_NAME_COLLAPSED = 'collapsed'\nconst CLASS_NAME_DEEPER_CHILDREN = `:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`\nconst CLASS_NAME_HORIZONTAL = 'collapse-horizontal'\n\nconst WIDTH = 'width'\nconst HEIGHT = 'height'\n\nconst SELECTOR_ACTIVES = '.collapse.show, .collapse.collapsing'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"collapse\"]'\n\nconst Default = {\n parent: null,\n toggle: true\n}\n\nconst DefaultType = {\n parent: '(null|element)',\n toggle: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Collapse extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isTransitioning = false\n this._triggerArray = []\n\n const toggleList = SelectorEngine.find(SELECTOR_DATA_TOGGLE)\n\n for (const elem of toggleList) {\n const selector = SelectorEngine.getSelectorFromElement(elem)\n const filterElement = SelectorEngine.find(selector)\n .filter(foundElement => foundElement === this._element)\n\n if (selector !== null && filterElement.length) {\n this._triggerArray.push(elem)\n }\n }\n\n this._initializeChildren()\n\n if (!this._config.parent) {\n this._addAriaAndCollapsedClass(this._triggerArray, this._isShown())\n }\n\n if (this._config.toggle) {\n this.toggle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n if (this._isShown()) {\n this.hide()\n } else {\n this.show()\n }\n }\n\n show() {\n if (this._isTransitioning || this._isShown()) {\n return\n }\n\n let activeChildren = []\n\n // find active children\n if (this._config.parent) {\n activeChildren = this._getFirstLevelChildren(SELECTOR_ACTIVES)\n .filter(element => element !== this._element)\n .map(element => Collapse.getOrCreateInstance(element, { toggle: false }))\n }\n\n if (activeChildren.length && activeChildren[0]._isTransitioning) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_SHOW)\n if (startEvent.defaultPrevented) {\n return\n }\n\n for (const activeInstance of activeChildren) {\n activeInstance.hide()\n }\n\n const dimension = this._getDimension()\n\n this._element.classList.remove(CLASS_NAME_COLLAPSE)\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n\n this._element.style[dimension] = 0\n\n this._addAriaAndCollapsedClass(this._triggerArray, true)\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n this._element.style[dimension] = ''\n\n EventHandler.trigger(this._element, EVENT_SHOWN)\n }\n\n const capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1)\n const scrollSize = `scroll${capitalizedDimension}`\n\n this._queueCallback(complete, this._element, true)\n this._element.style[dimension] = `${this._element[scrollSize]}px`\n }\n\n hide() {\n if (this._isTransitioning || !this._isShown()) {\n return\n }\n\n const startEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n if (startEvent.defaultPrevented) {\n return\n }\n\n const dimension = this._getDimension()\n\n this._element.style[dimension] = `${this._element.getBoundingClientRect()[dimension]}px`\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_COLLAPSING)\n this._element.classList.remove(CLASS_NAME_COLLAPSE, CLASS_NAME_SHOW)\n\n for (const trigger of this._triggerArray) {\n const element = SelectorEngine.getElementFromSelector(trigger)\n\n if (element && !this._isShown(element)) {\n this._addAriaAndCollapsedClass([trigger], false)\n }\n }\n\n this._isTransitioning = true\n\n const complete = () => {\n this._isTransitioning = false\n this._element.classList.remove(CLASS_NAME_COLLAPSING)\n this._element.classList.add(CLASS_NAME_COLLAPSE)\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._element.style[dimension] = ''\n\n this._queueCallback(complete, this._element, true)\n }\n\n _isShown(element = this._element) {\n return element.classList.contains(CLASS_NAME_SHOW)\n }\n\n // Private\n _configAfterMerge(config) {\n config.toggle = Boolean(config.toggle) // Coerce string values\n config.parent = getElement(config.parent)\n return config\n }\n\n _getDimension() {\n return this._element.classList.contains(CLASS_NAME_HORIZONTAL) ? WIDTH : HEIGHT\n }\n\n _initializeChildren() {\n if (!this._config.parent) {\n return\n }\n\n const children = this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE)\n\n for (const element of children) {\n const selected = SelectorEngine.getElementFromSelector(element)\n\n if (selected) {\n this._addAriaAndCollapsedClass([element], this._isShown(selected))\n }\n }\n }\n\n _getFirstLevelChildren(selector) {\n const children = SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN, this._config.parent)\n // remove children if greater depth\n return SelectorEngine.find(selector, this._config.parent).filter(element => !children.includes(element))\n }\n\n _addAriaAndCollapsedClass(triggerArray, isOpen) {\n if (!triggerArray.length) {\n return\n }\n\n for (const element of triggerArray) {\n element.classList.toggle(CLASS_NAME_COLLAPSED, !isOpen)\n element.setAttribute('aria-expanded', isOpen)\n }\n }\n\n // Static\n static jQueryInterface(config) {\n const _config = {}\n if (typeof config === 'string' && /show|hide/.test(config)) {\n _config.toggle = false\n }\n\n return this.each(function () {\n const data = Collapse.getOrCreateInstance(this, _config)\n\n if (typeof config === 'string') {\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n }\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n // preventDefault only for elements (which change the URL) not inside the collapsible element\n if (event.target.tagName === 'A' || (event.delegateTarget && event.delegateTarget.tagName === 'A')) {\n event.preventDefault()\n }\n\n for (const element of SelectorEngine.getMultipleElementsFromSelector(this)) {\n Collapse.getOrCreateInstance(element, { toggle: false }).toggle()\n }\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Collapse)\n\nexport default Collapse\n","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","export default function getUAString() {\n var uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands && Array.isArray(uaData.brands)) {\n return uaData.brands.map(function (item) {\n return item.brand + \"/\" + item.version;\n }).join(' ');\n }\n\n return navigator.userAgent;\n}","import getUAString from \"../utils/userAgent.js\";\nexport default function isLayoutViewport() {\n return !/^((?!chrome|android).)*safari/i.test(getUAString());\n}","import { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nimport getWindow from \"./getWindow.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getBoundingClientRect(element, includeScale, isFixedStrategy) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n var clientRect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n var _ref = isElement(element) ? getWindow(element) : window,\n visualViewport = _ref.visualViewport;\n\n var addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n var x = (clientRect.left + (addVisualOffsets && visualViewport ? visualViewport.offsetLeft : 0)) / scaleX;\n var y = (clientRect.top + (addVisualOffsets && visualViewport ? visualViewport.offsetTop : 0)) / scaleY;\n var width = clientRect.width / scaleX;\n var height = clientRect.height / scaleY;\n return {\n width: width,\n height: height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x: x,\n y: y\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getUAString from \"../utils/userAgent.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = /firefox/i.test(getUAString());\n var isIE = /Trident/i.test(getUAString());\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref, win) {\n var x = _ref.x,\n y = _ref.y;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }, getWindow(popper)) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element, strategy) {\n var rect = getBoundingClientRect(element, false, strategy === 'fixed');\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent, strategy) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element, strategy)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent, strategy) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary, strategy) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent, strategy));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport isLayoutViewport from \"./isLayoutViewport.js\";\nexport default function getViewportRect(element, strategy) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n var layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$strategy = _options.strategy,\n strategy = _options$strategy === void 0 ? state.strategy : _options$strategy,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary, strategy);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled, isFixed);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n });\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref) {\n var name = _ref.name,\n _ref$options = _ref.options,\n options = _ref$options === void 0 ? {} : _ref$options,\n effect = _ref.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow };","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","/**\n * --------------------------------------------------------------------------\n * Bootstrap dropdown.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport {\n defineJQueryPlugin,\n execute,\n getElement,\n getNextActiveElement,\n isDisabled,\n isElement,\n isRTL,\n isVisible,\n noop\n} from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'dropdown'\nconst DATA_KEY = 'bs.dropdown'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst ESCAPE_KEY = 'Escape'\nconst TAB_KEY = 'Tab'\nconst ARROW_UP_KEY = 'ArrowUp'\nconst ARROW_DOWN_KEY = 'ArrowDown'\nconst RIGHT_MOUSE_BUTTON = 2 // MouseEvent.button value for the secondary button, usually the right button\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DATA_API = `keydown${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYUP_DATA_API = `keyup${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_DROPUP = 'dropup'\nconst CLASS_NAME_DROPEND = 'dropend'\nconst CLASS_NAME_DROPSTART = 'dropstart'\nconst CLASS_NAME_DROPUP_CENTER = 'dropup-center'\nconst CLASS_NAME_DROPDOWN_CENTER = 'dropdown-center'\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"dropdown\"]:not(.disabled):not(:disabled)'\nconst SELECTOR_DATA_TOGGLE_SHOWN = `${SELECTOR_DATA_TOGGLE}.${CLASS_NAME_SHOW}`\nconst SELECTOR_MENU = '.dropdown-menu'\nconst SELECTOR_NAVBAR = '.navbar'\nconst SELECTOR_NAVBAR_NAV = '.navbar-nav'\nconst SELECTOR_VISIBLE_ITEMS = '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)'\n\nconst PLACEMENT_TOP = isRTL() ? 'top-end' : 'top-start'\nconst PLACEMENT_TOPEND = isRTL() ? 'top-start' : 'top-end'\nconst PLACEMENT_BOTTOM = isRTL() ? 'bottom-end' : 'bottom-start'\nconst PLACEMENT_BOTTOMEND = isRTL() ? 'bottom-start' : 'bottom-end'\nconst PLACEMENT_RIGHT = isRTL() ? 'left-start' : 'right-start'\nconst PLACEMENT_LEFT = isRTL() ? 'right-start' : 'left-start'\nconst PLACEMENT_TOPCENTER = 'top'\nconst PLACEMENT_BOTTOMCENTER = 'bottom'\n\nconst Default = {\n autoClose: true,\n boundary: 'clippingParents',\n display: 'dynamic',\n offset: [0, 2],\n popperConfig: null,\n reference: 'toggle'\n}\n\nconst DefaultType = {\n autoClose: '(boolean|string)',\n boundary: '(string|element)',\n display: 'string',\n offset: '(array|string|function)',\n popperConfig: '(null|object|function)',\n reference: '(string|element|object)'\n}\n\n/**\n * Class definition\n */\n\nclass Dropdown extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._popper = null\n this._parent = this._element.parentNode // dropdown wrapper\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n this._menu = SelectorEngine.next(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.prev(this._element, SELECTOR_MENU)[0] ||\n SelectorEngine.findOne(SELECTOR_MENU, this._parent)\n this._inNavbar = this._detectNavbar()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle() {\n return this._isShown() ? this.hide() : this.show()\n }\n\n show() {\n if (isDisabled(this._element) || this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, relatedTarget)\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._createPopper()\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement && !this._parent.closest(SELECTOR_NAVBAR_NAV)) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n this._element.focus()\n this._element.setAttribute('aria-expanded', true)\n\n this._menu.classList.add(CLASS_NAME_SHOW)\n this._element.classList.add(CLASS_NAME_SHOW)\n EventHandler.trigger(this._element, EVENT_SHOWN, relatedTarget)\n }\n\n hide() {\n if (isDisabled(this._element) || !this._isShown()) {\n return\n }\n\n const relatedTarget = {\n relatedTarget: this._element\n }\n\n this._completeHide(relatedTarget)\n }\n\n dispose() {\n if (this._popper) {\n this._popper.destroy()\n }\n\n super.dispose()\n }\n\n update() {\n this._inNavbar = this._detectNavbar()\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Private\n _completeHide(relatedTarget) {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE, relatedTarget)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n if (this._popper) {\n this._popper.destroy()\n }\n\n this._menu.classList.remove(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOW)\n this._element.setAttribute('aria-expanded', 'false')\n Manipulator.removeDataAttribute(this._menu, 'popper')\n EventHandler.trigger(this._element, EVENT_HIDDEN, relatedTarget)\n }\n\n _getConfig(config) {\n config = super._getConfig(config)\n\n if (typeof config.reference === 'object' && !isElement(config.reference) &&\n typeof config.reference.getBoundingClientRect !== 'function'\n ) {\n // Popper virtual elements require a getBoundingClientRect method\n throw new TypeError(`${NAME.toUpperCase()}: Option \"reference\" provided type \"object\" without a required \"getBoundingClientRect\" method.`)\n }\n\n return config\n }\n\n _createPopper() {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s dropdowns require Popper (https://popper.js.org)')\n }\n\n let referenceElement = this._element\n\n if (this._config.reference === 'parent') {\n referenceElement = this._parent\n } else if (isElement(this._config.reference)) {\n referenceElement = getElement(this._config.reference)\n } else if (typeof this._config.reference === 'object') {\n referenceElement = this._config.reference\n }\n\n const popperConfig = this._getPopperConfig()\n this._popper = Popper.createPopper(referenceElement, this._menu, popperConfig)\n }\n\n _isShown() {\n return this._menu.classList.contains(CLASS_NAME_SHOW)\n }\n\n _getPlacement() {\n const parentDropdown = this._parent\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPEND)) {\n return PLACEMENT_RIGHT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPSTART)) {\n return PLACEMENT_LEFT\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP_CENTER)) {\n return PLACEMENT_TOPCENTER\n }\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPDOWN_CENTER)) {\n return PLACEMENT_BOTTOMCENTER\n }\n\n // We need to trim the value because custom properties can also include spaces\n const isEnd = getComputedStyle(this._menu).getPropertyValue('--bs-position').trim() === 'end'\n\n if (parentDropdown.classList.contains(CLASS_NAME_DROPUP)) {\n return isEnd ? PLACEMENT_TOPEND : PLACEMENT_TOP\n }\n\n return isEnd ? PLACEMENT_BOTTOMEND : PLACEMENT_BOTTOM\n }\n\n _detectNavbar() {\n return this._element.closest(SELECTOR_NAVBAR) !== null\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _getPopperConfig() {\n const defaultBsPopperConfig = {\n placement: this._getPlacement(),\n modifiers: [{\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n }]\n }\n\n // Disable Popper if we have a static display or Dropdown is in Navbar\n if (this._inNavbar || this._config.display === 'static') {\n Manipulator.setDataAttribute(this._menu, 'popper', 'static') // TODO: v6 remove\n defaultBsPopperConfig.modifiers = [{\n name: 'applyStyles',\n enabled: false\n }]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n }\n }\n\n _selectMenuItem({ key, target }) {\n const items = SelectorEngine.find(SELECTOR_VISIBLE_ITEMS, this._menu).filter(element => isVisible(element))\n\n if (!items.length) {\n return\n }\n\n // if target isn't included in items (e.g. when expanding the dropdown)\n // allow cycling to get the last item in case key equals ARROW_UP_KEY\n getNextActiveElement(items, target, key === ARROW_DOWN_KEY, !items.includes(target)).focus()\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Dropdown.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n\n static clearMenus(event) {\n if (event.button === RIGHT_MOUSE_BUTTON || (event.type === 'keyup' && event.key !== TAB_KEY)) {\n return\n }\n\n const openToggles = SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN)\n\n for (const toggle of openToggles) {\n const context = Dropdown.getInstance(toggle)\n if (!context || context._config.autoClose === false) {\n continue\n }\n\n const composedPath = event.composedPath()\n const isMenuTarget = composedPath.includes(context._menu)\n if (\n composedPath.includes(context._element) ||\n (context._config.autoClose === 'inside' && !isMenuTarget) ||\n (context._config.autoClose === 'outside' && isMenuTarget)\n ) {\n continue\n }\n\n // Tab navigation through the dropdown menu or events from contained inputs shouldn't close the menu\n if (context._menu.contains(event.target) && ((event.type === 'keyup' && event.key === TAB_KEY) || /input|select|option|textarea|form/i.test(event.target.tagName))) {\n continue\n }\n\n const relatedTarget = { relatedTarget: context._element }\n\n if (event.type === 'click') {\n relatedTarget.clickEvent = event\n }\n\n context._completeHide(relatedTarget)\n }\n }\n\n static dataApiKeydownHandler(event) {\n // If not an UP | DOWN | ESCAPE key => not a dropdown command\n // If input/textarea && if key is other than ESCAPE => not a dropdown command\n\n const isInput = /input|textarea/i.test(event.target.tagName)\n const isEscapeEvent = event.key === ESCAPE_KEY\n const isUpOrDownEvent = [ARROW_UP_KEY, ARROW_DOWN_KEY].includes(event.key)\n\n if (!isUpOrDownEvent && !isEscapeEvent) {\n return\n }\n\n if (isInput && !isEscapeEvent) {\n return\n }\n\n event.preventDefault()\n\n // TODO: v6 revert #37011 & change markup https://getbootstrap.com/docs/5.3/forms/input-group/\n const getToggleButton = this.matches(SELECTOR_DATA_TOGGLE) ?\n this :\n (SelectorEngine.prev(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.next(this, SELECTOR_DATA_TOGGLE)[0] ||\n SelectorEngine.findOne(SELECTOR_DATA_TOGGLE, event.delegateTarget.parentNode))\n\n const instance = Dropdown.getOrCreateInstance(getToggleButton)\n\n if (isUpOrDownEvent) {\n event.stopPropagation()\n instance.show()\n instance._selectMenuItem(event)\n return\n }\n\n if (instance._isShown()) { // else is escape and we check if it is shown\n event.stopPropagation()\n instance.hide()\n getToggleButton.focus()\n }\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_DATA_TOGGLE, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_KEYDOWN_DATA_API, SELECTOR_MENU, Dropdown.dataApiKeydownHandler)\nEventHandler.on(document, EVENT_CLICK_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_KEYUP_DATA_API, Dropdown.clearMenus)\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n event.preventDefault()\n Dropdown.getOrCreateInstance(this).toggle()\n})\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Dropdown)\n\nexport default Dropdown\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport Config from './config.js'\nimport { execute, executeAfterTransition, getElement, reflow } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'backdrop'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`\n\nconst Default = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true, // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n}\n\nconst DefaultType = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n}\n\n/**\n * Class definition\n */\n\nclass Backdrop extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isAppended = false\n this._element = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._append()\n\n const element = this._getElement()\n if (this._config.isAnimated) {\n reflow(element)\n }\n\n element.classList.add(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n execute(callback)\n })\n }\n\n hide(callback) {\n if (!this._config.isVisible) {\n execute(callback)\n return\n }\n\n this._getElement().classList.remove(CLASS_NAME_SHOW)\n\n this._emulateAnimation(() => {\n this.dispose()\n execute(callback)\n })\n }\n\n dispose() {\n if (!this._isAppended) {\n return\n }\n\n EventHandler.off(this._element, EVENT_MOUSEDOWN)\n\n this._element.remove()\n this._isAppended = false\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div')\n backdrop.className = this._config.className\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE)\n }\n\n this._element = backdrop\n }\n\n return this._element\n }\n\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = getElement(config.rootElement)\n return config\n }\n\n _append() {\n if (this._isAppended) {\n return\n }\n\n const element = this._getElement()\n this._config.rootElement.append(element)\n\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n execute(this._config.clickCallback)\n })\n\n this._isAppended = true\n }\n\n _emulateAnimation(callback) {\n executeAfterTransition(callback, this._getElement(), this._config.isAnimated)\n }\n}\n\nexport default Backdrop\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport EventHandler from '../dom/event-handler.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'focustrap'\nconst DATA_KEY = 'bs.focustrap'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst EVENT_FOCUSIN = `focusin${EVENT_KEY}`\nconst EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`\n\nconst TAB_KEY = 'Tab'\nconst TAB_NAV_FORWARD = 'forward'\nconst TAB_NAV_BACKWARD = 'backward'\n\nconst Default = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n}\n\nconst DefaultType = {\n autofocus: 'boolean',\n trapElement: 'element'\n}\n\n/**\n * Class definition\n */\n\nclass FocusTrap extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n this._isActive = false\n this._lastTabNavDirection = null\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return\n }\n\n if (this._config.autofocus) {\n this._config.trapElement.focus()\n }\n\n EventHandler.off(document, EVENT_KEY) // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event))\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event))\n\n this._isActive = true\n }\n\n deactivate() {\n if (!this._isActive) {\n return\n }\n\n this._isActive = false\n EventHandler.off(document, EVENT_KEY)\n }\n\n // Private\n _handleFocusin(event) {\n const { trapElement } = this._config\n\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return\n }\n\n const elements = SelectorEngine.focusableChildren(trapElement)\n\n if (elements.length === 0) {\n trapElement.focus()\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus()\n } else {\n elements[0].focus()\n }\n }\n\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return\n }\n\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD\n }\n}\n\nexport default FocusTrap\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Manipulator from '../dom/manipulator.js'\nimport SelectorEngine from '../dom/selector-engine.js'\nimport { isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top'\nconst SELECTOR_STICKY_CONTENT = '.sticky-top'\nconst PROPERTY_PADDING = 'padding-right'\nconst PROPERTY_MARGIN = 'margin-right'\n\n/**\n * Class definition\n */\n\nclass ScrollBarHelper {\n constructor() {\n this._element = document.body\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth\n return Math.abs(window.innerWidth - documentWidth)\n }\n\n hide() {\n const width = this.getWidth()\n this._disableOverFlow()\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width)\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width)\n }\n\n reset() {\n this._resetElementAttributes(this._element, 'overflow')\n this._resetElementAttributes(this._element, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING)\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN)\n }\n\n isOverflowing() {\n return this.getWidth() > 0\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow')\n this._element.style.overflow = 'hidden'\n }\n\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth()\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return\n }\n\n this._saveInitialAttribute(element, styleProperty)\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty)\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty)\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue)\n }\n }\n\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty)\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty)\n return\n }\n\n Manipulator.removeDataAttribute(element, styleProperty)\n element.style.setProperty(styleProperty, value)\n }\n\n this._applyManipulationCallback(selector, manipulationCallBack)\n }\n\n _applyManipulationCallback(selector, callBack) {\n if (isElement(selector)) {\n callBack(selector)\n return\n }\n\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel)\n }\n }\n}\n\nexport default ScrollBarHelper\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport { defineJQueryPlugin, isRTL, isVisible, reflow } from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'modal'\nconst DATA_KEY = 'bs.modal'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst ESCAPE_KEY = 'Escape'\n\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`\nconst EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_OPEN = 'modal-open'\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_STATIC = 'modal-static'\n\nconst OPEN_SELECTOR = '.modal.show'\nconst SELECTOR_DIALOG = '.modal-dialog'\nconst SELECTOR_MODAL_BODY = '.modal-body'\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]'\n\nconst Default = {\n backdrop: true,\n focus: true,\n keyboard: true\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element)\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._isShown = false\n this._isTransitioning = false\n this._scrollBar = new ScrollBarHelper()\n\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._isTransitioning = true\n\n this._scrollBar.hide()\n\n document.body.classList.add(CLASS_NAME_OPEN)\n\n this._adjustDialog()\n\n this._backdrop.show(() => this._showElement(relatedTarget))\n }\n\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._isShown = false\n this._isTransitioning = true\n this._focustrap.deactivate()\n\n this._element.classList.remove(CLASS_NAME_SHOW)\n\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated())\n }\n\n dispose() {\n EventHandler.off(window, EVENT_KEY)\n EventHandler.off(this._dialog, EVENT_KEY)\n\n this._backdrop.dispose()\n this._focustrap.deactivate()\n\n super.dispose()\n }\n\n handleUpdate() {\n this._adjustDialog()\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop), // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element)\n }\n\n this._element.style.display = 'block'\n this._element.removeAttribute('aria-hidden')\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.scrollTop = 0\n\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog)\n if (modalBody) {\n modalBody.scrollTop = 0\n }\n\n reflow(this._element)\n\n this._element.classList.add(CLASS_NAME_SHOW)\n\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate()\n }\n\n this._isTransitioning = false\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n })\n }\n\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated())\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n this._triggerBackdropTransition()\n })\n\n EventHandler.on(window, EVENT_RESIZE, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog()\n }\n })\n\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return\n }\n\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition()\n return\n }\n\n if (this._config.backdrop) {\n this.hide()\n }\n })\n })\n }\n\n _hideModal() {\n this._element.style.display = 'none'\n this._element.setAttribute('aria-hidden', true)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n this._isTransitioning = false\n\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN)\n this._resetAdjustments()\n this._scrollBar.reset()\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n })\n }\n\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE)\n }\n\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const initialOverflowY = this._element.style.overflowY\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return\n }\n\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden'\n }\n\n this._element.classList.add(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC)\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY\n }, this._dialog)\n }, this._dialog)\n\n this._element.focus()\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight\n const scrollbarWidth = this._scrollBar.getWidth()\n const isBodyOverflowing = scrollbarWidth > 0\n\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = isRTL() ? 'paddingLeft' : 'paddingRight'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = isRTL() ? 'paddingRight' : 'paddingLeft'\n this._element.style[property] = `${scrollbarWidth}px`\n }\n }\n\n _resetAdjustments() {\n this._element.style.paddingLeft = ''\n this._element.style.paddingRight = ''\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](relatedTarget)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (isVisible(this)) {\n this.focus()\n }\n })\n })\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide()\n }\n\n const data = Modal.getOrCreateInstance(target)\n\n data.toggle(this)\n})\n\nenableDismissTrigger(Modal)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Modal)\n\nexport default Modal\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap offcanvas.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport Backdrop from './util/backdrop.js'\nimport { enableDismissTrigger } from './util/component-functions.js'\nimport FocusTrap from './util/focustrap.js'\nimport {\n defineJQueryPlugin,\n isDisabled,\n isVisible\n} from './util/index.js'\nimport ScrollBarHelper from './util/scrollbar.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'offcanvas'\nconst DATA_KEY = 'bs.offcanvas'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\nconst ESCAPE_KEY = 'Escape'\n\nconst CLASS_NAME_SHOW = 'show'\nconst CLASS_NAME_SHOWING = 'showing'\nconst CLASS_NAME_HIDING = 'hiding'\nconst CLASS_NAME_BACKDROP = 'offcanvas-backdrop'\nconst OPEN_SELECTOR = '.offcanvas.show'\n\nconst EVENT_SHOW = `show${EVENT_KEY}`\nconst EVENT_SHOWN = `shown${EVENT_KEY}`\nconst EVENT_HIDE = `hide${EVENT_KEY}`\nconst EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`\nconst EVENT_HIDDEN = `hidden${EVENT_KEY}`\nconst EVENT_RESIZE = `resize${EVENT_KEY}`\nconst EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`\nconst EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`\n\nconst SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"offcanvas\"]'\n\nconst Default = {\n backdrop: true,\n keyboard: true,\n scroll: false\n}\n\nconst DefaultType = {\n backdrop: '(boolean|string)',\n keyboard: 'boolean',\n scroll: 'boolean'\n}\n\n/**\n * Class definition\n */\n\nclass Offcanvas extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n this._isShown = false\n this._backdrop = this._initializeBackDrop()\n this._focustrap = this._initializeFocusTrap()\n this._addEventListeners()\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget)\n }\n\n show(relatedTarget) {\n if (this._isShown) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, { relatedTarget })\n\n if (showEvent.defaultPrevented) {\n return\n }\n\n this._isShown = true\n this._backdrop.show()\n\n if (!this._config.scroll) {\n new ScrollBarHelper().hide()\n }\n\n this._element.setAttribute('aria-modal', true)\n this._element.setAttribute('role', 'dialog')\n this._element.classList.add(CLASS_NAME_SHOWING)\n\n const completeCallBack = () => {\n if (!this._config.scroll || this._config.backdrop) {\n this._focustrap.activate()\n }\n\n this._element.classList.add(CLASS_NAME_SHOW)\n this._element.classList.remove(CLASS_NAME_SHOWING)\n EventHandler.trigger(this._element, EVENT_SHOWN, { relatedTarget })\n }\n\n this._queueCallback(completeCallBack, this._element, true)\n }\n\n hide() {\n if (!this._isShown) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE)\n\n if (hideEvent.defaultPrevented) {\n return\n }\n\n this._focustrap.deactivate()\n this._element.blur()\n this._isShown = false\n this._element.classList.add(CLASS_NAME_HIDING)\n this._backdrop.hide()\n\n const completeCallback = () => {\n this._element.classList.remove(CLASS_NAME_SHOW, CLASS_NAME_HIDING)\n this._element.removeAttribute('aria-modal')\n this._element.removeAttribute('role')\n\n if (!this._config.scroll) {\n new ScrollBarHelper().reset()\n }\n\n EventHandler.trigger(this._element, EVENT_HIDDEN)\n }\n\n this._queueCallback(completeCallback, this._element, true)\n }\n\n dispose() {\n this._backdrop.dispose()\n this._focustrap.deactivate()\n super.dispose()\n }\n\n // Private\n _initializeBackDrop() {\n const clickCallback = () => {\n if (this._config.backdrop === 'static') {\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n return\n }\n\n this.hide()\n }\n\n // 'static' option will be translated to true, and booleans will keep their value\n const isVisible = Boolean(this._config.backdrop)\n\n return new Backdrop({\n className: CLASS_NAME_BACKDROP,\n isVisible,\n isAnimated: true,\n rootElement: this._element.parentNode,\n clickCallback: isVisible ? clickCallback : null\n })\n }\n\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n })\n }\n\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return\n }\n\n if (this._config.keyboard) {\n this.hide()\n return\n }\n\n EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED)\n })\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Offcanvas.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (data[config] === undefined || config.startsWith('_') || config === 'constructor') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config](this)\n })\n }\n}\n\n/**\n * Data API implementation\n */\n\nEventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this)\n\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault()\n }\n\n if (isDisabled(this)) {\n return\n }\n\n EventHandler.one(target, EVENT_HIDDEN, () => {\n // focus on trigger when it is closed\n if (isVisible(this)) {\n this.focus()\n }\n })\n\n // avoid conflict when clicking a toggler of an offcanvas, while another is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR)\n if (alreadyOpen && alreadyOpen !== target) {\n Offcanvas.getInstance(alreadyOpen).hide()\n }\n\n const data = Offcanvas.getOrCreateInstance(target)\n data.toggle(this)\n})\n\nEventHandler.on(window, EVENT_LOAD_DATA_API, () => {\n for (const selector of SelectorEngine.find(OPEN_SELECTOR)) {\n Offcanvas.getOrCreateInstance(selector).show()\n }\n})\n\nEventHandler.on(window, EVENT_RESIZE, () => {\n for (const element of SelectorEngine.find('[aria-modal][class*=show][class*=offcanvas-]')) {\n if (getComputedStyle(element).position !== 'fixed') {\n Offcanvas.getOrCreateInstance(element).hide()\n }\n }\n})\n\nenableDismissTrigger(Offcanvas)\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Offcanvas)\n\nexport default Offcanvas\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/sanitizer.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n// js-docs-start allow-list\nconst ARIA_ATTRIBUTE_PATTERN = /^aria-[\\w-]*$/i\n\nexport const DefaultAllowlist = {\n // Global attributes allowed on any supplied element below.\n '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN],\n a: ['target', 'href', 'title', 'rel'],\n area: [],\n b: [],\n br: [],\n col: [],\n code: [],\n div: [],\n em: [],\n hr: [],\n h1: [],\n h2: [],\n h3: [],\n h4: [],\n h5: [],\n h6: [],\n i: [],\n img: ['src', 'srcset', 'alt', 'title', 'width', 'height'],\n li: [],\n ol: [],\n p: [],\n pre: [],\n s: [],\n small: [],\n span: [],\n sub: [],\n sup: [],\n strong: [],\n u: [],\n ul: []\n}\n// js-docs-end allow-list\n\nconst uriAttributes = new Set([\n 'background',\n 'cite',\n 'href',\n 'itemtype',\n 'longdesc',\n 'poster',\n 'src',\n 'xlink:href'\n])\n\n/**\n * A pattern that recognizes URLs that are safe wrt. XSS in URL navigation\n * contexts.\n *\n * Shout-out to Angular https://github.com/angular/angular/blob/15.2.8/packages/core/src/sanitization/url_sanitizer.ts#L38\n */\n// eslint-disable-next-line unicorn/better-regex\nconst SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i\n\nconst allowedAttribute = (attribute, allowedAttributeList) => {\n const attributeName = attribute.nodeName.toLowerCase()\n\n if (allowedAttributeList.includes(attributeName)) {\n if (uriAttributes.has(attributeName)) {\n return Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue))\n }\n\n return true\n }\n\n // Check if a regular expression validates the attribute.\n return allowedAttributeList.filter(attributeRegex => attributeRegex instanceof RegExp)\n .some(regex => regex.test(attributeName))\n}\n\nexport function sanitizeHtml(unsafeHtml, allowList, sanitizeFunction) {\n if (!unsafeHtml.length) {\n return unsafeHtml\n }\n\n if (sanitizeFunction && typeof sanitizeFunction === 'function') {\n return sanitizeFunction(unsafeHtml)\n }\n\n const domParser = new window.DOMParser()\n const createdDocument = domParser.parseFromString(unsafeHtml, 'text/html')\n const elements = [].concat(...createdDocument.body.querySelectorAll('*'))\n\n for (const element of elements) {\n const elementName = element.nodeName.toLowerCase()\n\n if (!Object.keys(allowList).includes(elementName)) {\n element.remove()\n continue\n }\n\n const attributeList = [].concat(...element.attributes)\n const allowedAttributes = [].concat(allowList['*'] || [], allowList[elementName] || [])\n\n for (const attribute of attributeList) {\n if (!allowedAttribute(attribute, allowedAttributes)) {\n element.removeAttribute(attribute.nodeName)\n }\n }\n }\n\n return createdDocument.body.innerHTML\n}\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap util/template-factory.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport SelectorEngine from '../dom/selector-engine.js'\nimport Config from './config.js'\nimport { DefaultAllowlist, sanitizeHtml } from './sanitizer.js'\nimport { execute, getElement, isElement } from './index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'TemplateFactory'\n\nconst Default = {\n allowList: DefaultAllowlist,\n content: {}, // { selector : text , selector2 : text2 , }\n extraClass: '',\n html: false,\n sanitize: true,\n sanitizeFn: null,\n template: '
'\n}\n\nconst DefaultType = {\n allowList: 'object',\n content: 'object',\n extraClass: '(string|function)',\n html: 'boolean',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n template: 'string'\n}\n\nconst DefaultContentType = {\n entry: '(string|element|function|null)',\n selector: '(string|element)'\n}\n\n/**\n * Class definition\n */\n\nclass TemplateFactory extends Config {\n constructor(config) {\n super()\n this._config = this._getConfig(config)\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n getContent() {\n return Object.values(this._config.content)\n .map(config => this._resolvePossibleFunction(config))\n .filter(Boolean)\n }\n\n hasContent() {\n return this.getContent().length > 0\n }\n\n changeContent(content) {\n this._checkContent(content)\n this._config.content = { ...this._config.content, ...content }\n return this\n }\n\n toHtml() {\n const templateWrapper = document.createElement('div')\n templateWrapper.innerHTML = this._maybeSanitize(this._config.template)\n\n for (const [selector, text] of Object.entries(this._config.content)) {\n this._setContent(templateWrapper, text, selector)\n }\n\n const template = templateWrapper.children[0]\n const extraClass = this._resolvePossibleFunction(this._config.extraClass)\n\n if (extraClass) {\n template.classList.add(...extraClass.split(' '))\n }\n\n return template\n }\n\n // Private\n _typeCheckConfig(config) {\n super._typeCheckConfig(config)\n this._checkContent(config.content)\n }\n\n _checkContent(arg) {\n for (const [selector, content] of Object.entries(arg)) {\n super._typeCheckConfig({ selector, entry: content }, DefaultContentType)\n }\n }\n\n _setContent(template, content, selector) {\n const templateElement = SelectorEngine.findOne(selector, template)\n\n if (!templateElement) {\n return\n }\n\n content = this._resolvePossibleFunction(content)\n\n if (!content) {\n templateElement.remove()\n return\n }\n\n if (isElement(content)) {\n this._putElementInTemplate(getElement(content), templateElement)\n return\n }\n\n if (this._config.html) {\n templateElement.innerHTML = this._maybeSanitize(content)\n return\n }\n\n templateElement.textContent = content\n }\n\n _maybeSanitize(arg) {\n return this._config.sanitize ? sanitizeHtml(arg, this._config.allowList, this._config.sanitizeFn) : arg\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this])\n }\n\n _putElementInTemplate(element, templateElement) {\n if (this._config.html) {\n templateElement.innerHTML = ''\n templateElement.append(element)\n return\n }\n\n templateElement.textContent = element.textContent\n }\n}\n\nexport default TemplateFactory\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap tooltip.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport * as Popper from '@popperjs/core'\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport Manipulator from './dom/manipulator.js'\nimport { defineJQueryPlugin, execute, findShadowRoot, getElement, getUID, isRTL, noop } from './util/index.js'\nimport { DefaultAllowlist } from './util/sanitizer.js'\nimport TemplateFactory from './util/template-factory.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'tooltip'\nconst DISALLOWED_ATTRIBUTES = new Set(['sanitize', 'allowList', 'sanitizeFn'])\n\nconst CLASS_NAME_FADE = 'fade'\nconst CLASS_NAME_MODAL = 'modal'\nconst CLASS_NAME_SHOW = 'show'\n\nconst SELECTOR_TOOLTIP_INNER = '.tooltip-inner'\nconst SELECTOR_MODAL = `.${CLASS_NAME_MODAL}`\n\nconst EVENT_MODAL_HIDE = 'hide.bs.modal'\n\nconst TRIGGER_HOVER = 'hover'\nconst TRIGGER_FOCUS = 'focus'\nconst TRIGGER_CLICK = 'click'\nconst TRIGGER_MANUAL = 'manual'\n\nconst EVENT_HIDE = 'hide'\nconst EVENT_HIDDEN = 'hidden'\nconst EVENT_SHOW = 'show'\nconst EVENT_SHOWN = 'shown'\nconst EVENT_INSERTED = 'inserted'\nconst EVENT_CLICK = 'click'\nconst EVENT_FOCUSIN = 'focusin'\nconst EVENT_FOCUSOUT = 'focusout'\nconst EVENT_MOUSEENTER = 'mouseenter'\nconst EVENT_MOUSELEAVE = 'mouseleave'\n\nconst AttachmentMap = {\n AUTO: 'auto',\n TOP: 'top',\n RIGHT: isRTL() ? 'left' : 'right',\n BOTTOM: 'bottom',\n LEFT: isRTL() ? 'right' : 'left'\n}\n\nconst Default = {\n allowList: DefaultAllowlist,\n animation: true,\n boundary: 'clippingParents',\n container: false,\n customClass: '',\n delay: 0,\n fallbackPlacements: ['top', 'right', 'bottom', 'left'],\n html: false,\n offset: [0, 6],\n placement: 'top',\n popperConfig: null,\n sanitize: true,\n sanitizeFn: null,\n selector: false,\n template: '
' +\n '
' +\n '
' +\n '
',\n title: '',\n trigger: 'hover focus'\n}\n\nconst DefaultType = {\n allowList: 'object',\n animation: 'boolean',\n boundary: '(string|element)',\n container: '(string|element|boolean)',\n customClass: '(string|function)',\n delay: '(number|object)',\n fallbackPlacements: 'array',\n html: 'boolean',\n offset: '(array|string|function)',\n placement: '(string|function)',\n popperConfig: '(null|object|function)',\n sanitize: 'boolean',\n sanitizeFn: '(null|function)',\n selector: '(string|boolean)',\n template: 'string',\n title: '(string|element|function)',\n trigger: 'string'\n}\n\n/**\n * Class definition\n */\n\nclass Tooltip extends BaseComponent {\n constructor(element, config) {\n if (typeof Popper === 'undefined') {\n throw new TypeError('Bootstrap\\'s tooltips require Popper (https://popper.js.org)')\n }\n\n super(element, config)\n\n // Private\n this._isEnabled = true\n this._timeout = 0\n this._isHovered = null\n this._activeTrigger = {}\n this._popper = null\n this._templateFactory = null\n this._newContent = null\n\n // Protected\n this.tip = null\n\n this._setListeners()\n\n if (!this._config.selector) {\n this._fixTitle()\n }\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n enable() {\n this._isEnabled = true\n }\n\n disable() {\n this._isEnabled = false\n }\n\n toggleEnabled() {\n this._isEnabled = !this._isEnabled\n }\n\n toggle() {\n if (!this._isEnabled) {\n return\n }\n\n this._activeTrigger.click = !this._activeTrigger.click\n if (this._isShown()) {\n this._leave()\n return\n }\n\n this._enter()\n }\n\n dispose() {\n clearTimeout(this._timeout)\n\n EventHandler.off(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n\n if (this._element.getAttribute('data-bs-original-title')) {\n this._element.setAttribute('title', this._element.getAttribute('data-bs-original-title'))\n }\n\n this._disposePopper()\n super.dispose()\n }\n\n show() {\n if (this._element.style.display === 'none') {\n throw new Error('Please use show on visible elements')\n }\n\n if (!(this._isWithContent() && this._isEnabled)) {\n return\n }\n\n const showEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOW))\n const shadowRoot = findShadowRoot(this._element)\n const isInTheDom = (shadowRoot || this._element.ownerDocument.documentElement).contains(this._element)\n\n if (showEvent.defaultPrevented || !isInTheDom) {\n return\n }\n\n // TODO: v6 remove this or make it optional\n this._disposePopper()\n\n const tip = this._getTipElement()\n\n this._element.setAttribute('aria-describedby', tip.getAttribute('id'))\n\n const { container } = this._config\n\n if (!this._element.ownerDocument.documentElement.contains(this.tip)) {\n container.append(tip)\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_INSERTED))\n }\n\n this._popper = this._createPopper(tip)\n\n tip.classList.add(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we add extra\n // empty mouseover listeners to the body's immediate children;\n // only needed because of broken event delegation on iOS\n // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.on(element, 'mouseover', noop)\n }\n }\n\n const complete = () => {\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_SHOWN))\n\n if (this._isHovered === false) {\n this._leave()\n }\n\n this._isHovered = false\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n hide() {\n if (!this._isShown()) {\n return\n }\n\n const hideEvent = EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDE))\n if (hideEvent.defaultPrevented) {\n return\n }\n\n const tip = this._getTipElement()\n tip.classList.remove(CLASS_NAME_SHOW)\n\n // If this is a touch-enabled device we remove the extra\n // empty mouseover listeners we added for iOS support\n if ('ontouchstart' in document.documentElement) {\n for (const element of [].concat(...document.body.children)) {\n EventHandler.off(element, 'mouseover', noop)\n }\n }\n\n this._activeTrigger[TRIGGER_CLICK] = false\n this._activeTrigger[TRIGGER_FOCUS] = false\n this._activeTrigger[TRIGGER_HOVER] = false\n this._isHovered = null // it is a trick to support manual triggering\n\n const complete = () => {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n if (!this._isHovered) {\n this._disposePopper()\n }\n\n this._element.removeAttribute('aria-describedby')\n EventHandler.trigger(this._element, this.constructor.eventName(EVENT_HIDDEN))\n }\n\n this._queueCallback(complete, this.tip, this._isAnimated())\n }\n\n update() {\n if (this._popper) {\n this._popper.update()\n }\n }\n\n // Protected\n _isWithContent() {\n return Boolean(this._getTitle())\n }\n\n _getTipElement() {\n if (!this.tip) {\n this.tip = this._createTipElement(this._newContent || this._getContentForTemplate())\n }\n\n return this.tip\n }\n\n _createTipElement(content) {\n const tip = this._getTemplateFactory(content).toHtml()\n\n // TODO: remove this check in v6\n if (!tip) {\n return null\n }\n\n tip.classList.remove(CLASS_NAME_FADE, CLASS_NAME_SHOW)\n // TODO: v6 the following can be achieved with CSS only\n tip.classList.add(`bs-${this.constructor.NAME}-auto`)\n\n const tipId = getUID(this.constructor.NAME).toString()\n\n tip.setAttribute('id', tipId)\n\n if (this._isAnimated()) {\n tip.classList.add(CLASS_NAME_FADE)\n }\n\n return tip\n }\n\n setContent(content) {\n this._newContent = content\n if (this._isShown()) {\n this._disposePopper()\n this.show()\n }\n }\n\n _getTemplateFactory(content) {\n if (this._templateFactory) {\n this._templateFactory.changeContent(content)\n } else {\n this._templateFactory = new TemplateFactory({\n ...this._config,\n // the `content` var has to be after `this._config`\n // to override config.content in case of popover\n content,\n extraClass: this._resolvePossibleFunction(this._config.customClass)\n })\n }\n\n return this._templateFactory\n }\n\n _getContentForTemplate() {\n return {\n [SELECTOR_TOOLTIP_INNER]: this._getTitle()\n }\n }\n\n _getTitle() {\n return this._resolvePossibleFunction(this._config.title) || this._element.getAttribute('data-bs-original-title')\n }\n\n // Private\n _initializeOnDelegatedTarget(event) {\n return this.constructor.getOrCreateInstance(event.delegateTarget, this._getDelegateConfig())\n }\n\n _isAnimated() {\n return this._config.animation || (this.tip && this.tip.classList.contains(CLASS_NAME_FADE))\n }\n\n _isShown() {\n return this.tip && this.tip.classList.contains(CLASS_NAME_SHOW)\n }\n\n _createPopper(tip) {\n const placement = execute(this._config.placement, [this, tip, this._element])\n const attachment = AttachmentMap[placement.toUpperCase()]\n return Popper.createPopper(this._element, tip, this._getPopperConfig(attachment))\n }\n\n _getOffset() {\n const { offset } = this._config\n\n if (typeof offset === 'string') {\n return offset.split(',').map(value => Number.parseInt(value, 10))\n }\n\n if (typeof offset === 'function') {\n return popperData => offset(popperData, this._element)\n }\n\n return offset\n }\n\n _resolvePossibleFunction(arg) {\n return execute(arg, [this._element])\n }\n\n _getPopperConfig(attachment) {\n const defaultBsPopperConfig = {\n placement: attachment,\n modifiers: [\n {\n name: 'flip',\n options: {\n fallbackPlacements: this._config.fallbackPlacements\n }\n },\n {\n name: 'offset',\n options: {\n offset: this._getOffset()\n }\n },\n {\n name: 'preventOverflow',\n options: {\n boundary: this._config.boundary\n }\n },\n {\n name: 'arrow',\n options: {\n element: `.${this.constructor.NAME}-arrow`\n }\n },\n {\n name: 'preSetPlacement',\n enabled: true,\n phase: 'beforeMain',\n fn: data => {\n // Pre-set Popper's placement attribute in order to read the arrow sizes properly.\n // Otherwise, Popper mixes up the width and height dimensions since the initial arrow style is for top placement\n this._getTipElement().setAttribute('data-popper-placement', data.state.placement)\n }\n }\n ]\n }\n\n return {\n ...defaultBsPopperConfig,\n ...execute(this._config.popperConfig, [defaultBsPopperConfig])\n }\n }\n\n _setListeners() {\n const triggers = this._config.trigger.split(' ')\n\n for (const trigger of triggers) {\n if (trigger === 'click') {\n EventHandler.on(this._element, this.constructor.eventName(EVENT_CLICK), this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context.toggle()\n })\n } else if (trigger !== TRIGGER_MANUAL) {\n const eventIn = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSEENTER) :\n this.constructor.eventName(EVENT_FOCUSIN)\n const eventOut = trigger === TRIGGER_HOVER ?\n this.constructor.eventName(EVENT_MOUSELEAVE) :\n this.constructor.eventName(EVENT_FOCUSOUT)\n\n EventHandler.on(this._element, eventIn, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusin' ? TRIGGER_FOCUS : TRIGGER_HOVER] = true\n context._enter()\n })\n EventHandler.on(this._element, eventOut, this._config.selector, event => {\n const context = this._initializeOnDelegatedTarget(event)\n context._activeTrigger[event.type === 'focusout' ? TRIGGER_FOCUS : TRIGGER_HOVER] =\n context._element.contains(event.relatedTarget)\n\n context._leave()\n })\n }\n }\n\n this._hideModalHandler = () => {\n if (this._element) {\n this.hide()\n }\n }\n\n EventHandler.on(this._element.closest(SELECTOR_MODAL), EVENT_MODAL_HIDE, this._hideModalHandler)\n }\n\n _fixTitle() {\n const title = this._element.getAttribute('title')\n\n if (!title) {\n return\n }\n\n if (!this._element.getAttribute('aria-label') && !this._element.textContent.trim()) {\n this._element.setAttribute('aria-label', title)\n }\n\n this._element.setAttribute('data-bs-original-title', title) // DO NOT USE IT. Is only for backwards compatibility\n this._element.removeAttribute('title')\n }\n\n _enter() {\n if (this._isShown() || this._isHovered) {\n this._isHovered = true\n return\n }\n\n this._isHovered = true\n\n this._setTimeout(() => {\n if (this._isHovered) {\n this.show()\n }\n }, this._config.delay.show)\n }\n\n _leave() {\n if (this._isWithActiveTrigger()) {\n return\n }\n\n this._isHovered = false\n\n this._setTimeout(() => {\n if (!this._isHovered) {\n this.hide()\n }\n }, this._config.delay.hide)\n }\n\n _setTimeout(handler, timeout) {\n clearTimeout(this._timeout)\n this._timeout = setTimeout(handler, timeout)\n }\n\n _isWithActiveTrigger() {\n return Object.values(this._activeTrigger).includes(true)\n }\n\n _getConfig(config) {\n const dataAttributes = Manipulator.getDataAttributes(this._element)\n\n for (const dataAttribute of Object.keys(dataAttributes)) {\n if (DISALLOWED_ATTRIBUTES.has(dataAttribute)) {\n delete dataAttributes[dataAttribute]\n }\n }\n\n config = {\n ...dataAttributes,\n ...(typeof config === 'object' && config ? config : {})\n }\n config = this._mergeConfigObj(config)\n config = this._configAfterMerge(config)\n this._typeCheckConfig(config)\n return config\n }\n\n _configAfterMerge(config) {\n config.container = config.container === false ? document.body : getElement(config.container)\n\n if (typeof config.delay === 'number') {\n config.delay = {\n show: config.delay,\n hide: config.delay\n }\n }\n\n if (typeof config.title === 'number') {\n config.title = config.title.toString()\n }\n\n if (typeof config.content === 'number') {\n config.content = config.content.toString()\n }\n\n return config\n }\n\n _getDelegateConfig() {\n const config = {}\n\n for (const [key, value] of Object.entries(this._config)) {\n if (this.constructor.Default[key] !== value) {\n config[key] = value\n }\n }\n\n config.selector = false\n config.trigger = 'manual'\n\n // In the future can be replaced with:\n // const keysWithDifferentValues = Object.entries(this._config).filter(entry => this.constructor.Default[entry[0]] !== this._config[entry[0]])\n // `Object.fromEntries(keysWithDifferentValues)`\n return config\n }\n\n _disposePopper() {\n if (this._popper) {\n this._popper.destroy()\n this._popper = null\n }\n\n if (this.tip) {\n this.tip.remove()\n this.tip = null\n }\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Tooltip.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Tooltip)\n\nexport default Tooltip\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap popover.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport Tooltip from './tooltip.js'\nimport { defineJQueryPlugin } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'popover'\n\nconst SELECTOR_TITLE = '.popover-header'\nconst SELECTOR_CONTENT = '.popover-body'\n\nconst Default = {\n ...Tooltip.Default,\n content: '',\n offset: [0, 8],\n placement: 'right',\n template: '
' +\n '
' +\n '

' +\n '
' +\n '
',\n trigger: 'click'\n}\n\nconst DefaultType = {\n ...Tooltip.DefaultType,\n content: '(null|string|element|function)'\n}\n\n/**\n * Class definition\n */\n\nclass Popover extends Tooltip {\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Overrides\n _isWithContent() {\n return this._getTitle() || this._getContent()\n }\n\n // Private\n _getContentForTemplate() {\n return {\n [SELECTOR_TITLE]: this._getTitle(),\n [SELECTOR_CONTENT]: this._getContent()\n }\n }\n\n _getContent() {\n return this._resolvePossibleFunction(this._config.content)\n }\n\n // Static\n static jQueryInterface(config) {\n return this.each(function () {\n const data = Popover.getOrCreateInstance(this, config)\n\n if (typeof config !== 'string') {\n return\n }\n\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`)\n }\n\n data[config]()\n })\n }\n}\n\n/**\n * jQuery\n */\n\ndefineJQueryPlugin(Popover)\n\nexport default Popover\n","/**\n * --------------------------------------------------------------------------\n * Bootstrap scrollspy.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\nimport BaseComponent from './base-component.js'\nimport EventHandler from './dom/event-handler.js'\nimport SelectorEngine from './dom/selector-engine.js'\nimport { defineJQueryPlugin, getElement, isDisabled, isVisible } from './util/index.js'\n\n/**\n * Constants\n */\n\nconst NAME = 'scrollspy'\nconst DATA_KEY = 'bs.scrollspy'\nconst EVENT_KEY = `.${DATA_KEY}`\nconst DATA_API_KEY = '.data-api'\n\nconst EVENT_ACTIVATE = `activate${EVENT_KEY}`\nconst EVENT_CLICK = `click${EVENT_KEY}`\nconst EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`\n\nconst CLASS_NAME_DROPDOWN_ITEM = 'dropdown-item'\nconst CLASS_NAME_ACTIVE = 'active'\n\nconst SELECTOR_DATA_SPY = '[data-bs-spy=\"scroll\"]'\nconst SELECTOR_TARGET_LINKS = '[href]'\nconst SELECTOR_NAV_LIST_GROUP = '.nav, .list-group'\nconst SELECTOR_NAV_LINKS = '.nav-link'\nconst SELECTOR_NAV_ITEMS = '.nav-item'\nconst SELECTOR_LIST_ITEMS = '.list-group-item'\nconst SELECTOR_LINK_ITEMS = `${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`\nconst SELECTOR_DROPDOWN = '.dropdown'\nconst SELECTOR_DROPDOWN_TOGGLE = '.dropdown-toggle'\n\nconst Default = {\n offset: null, // TODO: v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: '0px 0px -25%',\n smoothScroll: false,\n target: null,\n threshold: [0.1, 0.5, 1]\n}\n\nconst DefaultType = {\n offset: '(number|null)', // TODO v6 @deprecated, keep it for backwards compatibility reasons\n rootMargin: 'string',\n smoothScroll: 'boolean',\n target: 'element',\n threshold: 'array'\n}\n\n/**\n * Class definition\n */\n\nclass ScrollSpy extends BaseComponent {\n constructor(element, config) {\n super(element, config)\n\n // this._element is the observablesContainer and config.target the menu links wrapper\n this._targetLinks = new Map()\n this._observableSections = new Map()\n this._rootElement = getComputedStyle(this._element).overflowY === 'visible' ? null : this._element\n this._activeTarget = null\n this._observer = null\n this._previousScrollData = {\n visibleEntryTop: 0,\n parentScrollTop: 0\n }\n this.refresh() // initialize\n }\n\n // Getters\n static get Default() {\n return Default\n }\n\n static get DefaultType() {\n return DefaultType\n }\n\n static get NAME() {\n return NAME\n }\n\n // Public\n refresh() {\n this._initializeTargetsAndObservables()\n this._maybeEnableSmoothScroll()\n\n if (this._observer) {\n this._observer.disconnect()\n } else {\n this._observer = this._getNewObserver()\n }\n\n for (const section of this._observableSections.values()) {\n this._observer.observe(section)\n }\n }\n\n dispose() {\n this._observer.disconnect()\n super.dispose()\n }\n\n // Private\n _configAfterMerge(config) {\n // TODO: on v6 target should be given explicitly & remove the {target: 'ss-target'} case\n config.target = getElement(config.target) || document.body\n\n // TODO: v6 Only for backwards compatibility reasons. Use rootMargin only\n config.rootMargin = config.offset ? `${config.offset}px 0px -30%` : config.rootMargin\n\n if (typeof config.threshold === 'string') {\n config.threshold = config.threshold.split(',').map(value => Number.parseFloat(value))\n }\n\n return config\n }\n\n _maybeEnableSmoothScroll() {\n if (!this._config.smoothScroll) {\n return\n }\n\n // unregister any previous listeners\n EventHandler.off(this._config.target, EVENT_CLICK)\n\n EventHandler.on(this._config.target, EVENT_CLICK, SELECTOR_TARGET_LINKS, event => {\n const observableSection = this._observableSections.get(event.target.hash)\n if (observableSection) {\n event.preventDefault()\n const root = this._rootElement || window\n const height = observableSection.offsetTop - this._element.offsetTop\n if (root.scrollTo) {\n root.scrollTo({ top: height, behavior: 'smooth' })\n return\n }\n\n // Chrome 60 doesn't support `scrollTo`\n root.scrollTop = height\n }\n })\n }\n\n _getNewObserver() {\n const options = {\n root: this._rootElement,\n threshold: this._config.threshold,\n rootMargin: this._config.rootMargin\n }\n\n return new IntersectionObserver(entries => this._observerCallback(entries), options)\n }\n\n // The logic of selection\n _observerCallback(entries) {\n const targetElement = entry => this._targetLinks.get(`#${entry.target.id}`)\n const activate = entry => {\n this._previousScrollData.visibleEntryTop = entry.target.offsetTop\n this._process(targetElement(entry))\n }\n\n const parentScrollTop = (this._rootElement || document.documentElement).scrollTop\n const userScrollsDown = parentScrollTop >= this._previousScrollData.parentScrollTop\n this._previousScrollData.parentScrollTop = parentScrollTop\n\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n this._activeTarget = null\n this._clearActiveClass(targetElement(entry))\n\n continue\n }\n\n const entryIsLowerThanPrevious = entry.target.offsetTop >= this._previousScrollData.visibleEntryTop\n // if we are scrolling down, pick the bigger offsetTop\n if (userScrollsDown && entryIsLowerThanPrevious) {\n activate(entry)\n // if parent isn't scrolled, let's keep the first visible item, breaking the iteration\n if (!parentScrollTop) {\n return\n }\n\n continue\n }\n\n // if we are scrolling up, pick the smallest offsetTop\n if (!userScrollsDown && !entryIsLowerThanPrevious) {\n activate(entry)\n }\n }\n }\n\n _initializeTargetsAndObservables() {\n this._targetLinks = new Map()\n this._observableSections = new Map()\n\n const targetLinks = SelectorEngine.find(SELECTOR_TARGET_LINKS, this._config.target)\n\n for (const anchor of targetLinks) {\n // ensure that the anchor has an id and is not disabled\n if (!anchor.hash || isDisabled(anchor)) {\n continue\n }\n\n const observableSection = SelectorEngine.findOne(decodeURI(anchor.hash), this._element)\n\n // ensure that the observableSection exists & is visible\n if (isVisible(observableSection)) {\n this._targetLinks.set(decodeURI(anchor.hash), anchor)\n this._observableSections.set(anchor.hash, observableSection)\n }\n }\n }\n\n _process(target) {\n if (this._activeTarget === target) {\n return\n }\n\n this._clearActiveClass(this._config.target)\n this._activeTarget = target\n target.classList.add(CLASS_NAME_ACTIVE)\n this._activateParents(target)\n\n EventHandler.trigger(this._element, EVENT_ACTIVATE, { relatedTarget: target })\n }\n\n _activateParents(target) {\n // Activate dropdown parents\n if (target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)) {\n SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE, target.closest(SELECTOR_DROPDOWN))\n .classList.add(CLASS_NAME_ACTIVE)\n return\n }\n\n for (const listGroup of SelectorEngine.parents(target, SELECTOR_NAV_LIST_GROUP)) {\n // Set triggered links parents as active\n // With both
    and