diff --git a/.azure-pipelines/code-scan-neural-solution.yaml b/.azure-pipelines/code-scan-neural-solution.yaml deleted file mode 100644 index 301c7010465..00000000000 --- a/.azure-pipelines/code-scan-neural-solution.yaml +++ /dev/null @@ -1,59 +0,0 @@ -trigger: none - -pr: - autoCancel: true - drafts: false - branches: - include: - - master - paths: - include: - - neural_solution - - setup.py - - .azure-pipelines/code-scan-neural-solution.yml - -pool: - vmImage: "ubuntu-latest" - -variables: - CODE_SCAN_LOG_PATH: ".azure-pipelines/scripts/codeScan/scanLog" - -stages: - - stage: DocStyleCodeScan - displayName: DocStyle Code Scan - dependsOn: [] - jobs: - - job: DocStyle - displayName: DocStyle - steps: - - template: template/code-scan-template.yml - parameters: - codeScanFileName: "pydocstyle" - uploadPath: "pydocstyle.log" - scanModule: "neural_solution" - - - stage: BanditCodeScan - displayName: Bandit Code Scan - dependsOn: [] - jobs: - - job: Bandit - displayName: Bandit - steps: - - template: template/code-scan-template.yml - parameters: - codeScanFileName: "bandit" - uploadPath: "bandit.log" - scanModule: "neural_solution" - - - stage: PylintCodeScan - displayName: Pylint Code Scan - dependsOn: [] - jobs: - - job: Pylint - displayName: Pylint - steps: - - template: template/code-scan-template.yml - parameters: - codeScanFileName: "pylint" - uploadPath: "pylint.json" - scanModule: "neural_solution" diff --git a/.azure-pipelines/scripts/codeScan/pydocstyle/pydocstyle.sh b/.azure-pipelines/scripts/codeScan/pydocstyle/pydocstyle.sh index db0a818db33..96f95bcc68b 100644 --- a/.azure-pipelines/scripts/codeScan/pydocstyle/pydocstyle.sh +++ b/.azure-pipelines/scripts/codeScan/pydocstyle/pydocstyle.sh @@ -17,11 +17,6 @@ log_dir="$work_dir/../scanLog" mkdir -p $log_dir scan_path="scan_path.txt" -if [ "${scan_module}" = "neural_solution" ]; then - scan_path="scan_path_neural_solution.txt" -elif [ "${scan_module}" = "neural_insights" ]; then - scan_path="scan_path_neural_insights.txt" -fi exit_code=0 for line in $(cat ${work_dir}/${scan_path}) diff --git a/.azure-pipelines/scripts/codeScan/pydocstyle/scan_path_neural_insights.txt b/.azure-pipelines/scripts/codeScan/pydocstyle/scan_path_neural_insights.txt deleted file mode 100644 index 8a008fd19fb..00000000000 --- a/.azure-pipelines/scripts/codeScan/pydocstyle/scan_path_neural_insights.txt +++ /dev/null @@ -1,4 +0,0 @@ -/neural-compressor/neural_insights/components -/neural-compressor/neural_insights/utils -/neural-compressor/neural_insights/web - diff --git a/.azure-pipelines/scripts/codeScan/pydocstyle/scan_path_neural_solution.txt b/.azure-pipelines/scripts/codeScan/pydocstyle/scan_path_neural_solution.txt deleted file mode 100644 index 07a5b1483d7..00000000000 --- a/.azure-pipelines/scripts/codeScan/pydocstyle/scan_path_neural_solution.txt +++ /dev/null @@ -1,4 +0,0 @@ -/neural-compressor/neural_solution/backend -/neural-compressor/neural_solution/frontend -/neural-compressor/neural_solution/utils - diff --git a/.azure-pipelines/scripts/codeScan/pylint/pylint.sh b/.azure-pipelines/scripts/codeScan/pylint/pylint.sh index 9103947e965..062bfe414ee 100644 --- a/.azure-pipelines/scripts/codeScan/pylint/pylint.sh +++ b/.azure-pipelines/scripts/codeScan/pylint/pylint.sh @@ -44,22 +44,6 @@ pip install torch \ pydantic \ protobuf -if [ "${scan_module}" = "neural_solution" ]; then - cd /neural-compressor - python setup.py install - - echo "Install Neural Solution ... " - bash /neural-compressor/.azure-pipelines/scripts/install_neural_solution.sh - -elif [ "${scan_module}" = "neural_insights" ]; then - cd /neural-compressor - python setup.py install - - echo "Install Neural Insights ... " - bash /neural-compressor/.azure-pipelines/scripts/install_neural_insights.sh - -fi - echo "[DEBUG] list pipdeptree..." pip install pipdeptree pipdeptree diff --git a/.azure-pipelines/scripts/install_neural_insights.sh b/.azure-pipelines/scripts/install_neural_insights.sh deleted file mode 100644 index daa8887f635..00000000000 --- a/.azure-pipelines/scripts/install_neural_insights.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash - -echo "Install Neural Insights ... " -cd /neural-compressor -python -m pip install --no-cache-dir -r neural_insights/requirements.txt -python setup.py neural_insights bdist_wheel -pip install dist/neural_insights*.whl -pip list \ No newline at end of file diff --git a/.azure-pipelines/scripts/install_neural_solution.sh b/.azure-pipelines/scripts/install_neural_solution.sh deleted file mode 100644 index d0139c85132..00000000000 --- a/.azure-pipelines/scripts/install_neural_solution.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -echo "Install Open MPI ..." -wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.5.tar.gz -gunzip -c openmpi-4.1.5.tar.gz | tar xf - -cd openmpi-4.1.5 -./configure --prefix=/usr/local -make all install -MPI_DIR=/usr/local/lib/openmpi -export PATH=$MPI_DIR/bin:$PATH -export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH -echo "Current Path ... " -echo $PATH - -echo "Current LD_LIBRARY_PATH ... " -echo $LD_LIBRARY_PATH - -echo "check mpicc ..." -which mpicc -which mpirun - -echo "Install Neural Solution ... " -cd /neural-compressor -python -m pip install --no-cache-dir -r neural_solution/requirements.txt -python setup.py neural_solution sdist bdist_wheel -pip install dist/neural_solution*.whl -pip list \ No newline at end of file diff --git a/.azure-pipelines/scripts/ut/run_basic_others.sh b/.azure-pipelines/scripts/ut/run_basic_others.sh index df7acf52cf7..301d6fd14d1 100644 --- a/.azure-pipelines/scripts/ut/run_basic_others.sh +++ b/.azure-pipelines/scripts/ut/run_basic_others.sh @@ -14,7 +14,6 @@ cd /neural-compressor/test || exit 1 find . -name "test*.py" | sed 's,\.\/,coverage run --source='"${lpot_path}"' --append ,g' | sed 's/$/ --verbose/'> run.sh sed -i '/ adaptor\//d' run.sh sed -i '/ tfnewapi\//d' run.sh -sed -i '/ neural_coder\//d' run.sh sed -i '/ itex\//d' run.sh sed -i '/ pruning_with_pt/d' run.sh sed -i '/ pruning_with_tf/d' run.sh diff --git a/.azure-pipelines/scripts/ut/run_ncoder.sh b/.azure-pipelines/scripts/ut/run_ncoder.sh deleted file mode 100644 index 3c487eebd7b..00000000000 --- a/.azure-pipelines/scripts/ut/run_ncoder.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash -python -c "import neural_compressor as nc;print(nc.version.__version__)" -echo "run coder" - -echo "no FWKs need to be installed..." -echo "no requirements need to be installed..." - -cd /neural-compressor/test || exit 1 -find ./neural_coder -name "test*.py" | sed 's,\.\/,python ,g' | sed 's/$/ --verbose/' > run.sh - -LOG_DIR=/neural-compressor/log_dir -mkdir -p ${LOG_DIR} -ut_log_name=${LOG_DIR}/ut_neural_coder.log - -echo "cat run.sh..." -sort run.sh -o run.sh -cat run.sh | tee ${ut_log_name} -echo "------UT start-------" -bash -x run.sh 2>&1 | tee -a ${ut_log_name} -echo "------UT end -------" - -if [ $(grep -c "FAILED" ${ut_log_name}) != 0 ] || [ $(grep -c "core dumped" ${ut_log_name}) != 0 ] || [ $(grep -c "ModuleNotFoundError:" ${ut_log_name}) != 0 ] || [ $(grep -c "OK" ${ut_log_name}) == 0 ];then - echo "Find errors in UT test, please check the output..." - exit 1 -fi -echo "UT finished successfully! " \ No newline at end of file diff --git a/.azure-pipelines/scripts/ut/run_neural_insights.sh b/.azure-pipelines/scripts/ut/run_neural_insights.sh deleted file mode 100644 index 5f0f2fe5521..00000000000 --- a/.azure-pipelines/scripts/ut/run_neural_insights.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash -python -c "import neural_compressor as nc;print(nc.version.__version__)" -echo "run neural insights ut..." - -# Install Neural Solution -bash /neural-compressor/.azure-pipelines/scripts/install_neural_insights.sh - -# Install requirements for test -cd /neural-compressor/neural_insights/test || exit 1 -if [ -f "requirements.txt" ]; then - n=0 - until [ "$n" -ge 3 ] - do - python -m pip install --no-cache-dir -r requirements.txt && break - n=$((n+1)) - sleep 5 - done - pip list -else - echo "Not found requirements.txt file." -fi - -cd /neural-compressor/neural_insights || exit 1 -find ./test -name "test*.py" | sed 's,\.\/,python ,g' | sed 's/$/ --verbose/' > run.sh - -LOG_DIR=/neural-compressor/log_dir -mkdir -p ${LOG_DIR} -ut_log_name=${LOG_DIR}/ut_neural_insights.log - -echo "cat run.sh..." -sort run.sh -o run.sh -cat run.sh | tee ${ut_log_name} -echo "------UT start-------" -bash -x run.sh 2>&1 | tee -a ${ut_log_name} -echo "------UT end -------" - -if [ $(grep -c "FAILED" ${ut_log_name}) != 0 ] || [ $(grep -c "core dumped" ${ut_log_name}) != 0 ] || [ $(grep -c "ModuleNotFoundError:" ${ut_log_name}) != 0 ] || [ $(grep -c "OK" ${ut_log_name}) == 0 ];then - echo "Find errors in UT test, please check the output..." - exit 1 -fi -echo "UT finished successfully! " \ No newline at end of file diff --git a/.azure-pipelines/scripts/ut/run_neural_solution.sh b/.azure-pipelines/scripts/ut/run_neural_solution.sh deleted file mode 100644 index 42041e4a087..00000000000 --- a/.azure-pipelines/scripts/ut/run_neural_solution.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash -python -c "import neural_compressor as nc;print(nc.version.__version__)" -echo "run neural solution ut..." - -echo "no FWKs need to be installed..." - -# Install Neural Solution -bash /neural-compressor/.azure-pipelines/scripts/install_neural_solution.sh - -# Install requirements for test -cd /neural-compressor/neural_solution/test || exit 1 -if [ -f "requirements.txt" ]; then - n=0 - until [ "$n" -ge 3 ] - do - python -m pip install --no-cache-dir -r requirements.txt && break - n=$((n+1)) - sleep 5 - done - pip list -else - echo "Not found requirements.txt file." -fi - -cd /neural-compressor/neural_solution || exit 1 -find ./test -name "test*.py" | sed 's,\.\/,python ,g' | sed 's/$/ --verbose/' > run.sh - -LOG_DIR=/neural-compressor/log_dir -mkdir -p ${LOG_DIR} -ut_log_name=${LOG_DIR}/ut_neural_solution.log - -echo "cat run.sh..." -sort run.sh -o run.sh -cat run.sh | tee ${ut_log_name} -echo "------UT start-------" -bash -x run.sh 2>&1 | tee -a ${ut_log_name} -echo "------UT end -------" - -if [ $(grep -c "FAILED" ${ut_log_name}) != 0 ] || [ $(grep -c "core dumped" ${ut_log_name}) != 0 ] || [ $(grep -c "ModuleNotFoundError:" ${ut_log_name}) != 0 ] || [ $(grep -c "OK" ${ut_log_name}) == 0 ];then - echo "Find errors in UT test, please check the output..." - exit 1 -fi -echo "UT finished successfully! " \ No newline at end of file diff --git a/.azure-pipelines/ut-basic-no-cover.yml b/.azure-pipelines/ut-basic-no-cover.yml index 9a0fbb190b5..64eaf141e82 100644 --- a/.azure-pipelines/ut-basic-no-cover.yml +++ b/.azure-pipelines/ut-basic-no-cover.yml @@ -14,7 +14,6 @@ pr: - requirements.txt - .azure-pipelines/scripts/ut exclude: - - test/neural_coder - test/3x - neural_compressor/common - neural_compressor/torch diff --git a/.azure-pipelines/ut-basic.yml b/.azure-pipelines/ut-basic.yml index a6e34a466ca..2249f0c2590 100644 --- a/.azure-pipelines/ut-basic.yml +++ b/.azure-pipelines/ut-basic.yml @@ -14,7 +14,6 @@ pr: - requirements.txt - .azure-pipelines/scripts/ut exclude: - - test/neural_coder - test/3x - neural_compressor/common - neural_compressor/torch diff --git a/.azure-pipelines/ut-ncoder.yml b/.azure-pipelines/ut-ncoder.yml deleted file mode 100644 index a1512ae4803..00000000000 --- a/.azure-pipelines/ut-ncoder.yml +++ /dev/null @@ -1,33 +0,0 @@ -trigger: none - -pr: - autoCancel: true - drafts: false - branches: - include: - - master - paths: - include: - - neural_coder - - test/neural_coder - - setup.py - -pool: ICX-16C - -variables: - UPLOAD_PATH: $(Build.SourcesDirectory)/log_dir - -stages: -- stage: - displayName: Unit Test for Neural Coder - jobs: - - job: - steps: - - template: template/ut-template.yml - parameters: - dockerConfigName: 'commonDockerConfig' - utScriptFileName: 'run_ncoder' - uploadPath: $(UPLOAD_PATH) - utArtifact: 'ut_ncoder' - utTestMode: "no-coverage" - utContainerName: "utTest-ncoder" diff --git a/.azure-pipelines/ut-neural-solution.yaml b/.azure-pipelines/ut-neural-solution.yaml deleted file mode 100644 index df717899b57..00000000000 --- a/.azure-pipelines/ut-neural-solution.yaml +++ /dev/null @@ -1,33 +0,0 @@ -trigger: none - -pr: - autoCancel: true - drafts: false - branches: - include: - - master - paths: - include: - - neural_solution - - setup.py - - .azure-pipelines/ut-neural-solution.yaml - -pool: ICX-16C - -variables: - UPLOAD_PATH: $(Build.SourcesDirectory)/log_dir - -stages: - - stage: - displayName: Unit Test for Neural Solution - jobs: - - job: - steps: - - template: template/ut-template.yml - parameters: - dockerConfigName: 'commonDockerConfig' - utScriptFileName: 'run_neural_solution' - uploadPath: $(UPLOAD_PATH) - utArtifact: 'ut_neural-solution' - utTestMode: "no-coverage" - utContainerName: "utTest-nSolution" diff --git a/.github/checkgroup.yml b/.github/checkgroup.yml index 0b30c23eafa..4c6691da86a 100644 --- a/.github/checkgroup.yml +++ b/.github/checkgroup.yml @@ -13,17 +13,6 @@ subprojects: - "Code-Scan (DocStyle Code Scan DocStyle)" - "Code-Scan (Pylint Code Scan Pylint)" - - id: "Code Scan Neural-Solution Tests workflow" - paths: - - "neural_solution/**" - - "setup.py" - - ".azure-pipelines/code-scan-neural-solution.yml" - checks: - - "Code-Scan-Neural-Solution" - - "Code-Scan-Neural-Solution (Bandit Code Scan Bandit)" - - "Code-Scan-Neural-Solution (DocStyle Code Scan DocStyle)" - - "Code-Scan-Neural-Solution (Pylint Code Scan Pylint)" - - id: "Model Tests workflow" paths: - "neural_compressor/**" @@ -66,7 +55,6 @@ subprojects: - "setup.py" - "requirements.txt" - ".azure-pipelines/scripts/ut/**" - - "!test/neural_coder/**" - "!test/3x/**" - "!neural_compressor/common/**" - "!neural_compressor/torch/**" @@ -98,7 +86,6 @@ subprojects: - "setup.py" - "requirements.txt" - ".azure-pipelines/scripts/ut/**" - - "!test/neural_coder/**" - "!test/3x/**" - "!neural_compressor/common/**" - "!neural_compressor/torch/**" @@ -126,21 +113,6 @@ subprojects: checks: - "UT-ITREX" - - id: "Unit Tests Neural-Solution workflow" - paths: - - "neural_solution/**" - - "setup.py" - checks: - - "UT-Neural-Solution" - - - id: "Unit Tests Neural-Coder workflow" - paths: - - "neural_coder/**" - - "test/neural_coder/**" - - "setup.py" - checks: - - "UT-Coder" - - id: "Unit Tests 3x-TensorFlow workflow" paths: - "neural_compressor/common/**" diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 19e48389c04..5e77a67f9f1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,16 +2,6 @@ ci: autofix_prs: true autoupdate_schedule: quarterly -exclude: | - (?x)^( - conda_meta/.+| - neural_insights/gui.+| - neural_insights/test.+| - neural_solution/frontend/gRPC/proto/neural_solution_pb2.py| - neural_coder/extensions/.+| - neural_coder/examples/.+ - )$ - repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.6.0 @@ -60,13 +50,7 @@ repos: - id: insert-license files: | (?x)^( - neural_solution/.*(py|yaml|yml|sh)| - neural_compressor/.*(py|yaml|yml|sh)| - neural_insights/.*(py|yaml|yml|sh) - )$ - exclude: | - (?x)^( - neural_solution/test/.* + neural_compressor/.*(py|yaml|yml|sh) )$ args: [ diff --git a/README.md b/README.md index 903af342511..ab9c037a8e4 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ In particular, the tool provides the key features, typical examples, and open co * Support a wide range of Intel hardware such as [Intel Xeon Scalable Processors](https://www.intel.com/content/www/us/en/products/details/processors/xeon/scalable.html), [Intel Xeon CPU Max Series](https://www.intel.com/content/www/us/en/products/details/processors/xeon/max-series.html), [Intel Data Center GPU Flex Series](https://www.intel.com/content/www/us/en/products/details/discrete-gpus/data-center-gpu/flex-series.html), and [Intel Data Center GPU Max Series](https://www.intel.com/content/www/us/en/products/details/discrete-gpus/data-center-gpu/max-series.html) with extensive testing; support AMD CPU, ARM CPU, and NVidia GPU through ONNX Runtime with limited testing -* Validate popular LLMs such as [LLama2](/examples/pytorch/nlp/huggingface_models/language-modeling/quantization/llm), [Falcon](/examples/pytorch/nlp/huggingface_models/language-modeling/quantization/llm), [GPT-J](/examples/pytorch/nlp/huggingface_models/language-modeling/quantization/llm), [Bloom](/examples/pytorch/nlp/huggingface_models/language-modeling/quantization/llm), [OPT](/examples/pytorch/nlp/huggingface_models/language-modeling/quantization/llm), and more than 10,000 broad models such as [Stable Diffusion](/examples/pytorch/nlp/huggingface_models/text-to-image/quantization), [BERT-Large](/examples/pytorch/nlp/huggingface_models/text-classification/quantization/ptq_static/fx), and [ResNet50](/examples/pytorch/image_recognition/torchvision_models/quantization/ptq/cpu/fx) from popular model hubs such as [Hugging Face](https://huggingface.co/), [Torch Vision](https://pytorch.org/vision/stable/index.html), and [ONNX Model Zoo](https://github.com/onnx/models#models), by leveraging zero-code optimization solution [Neural Coder](/neural_coder#what-do-we-offer) and automatic [accuracy-driven](/docs/source/design.md#workflow) quantization strategies +* Validate popular LLMs such as [LLama2](/examples/pytorch/nlp/huggingface_models/language-modeling/quantization/llm), [Falcon](/examples/pytorch/nlp/huggingface_models/language-modeling/quantization/llm), [GPT-J](/examples/pytorch/nlp/huggingface_models/language-modeling/quantization/llm), [Bloom](/examples/pytorch/nlp/huggingface_models/language-modeling/quantization/llm), [OPT](/examples/pytorch/nlp/huggingface_models/language-modeling/quantization/llm), and more than 10,000 broad models such as [Stable Diffusion](/examples/pytorch/nlp/huggingface_models/text-to-image/quantization), [BERT-Large](/examples/pytorch/nlp/huggingface_models/text-classification/quantization/ptq_static/fx), and [ResNet50](/examples/pytorch/image_recognition/torchvision_models/quantization/ptq/cpu/fx) from popular model hubs such as [Hugging Face](https://huggingface.co/), [Torch Vision](https://pytorch.org/vision/stable/index.html), and [ONNX Model Zoo](https://github.com/onnx/models#models), with automatic [accuracy-driven](/docs/source/design.md#workflow) quantization strategies * Collaborate with cloud marketplaces such as [Google Cloud Platform](https://console.cloud.google.com/marketplace/product/bitnami-launchpad/inc-tensorflow-intel?project=verdant-sensor-286207), [Amazon Web Services](https://aws.amazon.com/marketplace/pp/prodview-yjyh2xmggbmga#pdp-support), and [Azure](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/bitnami.inc-tensorflow-intel), software platforms such as [Alibaba Cloud](https://www.intel.com/content/www/us/en/developer/articles/technical/quantize-ai-by-oneapi-analytics-on-alibaba-cloud.html), [Tencent TACO](https://new.qq.com/rain/a/20221202A00B9S00) and [Microsoft Olive](https://github.com/microsoft/Olive), and open AI ecosystem such as [Hugging Face](https://huggingface.co/blog/intel), [PyTorch](https://pytorch.org/tutorials/recipes/intel_neural_compressor_for_pytorch.html), [ONNX](https://github.com/onnx/models#models), [ONNX Runtime](https://github.com/microsoft/onnxruntime), and [Lightning AI](https://github.com/Lightning-AI/lightning/blob/master/docs/source-pytorch/advanced/post_training_quantization.rst) @@ -142,19 +142,6 @@ quantized_model = fit(model=float_model, conf=static_quant_conf, calib_dataloade Model Export - - - Neural Coder (Zero-code Optimization) - - - - - Launcher - JupyterLab Extension - Visual Studio Code Extension - Supported Matrix - - Advanced Topics @@ -173,17 +160,6 @@ quantized_model = fit(model=float_model, conf=static_quant_conf, calib_dataloade Layer-Wise Quantization - - - Innovations for Productivity - - - - - Neural Insights - Neural Solution - - > **Note**: diff --git a/docs/build_docs/build.sh b/docs/build_docs/build.sh index 032a15890a2..fac266b3872 100755 --- a/docs/build_docs/build.sh +++ b/docs/build_docs/build.sh @@ -81,9 +81,6 @@ fi source env_sphinx/bin/activate cp -rf ../docs/ ./source -cp -rf ../neural_coder ./source/docs/source -cp -rf ../neural_insights ./source/docs/source -cp -rf ../neural_solution ./source/docs/source cp -f "../README.md" "./source/docs/source/Welcome.md" cp -f "../SECURITY.md" "./source/docs/source/SECURITY.md" @@ -97,15 +94,10 @@ done sed -i 's/.\/docs\/source\/_static/./g' ./source/docs/source/Welcome.md ./source/docs/source/user_guide.md sed -i 's/.md/.html/g; s/.\/docs\/source\//.\//g' ./source/docs/source/Welcome.md ./source/docs/source/user_guide.md sed -i 's/\/examples\/README.html/https:\/\/github.com\/intel\/neural-compressor\/blob\/master\/examples\/README.md/g' ./source/docs/source/user_guide.md -sed -i 's/href=\"\/neural_coder/href=\".\/neural_coder/g' ./source/docs/source/user_guide.md sed -i 's/https\:\/\/intel.github.io\/neural-compressor\/lates.\/api-doc\/apis.html/https\:\/\/intel.github.io\/neural-compressor\/latest\/docs\/source\/api-doc\/apis.html/g' ./source/docs/source/Welcome.md ./source/docs/source/user_guide.md sed -i 's/examples\/README.html/https:\/\/github.com\/intel\/neural-compressor\/blob\/master\/examples\/README.md/g' ./source/docs/source/Welcome.md -sed -i 's/\"\/neural_coder\/extensions\/screenshots\/extmanager.png/\".\/neural_coder\/extensions\/screenshots\/extmanager.png/g' ./source/docs/source/get_started.md - -sed -i 's/\/neural_coder\/extensions\/neural_compressor_ext_lab\/README.md/.\/neural_coder\/extensions\/neural_compressor_ext_lab\/README.md/g' ./source/docs/source/get_started.md - sed -i 's/\/examples\/README.md/https:\/\/github.com\/intel\/neural-compressor\/blob\/master\/examples\/README.md/g' ./source/docs/source/get_started.md sed -i 's/.\/validated_model_list.md\#/.\/validated_model_list.html\#/g' ./source/docs/source/installation_guide.md @@ -138,8 +130,6 @@ if [[ ${UPDATE_VERSION_FOLDER} -eq 1 ]]; then cp -r ${SRC_FOLDER}/* ${DST_FOLDER} python update_html.py ${DST_FOLDER} ${VERSION} cp -r ./source/docs/source/imgs ${DST_FOLDER}/docs/source - cp -r ./source/docs/source/neural_coder/extensions/neural_compressor_ext_vscode/images ${DST_FOLDER}/docs/source/neural_coder/extensions/neural_compressor_ext_vscode - cp -r ./source/docs/source/neural_coder/extensions/screenshots ${DST_FOLDER}/docs/source/neural_coder/extensions cp source/_static/index.html ${DST_FOLDER} else @@ -153,8 +143,6 @@ if [[ ${UPDATE_LATEST_FOLDER} -eq 1 ]]; then cp -r ${SRC_FOLDER}/* ${LATEST_FOLDER} python update_html.py ${LATEST_FOLDER} ${VERSION} cp -r ./source/docs/source/imgs ${LATEST_FOLDER}/docs/source - cp -r ./source/docs/source/neural_coder/extensions/neural_compressor_ext_vscode/images ${LATEST_FOLDER}/docs/source/neural_coder/extensions/neural_compressor_ext_vscode - cp -r ./source/docs/source/neural_coder/extensions/screenshots ${LATEST_FOLDER}/docs/source/neural_coder/extensions cp source/_static/index.html ${LATEST_FOLDER} else echo "skip to create ${LATEST_FOLDER}" diff --git a/docs/source/adaptor.md b/docs/source/adaptor.md index 6765c5405de..b8af7a934fb 100644 --- a/docs/source/adaptor.md +++ b/docs/source/adaptor.md @@ -144,9 +144,6 @@ Onnxruntime already has [quantization tools](https://github.com/microsoft/onnxru tensorboard=False, fp32_baseline=False): ...... - def diagnosis_helper(self, fp32_model, int8_model, tune_cfg=None, save_path=None): - ...... - def save(self, model, path): ...... ``` diff --git a/docs/source/diagnosis.md b/docs/source/diagnosis.md deleted file mode 100644 index 9e70d695489..00000000000 --- a/docs/source/diagnosis.md +++ /dev/null @@ -1,197 +0,0 @@ -# Diagnosis -1. [Diagnosis Introduction](#diagnosis-introduction) -2. [Supported Feature Matrix](#supported-feature-matrix) -3. [Get Started](#get-started) -4. [Example](#example) -5. [Step by Step Diagnosis Example with TensorFlow](https://github.com/intel/neural-compressor/tree/master/neural_insights/docs/source/tf_accuracy_debug.md) -5. [Step by Step Diagnosis Example with ONNXRT](https://github.com/intel/neural-compressor/tree/master/neural_insights/docs/source/onnx_accuracy_debug.md) - -# Diagnosis Introduction -The diagnosis feature provides methods to debug the accuracy loss during quantization and profile the performance gap during benchmark. -There are 2 ways to diagnose a model with Intel® Neural Compressor. First is non-GUI mode that is described below and second is GUI mode with [Neural Insights](https://github.com/intel/neural-compressor/tree/master/neural_insights) component. - -The workflow is described in the diagram below. First we have to configure scripts with diagnosis, then run them and check diagnosis info in the terminal. Test if the result is satisfying and repeat the steps if needed. -![workflow](./imgs/workflow.jpg) - -# Supported Feature Matrix - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypesDiagnosis dataFrameworkBackend
Post-Training Static Quantization (PTQ)weights and activationsTensorFlowTensorFlow/Intel TensorFlow
ONNX RuntimeQLinearops/QDQ
Benchmark ProfilingOP execute durationTensorFlowTensorFlow/Intel TensorFlow
ONNX RuntimeQLinearops/QDQ
- -# Get Started -## Install Intel® Neural Compressor -First you need to install Intel® Neural Compressor. -```shell -git clone https://github.com/intel/neural-compressor.git -cd neural-compressor -pip install -r requirements.txt -python setup.py install -``` - -## Modify script -Modify quantization/benchmark script to run diagnosis by adding argument `diagnosis` set to `True` to `PostTrainingQuantConfig`/`BenchmarkConfig` as shown below. - -### Quantization diagnosis -```python -config = PostTrainingQuantConfig(diagnosis=True, ...) -``` - -### Benchmark diagnosis -```python -config = BenchmarkConfig(diagnosis=True, ...) -``` - -# Example -Below it is explained how to run diagnosis for ONNX ResNet50 model. - -## Prepare dataset - -Download dataset [ILSVR2012 validation Imagenet dataset](http://www.image-net.org/challenges/LSVRC/2012/downloads). - -Download label: -```shell -wget http://dl.caffe.berkeleyvision.org/caffe_ilsvrc12.tar.gz -tar -xvzf caffe_ilsvrc12.tar.gz val.txt -``` - -## Run quantization script -Then execute script with quantization API in another terminal with --diagnose flag. -```shell -python examples/onnxrt/image_recognition/resnet50_torchvision/quantization/ptq_static/main.py \ - --model_path=/path/to/resnet50_v1.onnx/ \ - --dataset_location=/path/to/ImageNet/ \ - --label_path=/path/to/val.txt/ - --tune - --diagnose -``` - -## Run benchmark script -To run profiling execute script with parameters shown in the command below. -```shell -python examples/onnxrt/image_recognition/resnet50_torchvision/quantization/ptq_static/main.py \ - --model_path=/path/to/resnet50_v1.onnx/ \ - --dataset_location=/path/to/ImageNet/ \ - --label_path=/path/to/val.txt/ - --mode=performance \​ - --benchmark \​ - --diagnose -``` - - -## See quantization data - -After script's execution you will see the results in your terminal. -In the activations summary you can see a table with OP name, MSE (mean squared error), activation minimum and maximum sorted by MSE. - -![activations](./imgs/terminal-ops.jpg) - -In the weights summary table there are parameters like minimum, maximum, mean, standard deviation and variance for input model. The table is also sorted by MSE. - -![weights](./imgs/terminal-weights.jpg) - -## How to do diagnosis -Neural Compressor diagnosis mode provides weights and activation data that includes several useful metrics for diagnosing potential losses of model accuracy. - -### Parameter description -Data is presented in the terminal in form of table where each row describes single OP in the model. We present such quantities measures like: - -**MSE - Mean Squared Error** - it is a metric that measures how big is the difference between input and optimized model's weights for specific OP. - -$$ -MSE = \sum_{i=1}^{n}(x_i-y_i)^2 -$$ - -**Input model min** - minimum value of the input OP tensor data - -$$ -\min{\vec{x}} -$$ - -**Input model max** - maximum value of the input OP tensor data - -$$ -\max{\vec{x}} -$$ - -**Input model mean** - mean value of the input OP tensor data - -$$ -\mu =\frac{1}{n} \sum_{i=1}^{n} x_{i} -$$ - -**Input model standard deviation** - standard deviation of the input OP tensor data - -$$ -\sigma =\sqrt{\frac{1}{n}\sum\limits_{i=1}^n (x_i - \mu)} -$$ - -**Input model variance** - variance of the input OP tensor data - -$$ -Var = \sigma^2 -$$ - -where,
-$x_i$ - input OP tensor data,
-$y_i$ - optimized OP tensor data,
-$\mu_x$ - input model mean,
-$\sigma_x$ - input model variance - -### Diagnosis suggestions -1. Check the nodes with MSE order. High MSE usually means higher possibility of accuracy loss happened during the quantization, so fallback those Ops may get some accuracy back. -2. Check the Min-Max data range. An dispersed data range usually means higher accuracy loss, so we can also try to full back those Ops. -3. Check with the other data and find some outliers, and try to fallback some Ops and test for the quantization accuracy. - -*Note: We can't always trust the debug rules, it's only a reference, sometimes the accuracy regression is hard to explain.* - -### Fallback setting example -```python -from neural_compressor import quantization, PostTrainingQuantConfig - -op_name_dict = {"v0/cg/conv0/conv2d/Conv2D": {"activation": {"dtype": ["fp32"]}}} -config = PostTrainingQuantConfig( - diagnosis=True, - op_name_dict=op_name_dict, -) -q_model = quantization.fit( - model, - config, - calib_dataloader=dataloader, - eval_func=eval, -) -``` - -## See profiling data - -In profiling section there is a table with nodes sorted by total execution time. It is possible to check which operations take the most time. - -![profiling](./imgs/terminal-profiling.jpg) diff --git a/docs/source/migration.md b/docs/source/migration.md index ba5f654e41c..b4d087c890f 100644 --- a/docs/source/migration.md +++ b/docs/source/migration.md @@ -195,7 +195,6 @@ QuantizationAwareTrainingConfig( objective="performance", # tuning.objective: same as in the conf.yaml; performance_only=False, # tuning.performance_only: same as in the conf.yaml; ## tuning.random_seed and tuning.tensorboard: these parameters do not need to specially be defined; - ## diagnosis: these parameters do not need to specially be defined; ) ``` diff --git a/docs/source/releases_info.md b/docs/source/releases_info.md index a2b2c15c6ca..7d263a0a8db 100644 --- a/docs/source/releases_info.md +++ b/docs/source/releases_info.md @@ -17,8 +17,6 @@ Contact [inc.maintainers@intel.com](mailto:inc.maintainers@intel.com) if you nee The MSE tuning strategy does not work with the PyTorch adaptor layer. This strategy requires a comparison between the FP32 and INT8 tensors to decide which op impacts the final quantization accuracy. The PyTorch adaptor layer does not implement this inspect tensor interface. Therefore, do not choose the MSE tuning strategy for PyTorch models. -The diagnosis function does not work with ONNX Runtime 1.13.1 for QDQ format quantization of ONNX models. It can not dump the output value of QDQ pairs since framework limitation. - ## Incompatible Changes [Neural Compressor v1.2](https://github.com/intel/neural-compressor/tree/v1.2) introduces incompatible changes in user facing APIs. Please refer to [incompatible changes](incompatible_changes.md) to know which incompatible changes are made in v1.2. diff --git a/docs/source/user_guide.md b/docs/source/user_guide.md index 662a2ec177c..6272eef2ecb 100644 --- a/docs/source/user_guide.md +++ b/docs/source/user_guide.md @@ -52,19 +52,6 @@ In 2.X API, it's very important to create the `DataLoader` and `Metrics` for you -## Neural Coder (Zero-code Optimization) -Neural Coder shows our special innovation about zero-code optimization to help user quickly apply Intel® Neural Compressor optimization without coding. - - - - - - - - - -
LauncherJupyterLab ExtensionVisual Studio Code ExtensionSupported Matrix
- ## Advanced Topics This part provides the advanced topics that help user dive deep into Intel® Neural Compressor. @@ -76,9 +63,8 @@ This part provides the advanced topics that help user dive deep into Intel® Neu - - - + + @@ -88,14 +74,3 @@ This part provides the advanced topics that help user dive deep into Intel® Neu
Calibration
DiagnosisAdd New Data TypeAdd New AdaptorAdd New Data TypeAdd New Adaptor
Distillation for Quantization
- -## Innovations for Productivity -We are continue creating some user-friendly applications to improve the productivity. From v2.2 we have `Neural Solution` for distributed quantization and `Neural Insights` for quantization accuracy debugging. - - - - - - - -
Neural SolutionNeural Insights
diff --git a/examples/onnxrt/image_recognition/mobilenet_v3/quantization/ptq_static/README.md b/examples/onnxrt/image_recognition/mobilenet_v3/quantization/ptq_static/README.md index 9fbd442ce8e..409e8e2a7f4 100644 --- a/examples/onnxrt/image_recognition/mobilenet_v3/quantization/ptq_static/README.md +++ b/examples/onnxrt/image_recognition/mobilenet_v3/quantization/ptq_static/README.md @@ -32,28 +32,6 @@ tar -xvzf caffe_ilsvrc12.tar.gz val.txt # Run -## Diagnosis - -Neural Compressor offers quantization and benchmark diagnosis. Adding `diagnosis` parameter to Quantization/Benchmark config will provide additional details useful in diagnostics. - -### Quantization diagnosis - -``` -config = PostTrainingQuantConfig( - diagnosis=True, - ... -) -``` - -### Benchmark diagnosis - -``` -config = BenchmarkConfig( - diagnosis=True, - ... -) -``` - ## 1. Quantization Quantize model with QLinearOps: diff --git a/examples/onnxrt/image_recognition/mobilenet_v3/quantization/ptq_static/main.py b/examples/onnxrt/image_recognition/mobilenet_v3/quantization/ptq_static/main.py index 1fc6e1b3a4b..90c796e312b 100644 --- a/examples/onnxrt/image_recognition/mobilenet_v3/quantization/ptq_static/main.py +++ b/examples/onnxrt/image_recognition/mobilenet_v3/quantization/ptq_static/main.py @@ -286,9 +286,6 @@ def eval(onnx_model): return eval_func(onnx_model, dataloader, top1) if args.benchmark: - if args.diagnose and args.mode != "performance": - print("[ WARNING ] Diagnosis works only with performance benchmark.") - if args.mode == 'performance': from neural_compressor.benchmark import fit from neural_compressor.config import BenchmarkConfig @@ -297,7 +294,6 @@ def eval(onnx_model): iteration=1000, cores_per_instance=4, num_of_instance=1, - diagnosis=args.diagnose, ) fit(model, conf, b_dataloader=dataloader) elif args.mode == 'accuracy': @@ -308,7 +304,6 @@ def eval(onnx_model): from neural_compressor import quantization, PostTrainingQuantConfig config = PostTrainingQuantConfig( quant_format=args.quant_format, - diagnosis=args.diagnose, ) q_model = quantization.fit(model, config, calib_dataloader=dataloader, diff --git a/examples/onnxrt/image_recognition/onnx_model_zoo/resnet50/quantization/ptq_static/README.md b/examples/onnxrt/image_recognition/onnx_model_zoo/resnet50/quantization/ptq_static/README.md index 47a4f568238..5ec8f534b46 100644 --- a/examples/onnxrt/image_recognition/onnx_model_zoo/resnet50/quantization/ptq_static/README.md +++ b/examples/onnxrt/image_recognition/onnx_model_zoo/resnet50/quantization/ptq_static/README.md @@ -31,29 +31,6 @@ tar -xvzf caffe_ilsvrc12.tar.gz val.txt ``` # Run - -## Diagnosis - -Neural Compressor offers quantization and benchmark diagnosis. Adding `diagnosis` parameter to Quantization/Benchmark config will provide additional details useful in diagnostics. - -### Quantization diagnosis - -``` -config = PostTrainingQuantConfig( - diagnosis=True, - ... -) -``` - -### Benchmark diagnosis - -``` -config = BenchmarkConfig( - diagnosis=True, - ... -) -``` - ## 1. Quantization Quantize model with QLinearOps: diff --git a/examples/onnxrt/image_recognition/onnx_model_zoo/resnet50/quantization/ptq_static/main.py b/examples/onnxrt/image_recognition/onnx_model_zoo/resnet50/quantization/ptq_static/main.py index 91843d01471..aacad83a241 100644 --- a/examples/onnxrt/image_recognition/onnx_model_zoo/resnet50/quantization/ptq_static/main.py +++ b/examples/onnxrt/image_recognition/onnx_model_zoo/resnet50/quantization/ptq_static/main.py @@ -267,8 +267,6 @@ def eval(onnx_model): return eval_func(onnx_model, dataloader, top1) if args.benchmark: - if args.diagnose and args.mode != "performance": - print("[ WARNING ] Diagnosis works only with performance benchmark.") if args.mode == 'performance': from neural_compressor.benchmark import fit from neural_compressor.config import BenchmarkConfig @@ -277,7 +275,6 @@ def eval(onnx_model): iteration=1000, cores_per_instance=4, num_of_instance=1, - diagnosis=args.diagnose, ) fit(model, conf, b_dataloader=dataloader) elif args.mode == 'accuracy': @@ -288,7 +285,6 @@ def eval(onnx_model): from neural_compressor import quantization, PostTrainingQuantConfig config = PostTrainingQuantConfig( quant_format=args.quant_format, - diagnosis=args.diagnose, ) q_model = quantization.fit(model, config, calib_dataloader=dataloader, diff --git a/examples/onnxrt/image_recognition/resnet50_torchvision/quantization/ptq_static/README.md b/examples/onnxrt/image_recognition/resnet50_torchvision/quantization/ptq_static/README.md index 1113e97d6d6..f889c658614 100644 --- a/examples/onnxrt/image_recognition/resnet50_torchvision/quantization/ptq_static/README.md +++ b/examples/onnxrt/image_recognition/resnet50_torchvision/quantization/ptq_static/README.md @@ -32,28 +32,6 @@ tar -xvzf caffe_ilsvrc12.tar.gz val.txt # Run -## Diagnosis - -Neural Compressor offers quantization and benchmark diagnosis. Adding `diagnosis` parameter to Quantization/Benchmark config will provide additional details useful in diagnostics. - -### Quantization diagnosis - -``` -config = PostTrainingQuantConfig( - diagnosis=True, - ... -) -``` - -### Benchmark diagnosis - -``` -config = BenchmarkConfig( - diagnosis=True, - ... -) -``` - ## 1. Quantization Quantize model with QLinearOps: diff --git a/examples/onnxrt/image_recognition/resnet50_torchvision/quantization/ptq_static/main.py b/examples/onnxrt/image_recognition/resnet50_torchvision/quantization/ptq_static/main.py index b42815a1d3d..802e9b18fef 100644 --- a/examples/onnxrt/image_recognition/resnet50_torchvision/quantization/ptq_static/main.py +++ b/examples/onnxrt/image_recognition/resnet50_torchvision/quantization/ptq_static/main.py @@ -295,9 +295,6 @@ def eval_func(model, dataloader, metric): def eval(onnx_model): return eval_func(onnx_model, dataloader, top1) - if args.benchmark and args.diagnose and args.mode != "performance": - print("[ WARNING ] Diagnosis works only with performance benchmark.") - if args.benchmark: if args.mode == 'performance': from neural_compressor.benchmark import fit @@ -307,7 +304,6 @@ def eval(onnx_model): iteration=1000, cores_per_instance=4, num_of_instance=1, - diagnosis=args.diagnose, device=args.device, backend=backend, ) @@ -320,7 +316,6 @@ def eval(onnx_model): from neural_compressor import quantization, PostTrainingQuantConfig config = PostTrainingQuantConfig( quant_format=args.quant_format, - diagnosis=args.diagnose, device=args.device, backend=backend ) diff --git a/examples/onnxrt/nlp/bert/quantization/ptq_dynamic/README.md b/examples/onnxrt/nlp/bert/quantization/ptq_dynamic/README.md index 6e0078f99f3..aaed30c3075 100644 --- a/examples/onnxrt/nlp/bert/quantization/ptq_dynamic/README.md +++ b/examples/onnxrt/nlp/bert/quantization/ptq_dynamic/README.md @@ -32,19 +32,6 @@ python prepare_model.py --input_model='MRPC.zip' --output_model='bert.onnx' # Run -## Diagnosis - -Neural Compressor offers quantization and benchmark diagnosis. Adding `diagnosis` parameter to Quantization/Benchmark config will provide additional details useful in diagnostics. - -### Benchmark diagnosis - -``` -config = BenchmarkConfig( - diagnosis=True, - ... -) -``` - ## 1. Quantization Dynamic quantization: diff --git a/examples/onnxrt/nlp/bert/quantization/ptq_static/README.md b/examples/onnxrt/nlp/bert/quantization/ptq_static/README.md index 3f6d640d947..4fbb4357574 100644 --- a/examples/onnxrt/nlp/bert/quantization/ptq_static/README.md +++ b/examples/onnxrt/nlp/bert/quantization/ptq_static/README.md @@ -31,17 +31,6 @@ python prepare_model.py --input_model='MRPC.zip' --output_model='bert.onnx' # Run -## Diagnosis -Neural Compressor offers quantization and benchmark diagnosis. Adding `diagnosis` parameter to Quantization/Benchmark config will provide additional details useful in diagnostics. - -### Benchmark diagnosis -``` -config = BenchmarkConfig( - diagnosis=True, - ... -) -``` - ## 1. Quantization Static quantization with QOperator format: diff --git a/examples/onnxrt/object_detection/ssd_mobilenet_v1/quantization/ptq_static/README.md b/examples/onnxrt/object_detection/ssd_mobilenet_v1/quantization/ptq_static/README.md index d3c849b517a..47746bb4394 100644 --- a/examples/onnxrt/object_detection/ssd_mobilenet_v1/quantization/ptq_static/README.md +++ b/examples/onnxrt/object_detection/ssd_mobilenet_v1/quantization/ptq_static/README.md @@ -27,28 +27,6 @@ Download [MS COCO 2017 dataset](https://cocodataset.org/#download). # Run -## Diagnosis - -Neural Compressor offers quantization and benchmark diagnosis. Adding `diagnosis` parameter to Quantization/Benchmark config will provide additional details useful in diagnostics. - -### Quantization diagnosis - -``` -config = PostTrainingQuantConfig( - diagnosis=True, - ... -) -``` - -### Benchmark diagnosis - -``` -config = BenchmarkConfig( - diagnosis=True, - ... -) -``` - ## 1. Quantization Static quantization with QOperator format: diff --git a/examples/onnxrt/object_detection/ssd_mobilenet_v1/quantization/ptq_static/main.py b/examples/onnxrt/object_detection/ssd_mobilenet_v1/quantization/ptq_static/main.py index 0e9e0235661..aaffb794e0a 100644 --- a/examples/onnxrt/object_detection/ssd_mobilenet_v1/quantization/ptq_static/main.py +++ b/examples/onnxrt/object_detection/ssd_mobilenet_v1/quantization/ptq_static/main.py @@ -140,8 +140,6 @@ def eval_func(model): return metric.result() if args.benchmark: - if args.diagnose and args.mode != "performance": - print("[ WARNING ] Diagnosis works only with performance benchmark.") if args.mode == 'performance': from neural_compressor.benchmark import fit from neural_compressor.config import BenchmarkConfig @@ -149,7 +147,6 @@ def eval_func(model): iteration=100, cores_per_instance=4, num_of_instance=1, - diagnosis=args.diagnose, device=args.device, backend=backend, ) @@ -169,7 +166,6 @@ def eval_func(model): accuracy_criterion=accuracy_criterion, quant_format=args.quant_format, calibration_sampling_size=[50], - diagnosis=args.diagnose, device=args.device, backend=backend, ) diff --git a/examples/tensorflow/image_recognition/tensorflow_models/mobilenet_v3/quantization/ptq/README.md b/examples/tensorflow/image_recognition/tensorflow_models/mobilenet_v3/quantization/ptq/README.md index 9f368bc8bd6..90c307d5021 100644 --- a/examples/tensorflow/image_recognition/tensorflow_models/mobilenet_v3/quantization/ptq/README.md +++ b/examples/tensorflow/image_recognition/tensorflow_models/mobilenet_v3/quantization/ptq/README.md @@ -76,24 +76,6 @@ config = PostTrainingQuantConfig( ) ``` -## Diagnosis -Neural Compressor offers quantization and benchmark diagnosis. Adding `diagnosis` parameter to Quantization/Benchmark config will provide additional details useful in diagnostics. -### Quantization diagnosis -``` -config = PostTrainingQuantConfig( - diagnosis=True, - ... -) -``` - -### Benchmark diagnosis -``` -config = BenchmarkConfig( - diagnosis=True, - ... -) -``` - ## 1 Quantization ```shell diff --git a/examples/tensorflow/image_recognition/tensorflow_models/mobilenet_v3/quantization/ptq/main.py b/examples/tensorflow/image_recognition/tensorflow_models/mobilenet_v3/quantization/ptq/main.py index c375fa277ec..8c6229989de 100644 --- a/examples/tensorflow/image_recognition/tensorflow_models/mobilenet_v3/quantization/ptq/main.py +++ b/examples/tensorflow/image_recognition/tensorflow_models/mobilenet_v3/quantization/ptq/main.py @@ -249,7 +249,6 @@ def run(self): conf = PostTrainingQuantConfig( calibration_sampling_size=[20, 50], op_name_dict=op_name_dict, - diagnosis=args.diagnose, ) from neural_compressor import Metric top1 = Metric(name="topk", k=1) @@ -283,7 +282,6 @@ def eval(model): iteration=100, cores_per_instance=4, num_of_instance=1, - diagnosis=args.diagnose, ) fit(args.input_graph, conf, b_dataloader=dataloader) elif args.mode == 'accuracy': diff --git a/examples/tensorflow/image_recognition/tensorflow_models/resnet50_v1_5/quantization/ptq/README.md b/examples/tensorflow/image_recognition/tensorflow_models/resnet50_v1_5/quantization/ptq/README.md index 520705edf8f..30e494a47f5 100644 --- a/examples/tensorflow/image_recognition/tensorflow_models/resnet50_v1_5/quantization/ptq/README.md +++ b/examples/tensorflow/image_recognition/tensorflow_models/resnet50_v1_5/quantization/ptq/README.md @@ -72,24 +72,6 @@ config = PostTrainingQuantConfig( ) ``` -## Diagnosis -Neural Compressor offers quantization and benchmark diagnosis. Adding `diagnosis` parameter to Quantization/Benchmark config will provide additional details useful in diagnostics. -### Quantization diagnosis -``` -config = PostTrainingQuantConfig( - diagnosis=True, - ... -) -``` - -### Benchmark diagnosis -``` -config = BenchmarkConfig( - diagnosis=True, - ... -) -``` - ## 1 Quantization ```shell diff --git a/examples/tensorflow/image_recognition/tensorflow_models/resnet50_v1_5/quantization/ptq/main.py b/examples/tensorflow/image_recognition/tensorflow_models/resnet50_v1_5/quantization/ptq/main.py index 11f4dcd6e96..cb944f90711 100644 --- a/examples/tensorflow/image_recognition/tensorflow_models/resnet50_v1_5/quantization/ptq/main.py +++ b/examples/tensorflow/image_recognition/tensorflow_models/resnet50_v1_5/quantization/ptq/main.py @@ -120,7 +120,6 @@ def run(self): conf = PostTrainingQuantConfig( outputs=['softmax_tensor'], calibration_sampling_size=[50, 100], - diagnosis=args.diagnose, ) from neural_compressor import Metric top1 = Metric(name="topk", k=1) @@ -155,7 +154,6 @@ def eval(model): iteration=100, cores_per_instance=4, num_of_instance=1, - diagnosis=args.diagnose, ) fit(args.input_graph, conf, b_dataloader=dataloader) elif args.mode == 'accuracy': diff --git a/examples/tensorflow/image_recognition/tensorflow_models/resnet_v2_50/quantization/ptq/README.md b/examples/tensorflow/image_recognition/tensorflow_models/resnet_v2_50/quantization/ptq/README.md index 547a2f6d7c8..b62baeb61cf 100644 --- a/examples/tensorflow/image_recognition/tensorflow_models/resnet_v2_50/quantization/ptq/README.md +++ b/examples/tensorflow/image_recognition/tensorflow_models/resnet_v2_50/quantization/ptq/README.md @@ -105,24 +105,6 @@ config = PostTrainingQuantConfig( ) ``` -## Diagnosis -Neural Compressor offers quantization and benchmark diagnosis. Adding `diagnosis` parameter to Quantization/Benchmark config will provide additional details useful in diagnostics. -### Quantization diagnosis -``` -config = PostTrainingQuantConfig( - diagnosis=True, - ... -) -``` - -### Benchmark diagnosis -``` -config = BenchmarkConfig( - diagnosis=True, - ... -) -``` - ## 1 Quantization ```shell diff --git a/examples/tensorflow/image_recognition/tensorflow_models/resnet_v2_50/quantization/ptq/main.py b/examples/tensorflow/image_recognition/tensorflow_models/resnet_v2_50/quantization/ptq/main.py index 73da3fd60a6..95b17af0290 100644 --- a/examples/tensorflow/image_recognition/tensorflow_models/resnet_v2_50/quantization/ptq/main.py +++ b/examples/tensorflow/image_recognition/tensorflow_models/resnet_v2_50/quantization/ptq/main.py @@ -114,7 +114,6 @@ def run(self): eval_dataloader = create_dataloader('tensorflow', eval_dataloader_args) conf = PostTrainingQuantConfig( calibration_sampling_size=[50, 100], - diagnosis=args.diagnose, ) from neural_compressor import Metric top1 = Metric(name="topk", k=1) @@ -148,7 +147,6 @@ def eval(model): iteration=100, cores_per_instance=4, num_of_instance=1, - diagnosis=args.diagnose, ) fit(args.input_graph, conf, b_dataloader=dataloader) elif args.mode == 'accuracy': diff --git a/neural_coder/README.md b/neural_coder/README.md deleted file mode 100644 index b7c6d0fb63b..00000000000 --- a/neural_coder/README.md +++ /dev/null @@ -1,52 +0,0 @@ -Neural Coder -=========================== -## What do we offer? - -Neural Coder is a novel component under Intel® Neural Compressor to further simplify the deployment of deep learning models via one-click automated code changes for device switch (e.g., CUDA to CPU) and optimization enabling. Subsequently, Neural Coder can also perform automated benchmark on all applicable optimization sets acquired from the automated enabling, and evaluate for the best out-of-box performance. - -Neural Coder leverages static program analysis techniques and heuristic optimization rules to simplify the usage of various Deep Learning optimization APIs for increasing computation efficiency of AI models and improving user experience for general AI customers. We demonstrate great improvement of developer productivity and aim to facilitate enhanced Deep Learning acceleration adoption via this toolkit. - -Neural Coder helps you code Deep Learning optimizations automatically into your scripts. For example, to apply -- Automatic Mixed Precision (torch.cpu.amp.autocast) -- JIT Script computation graph transformation (torch.jit.script) -- Channels Last memory format transformation (torch.channels_last) - -simultaneously on below PyTorch evaluation code, we generate the optimized code in one-click by detecting the correct position to insert the correct API code lines: -```diff - import torch - import torchvision.models as models - my_model = models.resnet50(pretrained=True) -+ import torch -+ with torch.no_grad(): -+ my_model = my_model.to(memory_format=torch.channels_last) -+ import torch -+ with torch.no_grad(): -+ my_model.eval() -+ my_model = torch.jit.script(my_model) -+ my_model = torch.jit.freeze(my_model) - my_model.eval() - batch_size = 112 - input = torch.rand(batch_size, 3, 224, 224) - with torch.no_grad(): -+ import torch -+ with torch.cpu.amp.autocast(enabled=True, dtype=torch.bfloat16): - my_model(input) -``` - -## Getting Started! - -There are currently 3 ways to use Neural Coder for automatic quantization enabling and benchmark. - -### Jupyter Lab Extension -We offer Neural Coder as an extension plugin in Jupyter Lab. This enables users to utilize Neural Coder while writing their Deep Learning models in Jupyter Lab coding platform. Users can simply search for ```jupyter-lab-neural-compressor``` in the Extension Manager in JupyterLab and install Neural Coder with one click. For more details, please refer to this [guide](extensions/neural_compressor_ext_lab/README.md). - -[AWS Amazon SageMaker](https://aws.amazon.com/sagemaker/) users can also use Neural Coder as an extension following this [guide](docs/AWSSageMakerSupport.md). - -### Python Launcher -Neural Coder can be used as a Python Launcher. Users can run the Python Deep Learning model code as it is with automatic enabling of optimizations by simply adding an inline prefix ```-m neural_coder``` to the Python command line. For more details, please refer to this [guide](docs/PythonLauncher.md). - -### Python API -There are 3 user-facing APIs for Neural Coder: enable, bench and superbench. For more details, please refer to this [guide](docs/PythonAPI.md). We have provided a [list](docs/SupportMatrix.md) of supported Deep Learning optimization features. Specifically for quantization, we provide an auto-quantization API that helps automatically enable quantization on Deep Learning models and automatically evaluates for the best performance on the model with no manual coding needed. Supported features include Post-Training Static Quantization, Post-Training Dynamic Quantization, and Mixed Precision. For more details, please refer to this [guide](docs/Quantization.md). - -## Contact -Please contact us at [inc.maintainers@intel.com](mailto:inc.maintainers@intel.com) for any Neural Coder related question. diff --git a/neural_coder/__init__.py b/neural_coder/__init__.py deleted file mode 100644 index 7bf18cd4956..00000000000 --- a/neural_coder/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from .interface import enable -from .interface import bench -from .interface import superbench - -# from .interface import superreport -from .interface import auto_quant diff --git a/neural_coder/__main__.py b/neural_coder/__main__.py deleted file mode 100644 index 0551b72dc21..00000000000 --- a/neural_coder/__main__.py +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from .launcher import Launcher - -args = Launcher.parse_args() -Launcher.execute(args) diff --git a/neural_coder/backends/.yaml b/neural_coder/backends/.yaml deleted file mode 100644 index 1e3b1fa1501..00000000000 --- a/neural_coder/backends/.yaml +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - - - - - - content: - - |- - [+] YOUR CODE LINE 1 - [+] YOUR CODE LINE 2 - [+] YOUR CODE LINE 3 - - |- - [+] YOUR CODE LINE 1 - [+] YOUR CODE LINE 2 - [+] YOUR CODE LINE 3 - - |- - [+] YOUR CODE LINE 1 - [+] YOUR CODE LINE 2 - [+] YOUR CODE LINE 3 - order: - - below: - - - - - above: - - - - - - below: - - - - - above: - - - - - - below: - - - - - above: - - - - diff --git a/neural_coder/backends/__init__.py b/neural_coder/backends/__init__.py deleted file mode 100644 index e833188cc78..00000000000 --- a/neural_coder/backends/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/neural_coder/backends/intel_extension_for_transformers.yaml b/neural_coder/backends/intel_extension_for_transformers.yaml deleted file mode 100644 index a1accbbfb4b..00000000000 --- a/neural_coder/backends/intel_extension_for_transformers.yaml +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Note: For intel_extension_for_transformers support -# we default apply "PostTrainingDynamic" and "eval_f1" -# support for customization is pending further evaluation - -transformation: - location: - - ["insert_below_dataloader_definition_line", "insert_below_model_definition_line"] - content: - - |- - [+] metric = metrics.Metric(name="eval_f1", is_relative=True, criterion=0.01) - [+] objective = objectives.performance - [+] q_config = QuantizationConfig(approach="PostTrainingDynamic", metrics=[metric], objectives=[objective]) - [+] MODEL_NAME = trainer.quantize(quant_config=q_config) - order: - - below: - above: - - pytorch_jit_script - - pytorch_jit_script_ofi - - pytorch_jit_trace - - pytorch_jit_trace_ofi - - pytorch_channels_last diff --git a/neural_coder/backends/keras_inc.yaml b/neural_coder/backends/keras_inc.yaml deleted file mode 100644 index 0731a4bbbc9..00000000000 --- a/neural_coder/backends/keras_inc.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_dataloader_definition_line", "insert_below_model_definition_line"] - content: - - |- - [+] from neural_compressor.quantization import fit - [+] from neural_compressor.config import PostTrainingQuantConfig - [+] config = PostTrainingQuantConfig(backend='itex', quant_level=1) - [+] quantized_model = fit(MODEL_NAME, conf=config, calib_dataloader=DATALOADER_NAME, eval_func=eval_func) - [+] quantized_model.save("./quantized_model") - order: - - below: - above: diff --git a/neural_coder/backends/nano_bf16.yaml b/neural_coder/backends/nano_bf16.yaml deleted file mode 100644 index afecf6908f1..00000000000 --- a/neural_coder/backends/nano_bf16.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - - "indent_inference_line" - content: - - |- - [+] from bigdl.nano.pytorch import InferenceOptimizer - [+] MODEL_NAME = InferenceOptimizer.quantize(MODEL_NAME, precision="bf16", input_sample=INPUT_NAME) - [+] with InferenceOptimizer.get_context(MODEL_NAME): - - 1 - order: - - below: - above: diff --git a/neural_coder/backends/nano_bf16_channels_last.yaml b/neural_coder/backends/nano_bf16_channels_last.yaml deleted file mode 100644 index d0f3987ef29..00000000000 --- a/neural_coder/backends/nano_bf16_channels_last.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - - "indent_inference_line" - content: - - |- - [+] from bigdl.nano.pytorch import InferenceOptimizer - [+] MODEL_NAME = InferenceOptimizer.quantize(MODEL_NAME, precision="bf16", channels_last=True, input_sample=INPUT_NAME) - [+] with InferenceOptimizer.get_context(MODEL_NAME): - - 1 - order: - - below: - above: diff --git a/neural_coder/backends/nano_bf16_ipex.yaml b/neural_coder/backends/nano_bf16_ipex.yaml deleted file mode 100644 index 6e8db6f8719..00000000000 --- a/neural_coder/backends/nano_bf16_ipex.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - - "indent_inference_line" - content: - - |- - [+] from bigdl.nano.pytorch import InferenceOptimizer - [+] MODEL_NAME = InferenceOptimizer.quantize(MODEL_NAME, precision="bf16", use_ipex=True, input_sample=INPUT_NAME) - [+] with InferenceOptimizer.get_context(MODEL_NAME): - - 1 - order: - - below: - above: diff --git a/neural_coder/backends/nano_bf16_ipex_channels_last.yaml b/neural_coder/backends/nano_bf16_ipex_channels_last.yaml deleted file mode 100644 index 3b99ef12f35..00000000000 --- a/neural_coder/backends/nano_bf16_ipex_channels_last.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - - "indent_inference_line" - content: - - |- - [+] from bigdl.nano.pytorch import InferenceOptimizer - [+] MODEL_NAME = InferenceOptimizer.quantize(MODEL_NAME, precision="bf16", use_ipex=True, channels_last=True, input_sample=INPUT_NAME) - [+] with InferenceOptimizer.get_context(MODEL_NAME): - - 1 - order: - - below: - above: diff --git a/neural_coder/backends/nano_fp32_channels_last.yaml b/neural_coder/backends/nano_fp32_channels_last.yaml deleted file mode 100644 index 9516ba4d50d..00000000000 --- a/neural_coder/backends/nano_fp32_channels_last.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - - "indent_inference_line" - content: - - |- - [+] from bigdl.nano.pytorch import InferenceOptimizer - [+] MODEL_NAME = InferenceOptimizer.trace(MODEL_NAME, channels_last=True, input_sample=INPUT_NAME) - [+] with InferenceOptimizer.get_context(MODEL_NAME): - - 1 - order: - - below: - above: diff --git a/neural_coder/backends/nano_fp32_ipex.yaml b/neural_coder/backends/nano_fp32_ipex.yaml deleted file mode 100644 index c6fc4329b38..00000000000 --- a/neural_coder/backends/nano_fp32_ipex.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - - "indent_inference_line" - content: - - |- - [+] from bigdl.nano.pytorch import InferenceOptimizer - [+] MODEL_NAME = InferenceOptimizer.trace(MODEL_NAME, use_ipex=True, input_sample=INPUT_NAME) - [+] with InferenceOptimizer.get_context(MODEL_NAME): - - 1 - order: - - below: - above: diff --git a/neural_coder/backends/nano_fp32_ipex_channels_last.yaml b/neural_coder/backends/nano_fp32_ipex_channels_last.yaml deleted file mode 100644 index aea74db737a..00000000000 --- a/neural_coder/backends/nano_fp32_ipex_channels_last.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - - "indent_inference_line" - content: - - |- - [+] from bigdl.nano.pytorch import InferenceOptimizer - [+] MODEL_NAME = InferenceOptimizer.trace(MODEL_NAME, use_ipex=True, channels_last=True, input_sample=INPUT_NAME) - [+] with InferenceOptimizer.get_context(MODEL_NAME): - - 1 - order: - - below: - above: diff --git a/neural_coder/backends/nano_gpu_to_cpu.yaml b/neural_coder/backends/nano_gpu_to_cpu.yaml deleted file mode 100644 index 426f72ce980..00000000000 --- a/neural_coder/backends/nano_gpu_to_cpu.yaml +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_above_model_definition_line", "insert_above_input_definition_line"] - content: - - |- - [+] from bigdl.nano.pytorch import patch_torch - [+] patch_torch() - order: - - below: - above: diff --git a/neural_coder/backends/nano_int8.yaml b/neural_coder/backends/nano_int8.yaml deleted file mode 100644 index cb846256435..00000000000 --- a/neural_coder/backends/nano_int8.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - - "indent_inference_line" - content: - - |- - [+] from bigdl.nano.pytorch import InferenceOptimizer - [+] MODEL_NAME = InferenceOptimizer.quantize(MODEL_NAME, precision="int8", input_sample=INPUT_NAME) - [+] with InferenceOptimizer.get_context(MODEL_NAME): - - 1 - order: - - below: - above: diff --git a/neural_coder/backends/nano_jit_bf16.yaml b/neural_coder/backends/nano_jit_bf16.yaml deleted file mode 100644 index 122d93ca717..00000000000 --- a/neural_coder/backends/nano_jit_bf16.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - - "indent_inference_line" - content: - - |- - [+] from bigdl.nano.pytorch import InferenceOptimizer - [+] MODEL_NAME = InferenceOptimizer.quantize(MODEL_NAME, accelerator="jit", precision="bf16", input_sample=INPUT_NAME) - [+] with InferenceOptimizer.get_context(MODEL_NAME): - - 1 - order: - - below: - above: diff --git a/neural_coder/backends/nano_jit_bf16_channels_last.yaml b/neural_coder/backends/nano_jit_bf16_channels_last.yaml deleted file mode 100644 index cf7e1437c4a..00000000000 --- a/neural_coder/backends/nano_jit_bf16_channels_last.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - - "indent_inference_line" - content: - - |- - [+] from bigdl.nano.pytorch import InferenceOptimizer - [+] MODEL_NAME = InferenceOptimizer.quantize(MODEL_NAME, accelerator="jit", precision="bf16", channels_last=True, input_sample=INPUT_NAME) - [+] with InferenceOptimizer.get_context(MODEL_NAME): - - 1 - order: - - below: - above: diff --git a/neural_coder/backends/nano_jit_bf16_ipex.yaml b/neural_coder/backends/nano_jit_bf16_ipex.yaml deleted file mode 100644 index 1a237c6edf8..00000000000 --- a/neural_coder/backends/nano_jit_bf16_ipex.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - - "indent_inference_line" - content: - - |- - [+] from bigdl.nano.pytorch import InferenceOptimizer - [+] MODEL_NAME = InferenceOptimizer.quantize(MODEL_NAME, accelerator="jit", precision="bf16", use_ipex=True, input_sample=INPUT_NAME) - [+] with InferenceOptimizer.get_context(MODEL_NAME): - - 1 - order: - - below: - above: diff --git a/neural_coder/backends/nano_jit_bf16_ipex_channels_last.yaml b/neural_coder/backends/nano_jit_bf16_ipex_channels_last.yaml deleted file mode 100644 index 603db6942f8..00000000000 --- a/neural_coder/backends/nano_jit_bf16_ipex_channels_last.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - - "indent_inference_line" - content: - - |- - [+] from bigdl.nano.pytorch import InferenceOptimizer - [+] MODEL_NAME = InferenceOptimizer.quantize(MODEL_NAME, accelerator="jit", precision="bf16", use_ipex=True, channels_last=True, input_sample=INPUT_NAME) - [+] with InferenceOptimizer.get_context(MODEL_NAME): - - 1 - order: - - below: - above: diff --git a/neural_coder/backends/nano_jit_fp32.yaml b/neural_coder/backends/nano_jit_fp32.yaml deleted file mode 100644 index 71e7d4ede95..00000000000 --- a/neural_coder/backends/nano_jit_fp32.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - - "indent_inference_line" - content: - - |- - [+] from bigdl.nano.pytorch import InferenceOptimizer - [+] MODEL_NAME = InferenceOptimizer.trace(MODEL_NAME, accelerator="jit", input_sample=INPUT_NAME) - [+] with InferenceOptimizer.get_context(MODEL_NAME): - - 1 - order: - - below: - above: diff --git a/neural_coder/backends/nano_jit_fp32_channels_last.yaml b/neural_coder/backends/nano_jit_fp32_channels_last.yaml deleted file mode 100644 index c30a1767175..00000000000 --- a/neural_coder/backends/nano_jit_fp32_channels_last.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - - "indent_inference_line" - content: - - |- - [+] from bigdl.nano.pytorch import InferenceOptimizer - [+] MODEL_NAME = InferenceOptimizer.trace(MODEL_NAME, accelerator="jit", channels_last=True, input_sample=INPUT_NAME) - [+] with InferenceOptimizer.get_context(MODEL_NAME): - - 1 - order: - - below: - above: diff --git a/neural_coder/backends/nano_jit_fp32_ipex.yaml b/neural_coder/backends/nano_jit_fp32_ipex.yaml deleted file mode 100644 index f673b076a20..00000000000 --- a/neural_coder/backends/nano_jit_fp32_ipex.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - - "indent_inference_line" - content: - - |- - [+] from bigdl.nano.pytorch import InferenceOptimizer - [+] MODEL_NAME = InferenceOptimizer.trace(MODEL_NAME, accelerator="jit", use_ipex=True, input_sample=INPUT_NAME) - [+] with InferenceOptimizer.get_context(MODEL_NAME): - - 1 - order: - - below: - above: diff --git a/neural_coder/backends/nano_jit_fp32_ipex_channels_last.yaml b/neural_coder/backends/nano_jit_fp32_ipex_channels_last.yaml deleted file mode 100644 index 54514000ac5..00000000000 --- a/neural_coder/backends/nano_jit_fp32_ipex_channels_last.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - - "indent_inference_line" - content: - - |- - [+] from bigdl.nano.pytorch import InferenceOptimizer - [+] MODEL_NAME = InferenceOptimizer.trace(MODEL_NAME, accelerator="jit", use_ipex=True, channels_last=True, input_sample=INPUT_NAME) - [+] with InferenceOptimizer.get_context(MODEL_NAME): - - 1 - order: - - below: - above: diff --git a/neural_coder/backends/nano_onnxruntime_fp32.yaml b/neural_coder/backends/nano_onnxruntime_fp32.yaml deleted file mode 100644 index c29e3410bc4..00000000000 --- a/neural_coder/backends/nano_onnxruntime_fp32.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - - "indent_inference_line" - content: - - |- - [+] from bigdl.nano.pytorch import InferenceOptimizer - [+] MODEL_NAME = InferenceOptimizer.trace(MODEL_NAME, accelerator="onnxruntime", input_sample=INPUT_NAME) - [+] with InferenceOptimizer.get_context(MODEL_NAME): - - 1 - order: - - below: - above: diff --git a/neural_coder/backends/nano_onnxruntime_int8_qlinear.yaml b/neural_coder/backends/nano_onnxruntime_int8_qlinear.yaml deleted file mode 100644 index bb5b35557da..00000000000 --- a/neural_coder/backends/nano_onnxruntime_int8_qlinear.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - - "indent_inference_line" - content: - - |- - [+] from bigdl.nano.pytorch import InferenceOptimizer - [+] MODEL_NAME = InferenceOptimizer.quantize(MODEL_NAME, accelerator="onnxruntime", precision="int8", input_sample=INPUT_NAME) - [+] with InferenceOptimizer.get_context(MODEL_NAME): - - 1 - order: - - below: - above: diff --git a/neural_coder/backends/nano_openvino_fp32.yaml b/neural_coder/backends/nano_openvino_fp32.yaml deleted file mode 100644 index 6b9324cec39..00000000000 --- a/neural_coder/backends/nano_openvino_fp32.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - - "indent_inference_line" - content: - - |- - [+] from bigdl.nano.pytorch import InferenceOptimizer - [+] MODEL_NAME = InferenceOptimizer.trace(MODEL_NAME, accelerator="openvino", input_sample=INPUT_NAME) - [+] with InferenceOptimizer.get_context(MODEL_NAME): - - 1 - order: - - below: - above: diff --git a/neural_coder/backends/nano_openvino_int8.yaml b/neural_coder/backends/nano_openvino_int8.yaml deleted file mode 100644 index 9f1b70814e7..00000000000 --- a/neural_coder/backends/nano_openvino_int8.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - - "indent_inference_line" - content: - - |- - [+] from bigdl.nano.pytorch import InferenceOptimizer - [+] MODEL_NAME = InferenceOptimizer.quantize(MODEL_NAME, accelerator="openvino", precision="int8", input_sample=INPUT_NAME) - [+] with InferenceOptimizer.get_context(MODEL_NAME): - - 1 - order: - - below: - above: diff --git a/neural_coder/backends/onnx_inc_dynamic_quant.yaml b/neural_coder/backends/onnx_inc_dynamic_quant.yaml deleted file mode 100644 index 98a98d941ca..00000000000 --- a/neural_coder/backends/onnx_inc_dynamic_quant.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - insert_below_model_definition_line - content: - - |- - [+] from neural_compressor.quantization import fit - [+] from neural_compressor.config import PostTrainingQuantConfig - [+] config = PostTrainingQuantConfig(approach='dynamic', quant_level=1) - [+] MODEL_NAME = fit(MODEL_NAME, conf=config, calib_dataloader=DATALOADER_NAME, eval_func=EVAL_FUNCTION_NAME) - [+] MODEL_NAME.save("./quantized_model.onnx") - order: - - below: - above: diff --git a/neural_coder/backends/onnx_inc_static_quant_qdq.yaml b/neural_coder/backends/onnx_inc_static_quant_qdq.yaml deleted file mode 100644 index 6df51eefb54..00000000000 --- a/neural_coder/backends/onnx_inc_static_quant_qdq.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - insert_below_model_definition_line - content: - - |- - [+] from neural_compressor.quantization import fit - [+] from neural_compressor.config import PostTrainingQuantConfig - [+] config = PostTrainingQuantConfig(quant_format='QDQ', quant_level=1) - [+] MODEL_NAME = fit(MODEL_NAME, conf=config, calib_dataloader=DATALOADER_NAME, eval_func=EVAL_FUNCTION_NAME) - [+] MODEL_NAME.save("./quantized_model.onnx") - order: - - below: - above: diff --git a/neural_coder/backends/onnx_inc_static_quant_qlinear.yaml b/neural_coder/backends/onnx_inc_static_quant_qlinear.yaml deleted file mode 100644 index 0c7f5e500f7..00000000000 --- a/neural_coder/backends/onnx_inc_static_quant_qlinear.yaml +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - insert_below_model_definition_line - content: - - |- - [+] from neural_compressor.quantization import fit - [+] from neural_compressor.config import PostTrainingQuantConfig - [+] config = PostTrainingQuantConfig(quant_format='default', quant_level=1) - [+] MODEL_NAME = fit(MODEL_NAME, conf=config, calib_dataloader=DATALOADER_NAME, eval_func=EVAL_FUNCTION_NAME) - [+] MODEL_NAME.save("./quantized_model.onnx") - order: - - below: - above: diff --git a/neural_coder/backends/pytorch_aliblade.yaml b/neural_coder/backends/pytorch_aliblade.yaml deleted file mode 100644 index ba29ac86548..00000000000 --- a/neural_coder/backends/pytorch_aliblade.yaml +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - content: - - |- - [+] import torch_blade - [+] with torch.no_grad(): - [+] MODEL_NAME = torch_blade.optimize(MODEL_NAME, allow_tracing=True, model_inputs=tuple(INPUT_NAME)) - order: - - below: - above: diff --git a/neural_coder/backends/pytorch_benchmark.yaml b/neural_coder/backends/pytorch_benchmark.yaml deleted file mode 100644 index 1a153637d57..00000000000 --- a/neural_coder/backends/pytorch_benchmark.yaml +++ /dev/null @@ -1,68 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - insert_above_inference_line - - insert_below_inference_line - - indent_inference_line - content: - - |- - [+] if not ACCURACY_MODE: - [+] try: - [+] time - [+] time_nc = time.time - [+] except: - [+] from time import time as time_nc - [+] count_iter_ = 0 - [+] total_time_ = 0 - [+] num_iter_ = NUM_BENCHMARK_ITERATION - [+] num_warmup_iter_ = 10 - [+] list_batch_time_ = [] - [+] for i_ in range(num_iter_): - [+] count_iter_ = count_iter_ + 1 - [+] if count_iter_ > num_warmup_iter_: - [+] t1_ = time_nc() - [+] try: - [+] torch - [+] no_grad = torch.no_grad - [+] except: - [+] from torch import no_grad - [+] with no_grad(): - - |- - [+] if count_iter_ > num_warmup_iter_: - [+] t2_ = time_nc() - [+] batch_time_ = t2_ - t1_ - [+] list_batch_time_.append(batch_time_) - [+] total_time_ = total_time_ + batch_time_ - [+] print("Neural_Coder_Bench_IPS: ", round((num_iter_ - num_warmup_iter_) / total_time_, 3)) - [+] print("Neural_Coder_Bench_MSPI: ", round(total_time_ / (num_iter_ - num_warmup_iter_) * 1000, 3)) - [+] list_batch_time_.sort() - [+] p50_latency_ = list_batch_time_[int(len(list_batch_time_) * 0.50) - 1] * 1000 - [+] p90_latency_ = list_batch_time_[int(len(list_batch_time_) * 0.90) - 1] * 1000 - [+] p99_latency_ = list_batch_time_[int(len(list_batch_time_) * 0.99) - 1] * 1000 - [+] print("Neural_Coder_Bench_P50: ", round(p50_latency_, 3)) - [+] print("Neural_Coder_Bench_P90: ", round(p90_latency_, 3)) - [+] print("Neural_Coder_Bench_P99: ", round(p99_latency_, 3)) - [+] quit() - [+] else: - [+] INFERENCE_LINE - - 3 - order: - - below: - above: - - below: - above: - - below: - above: diff --git a/neural_coder/backends/pytorch_channels_last.yaml b/neural_coder/backends/pytorch_channels_last.yaml deleted file mode 100644 index 75343032b02..00000000000 --- a/neural_coder/backends/pytorch_channels_last.yaml +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - insert_below_model_definition_line - content: - - |- - [+] import torch - [+] with torch.no_grad(): - [+] MODEL_NAME.eval() - [+] MODEL_NAME = MODEL_NAME.to(memory_format=torch.channels_last) - order: - - below: - - pytorch_inc_static_quant_fx - - pytorch_inc_static_quant_ipex - - pytorch_inc_dynamic_quant - above: - - pytorch_ipex_fp32 - - pytorch_ipex_bf16 - - pytorch_ipex_int8_static_quant - - pytorch_ipex_int8_dynamic_quant - - pytorch_jit_script - - pytorch_jit_script_ofi - - pytorch_jit_trace - - pytorch_jit_trace_ofi diff --git a/neural_coder/backends/pytorch_inc_bf16.yaml b/neural_coder/backends/pytorch_inc_bf16.yaml deleted file mode 100644 index bdbf3b07272..00000000000 --- a/neural_coder/backends/pytorch_inc_bf16.yaml +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - insert_below_model_definition_line - content: - - |- - [+] import torch - [+] torch.backends.quantized.engine = 'onednn' - [+] from neural_compressor.config import MixedPrecisionConfig - [+] from neural_compressor import mix_precision - [+] config = MixedPrecisionConfig() - [+] MODEL_NAME = mix_precision.fit(model=MODEL_NAME, config=config) - [+] try: - [+] with torch.no_grad(): - [+] MODEL_NAME = torch.jit.script(MODEL_NAME) - [+] MODEL_NAME = torch.jit.freeze(MODEL_NAME) - [+] except: - [+] pass - order: - - below: - above: - - pytorch_jit_script - - pytorch_jit_script_ofi - - pytorch_jit_trace - - pytorch_jit_trace_ofi - - pytorch_channels_last diff --git a/neural_coder/backends/pytorch_inc_dynamic_quant.yaml b/neural_coder/backends/pytorch_inc_dynamic_quant.yaml deleted file mode 100644 index edb27b4d188..00000000000 --- a/neural_coder/backends/pytorch_inc_dynamic_quant.yaml +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - insert_below_model_definition_line - content: - - |- - [+] def eval_func(model): - [+] EVAL_FUNC_LINES - [+] try: - [+] torch.backends.quantized.engine = 'onednn' - [+] except: - [+] from torch.backends.quantized import engine; engine = 'onednn' - [+] from neural_compressor.config import PostTrainingQuantConfig - [+] from neural_compressor.quantization import fit - [+] conf = PostTrainingQuantConfig(approach="dynamic", quant_level=1) - [+] MODEL_NAME = fit(model=MODEL_NAME, conf=conf, eval_func=eval_func) - [+] MODEL_NAME.save("./quantized_model") - [+] MODEL_NAME.eval() - [+] try: - [+] with torch.no_grad(): - [+] MODEL_NAME = torch.jit.script(MODEL_NAME) - [+] MODEL_NAME = torch.jit.freeze(MODEL_NAME) - [+] except: - [+] pass - order: - - below: - above: - - pytorch_jit_script - - pytorch_jit_script_ofi - - pytorch_jit_trace - - pytorch_jit_trace_ofi - - pytorch_channels_last diff --git a/neural_coder/backends/pytorch_inc_dynamic_quant_fp8.yaml b/neural_coder/backends/pytorch_inc_dynamic_quant_fp8.yaml deleted file mode 100644 index f32b91389bb..00000000000 --- a/neural_coder/backends/pytorch_inc_dynamic_quant_fp8.yaml +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_dataloader_definition_line", "insert_below_model_definition_line"] - content: - - |- - [+] def eval_func(model): - [+] EVAL_FUNC_LINES - [+] try: - [+] torch.backends.quantized.engine = 'onednn' - [+] except: - [+] from torch.backends.quantized import engine; engine = 'onednn' - [+] from neural_compressor.config import PostTrainingQuantConfig - [+] from neural_compressor.quantization import fit - [+] conf = PostTrainingQuantConfig(approach="dynamic", precision = FP8_DATA_FORMAT, quant_level=1) - [+] MODEL_NAME = fit(model=MODEL_NAME, conf=conf, calib_dataloader=DATALOADER_NAME, eval_func=eval_func) - [+] MODEL_NAME.save("./quantized_model") - [+] MODEL_NAME.eval() - [+] try: - [+] with torch.no_grad(): - [+] MODEL_NAME = torch.jit.script(MODEL_NAME) - [+] MODEL_NAME = torch.jit.freeze(MODEL_NAME) - [+] except: - [+] pass - order: - - below: - above: - - pytorch_jit_script - - pytorch_jit_script_ofi - - pytorch_jit_trace - - pytorch_jit_trace_ofi - - pytorch_channels_last diff --git a/neural_coder/backends/pytorch_inc_huggingface_optimum_dynamic.yaml b/neural_coder/backends/pytorch_inc_huggingface_optimum_dynamic.yaml deleted file mode 100644 index 890ff34d0a2..00000000000 --- a/neural_coder/backends/pytorch_inc_huggingface_optimum_dynamic.yaml +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_dataloader_definition_line", "insert_below_model_definition_line"] - content: - - |- - [+] def eval_func(model): - [+] EVAL_FUNC_LINES - [+] from neural_compressor.config import PostTrainingQuantConfig - [+] from optimum.intel.neural_compressor import INCQuantizer - [+] quantization_config = PostTrainingQuantConfig(approach="dynamic", quant_level=1) - [+] quantizer = INCQuantizer.from_pretrained(MODEL_NAME) - [+] quantizer.quantize(quantization_config=quantization_config, save_directory="quantized_model", save_onnx_model=False) - [+] MODEL_NAME = quantizer._quantized_model - [+] MODEL_NAME.save("./quantized_model") - [+] MODEL_NAME.eval() - order: - - below: - above: - - pytorch_jit_script - - pytorch_jit_script_ofi - - pytorch_jit_trace - - pytorch_jit_trace_ofi - - pytorch_channels_last diff --git a/neural_coder/backends/pytorch_inc_huggingface_optimum_static.yaml b/neural_coder/backends/pytorch_inc_huggingface_optimum_static.yaml deleted file mode 100644 index 08df89f24fd..00000000000 --- a/neural_coder/backends/pytorch_inc_huggingface_optimum_static.yaml +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_dataloader_definition_line", "insert_below_model_definition_line"] - content: - - |- - [+] def eval_func(model): - [+] EVAL_FUNC_LINES - [+] from neural_compressor.config import PostTrainingQuantConfig - [+] from optimum.intel.neural_compressor import INCQuantizer - [+] quantization_config = PostTrainingQuantConfig(approach="static", quant_level=1) - [+] quantizer = INCQuantizer.from_pretrained(MODEL_NAME) - [+] quantizer.quantize(quantization_config=quantization_config, calibration_dataset=eval_dataset, save_directory="quantized_model", save_onnx_model=False) - [+] MODEL_NAME = quantizer._quantized_model - [+] MODEL_NAME.save("./quantized_model") - [+] MODEL_NAME.eval() - order: - - below: - above: - - pytorch_jit_script - - pytorch_jit_script_ofi - - pytorch_jit_trace - - pytorch_jit_trace_ofi - - pytorch_channels_last diff --git a/neural_coder/backends/pytorch_inc_static_quant_fx.yaml b/neural_coder/backends/pytorch_inc_static_quant_fx.yaml deleted file mode 100644 index f77801ebc51..00000000000 --- a/neural_coder/backends/pytorch_inc_static_quant_fx.yaml +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_dataloader_definition_line", "insert_below_model_definition_line"] - content: - - |- - [+] def eval_func(model): - [+] EVAL_FUNC_LINES - [+] try: - [+] torch.backends.quantized.engine = 'onednn' - [+] except: - [+] from torch.backends.quantized import engine; engine = 'onednn' - [+] from neural_compressor.config import PostTrainingQuantConfig - [+] from neural_compressor.quantization import fit - [+] conf = PostTrainingQuantConfig(quant_level=1) - [+] MODEL_NAME = fit(model=MODEL_NAME, conf=conf, calib_dataloader=DATALOADER_NAME, eval_func=eval_func) - [+] MODEL_NAME.save("./quantized_model") - [+] MODEL_NAME.eval() - [+] try: - [+] with torch.no_grad(): - [+] MODEL_NAME = torch.jit.script(MODEL_NAME) - [+] MODEL_NAME = torch.jit.freeze(MODEL_NAME) - [+] except: - [+] pass - - order: - - below: - above: - - pytorch_jit_script - - pytorch_jit_script_ofi - - pytorch_jit_trace - - pytorch_jit_trace_ofi - - pytorch_channels_last diff --git a/neural_coder/backends/pytorch_inc_static_quant_fx_fp8.yaml b/neural_coder/backends/pytorch_inc_static_quant_fx_fp8.yaml deleted file mode 100644 index 419c5256588..00000000000 --- a/neural_coder/backends/pytorch_inc_static_quant_fx_fp8.yaml +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_dataloader_definition_line", "insert_below_model_definition_line"] - content: - - |- - [+] def eval_func(model): - [+] EVAL_FUNC_LINES - [+] try: - [+] torch.backends.quantized.engine = 'onednn' - [+] except: - [+] from torch.backends.quantized import engine; engine = 'onednn' - [+] from neural_compressor.config import PostTrainingQuantConfig - [+] from neural_compressor.quantization import fit - [+] conf = PostTrainingQuantConfig(precision=FP8_DATA_FORMAT, quant_level=1) - [+] MODEL_NAME = fit(model=MODEL_NAME, conf=conf, calib_dataloader=DATALOADER_NAME, eval_func=eval_func) - [+] MODEL_NAME.save("./quantized_model") - [+] MODEL_NAME.eval() - [+] try: - [+] with torch.no_grad(): - [+] MODEL_NAME = torch.jit.script(MODEL_NAME) - [+] MODEL_NAME = torch.jit.freeze(MODEL_NAME) - [+] except: - [+] pass - - order: - - below: - above: - - pytorch_jit_script - - pytorch_jit_script_ofi - - pytorch_jit_trace - - pytorch_jit_trace_ofi - - pytorch_channels_last diff --git a/neural_coder/backends/pytorch_inc_static_quant_ipex.yaml b/neural_coder/backends/pytorch_inc_static_quant_ipex.yaml deleted file mode 100644 index 9cde95fa197..00000000000 --- a/neural_coder/backends/pytorch_inc_static_quant_ipex.yaml +++ /dev/null @@ -1,33 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_dataloader_definition_line", "insert_below_model_definition_line"] - content: - - |- - [+] from neural_compressor.config import PostTrainingQuantConfig - [+] from neural_compressor.quantization import fit - [+] conf = PostTrainingQuantConfig(backend='ipex', quant_level=1) - [+] MODEL_NAME = fit(model=MODEL_NAME, conf=conf, calib_dataloader=DATALOADER_NAME) - [+] MODEL_NAME.save("./quantized_model") - [+] MODEL_NAME.eval() - order: - - below: - above: - - pytorch_jit_script - - pytorch_jit_script_ofi - - pytorch_jit_trace - - pytorch_jit_trace_ofi - - pytorch_channels_last diff --git a/neural_coder/backends/pytorch_inc_static_quant_ipex_xpu.yaml b/neural_coder/backends/pytorch_inc_static_quant_ipex_xpu.yaml deleted file mode 100644 index f4835516cdf..00000000000 --- a/neural_coder/backends/pytorch_inc_static_quant_ipex_xpu.yaml +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_dataloader_definition_line", "insert_below_model_definition_line"] - content: - - |- - [+] from neural_compressor.config import PostTrainingQuantConfig - [+] from neural_compressor.quantization import fit - [+] MODEL_NAME = MODEL_NAME.to("xpu") - [+] conf = PostTrainingQuantConfig(backend='ipex', quant_level=1, device="xpu") - [+] MODEL_NAME = fit(model=MODEL_NAME, conf=conf, calib_dataloader=DATALOADER_NAME) - [+] MODEL_NAME.save("./quantized_model") - [+] MODEL_NAME.eval() - order: - - below: - above: - - pytorch_jit_script - - pytorch_jit_script_ofi - - pytorch_jit_trace - - pytorch_jit_trace_ofi - - pytorch_channels_last diff --git a/neural_coder/backends/pytorch_ipex_bf16.yaml b/neural_coder/backends/pytorch_ipex_bf16.yaml deleted file mode 100644 index d27f7c6c58b..00000000000 --- a/neural_coder/backends/pytorch_ipex_bf16.yaml +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - insert_below_model_definition_line - - insert_above_inference_line - - indent_inference_line - content: - - |- - [+] import torch - [+] import intel_extension_for_pytorch as ipex - [+] with torch.no_grad(): - [+] MODEL_NAME.eval() - [+] MODEL_NAME = ipex.optimize(MODEL_NAME, dtype=torch.bfloat16) - - |- - [+] import torch - [+] with torch.cpu.amp.autocast(enabled=True, dtype=torch.bfloat16): - - 1 - order: - - below: - - pytorch_channels_last - above: - - pytorch_jit_script - - pytorch_jit_script_ofi - - pytorch_jit_trace - - pytorch_jit_trace_ofi - - below: - above: - - below: - above: diff --git a/neural_coder/backends/pytorch_ipex_fp32.yaml b/neural_coder/backends/pytorch_ipex_fp32.yaml deleted file mode 100644 index 0256429948d..00000000000 --- a/neural_coder/backends/pytorch_ipex_fp32.yaml +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - insert_below_model_definition_line - content: - - |- - [+] import torch - [+] import intel_extension_for_pytorch as ipex - [+] with torch.no_grad(): - [+] MODEL_NAME.eval() - [+] MODEL_NAME = ipex.optimize(MODEL_NAME, dtype=torch.float32) - order: - - below: - - pytorch_channels_last - above: - - pytorch_jit_script - - pytorch_jit_script_ofi - - pytorch_jit_trace - - pytorch_jit_trace_ofi diff --git a/neural_coder/backends/pytorch_ipex_int8_dynamic_quant.yaml b/neural_coder/backends/pytorch_ipex_int8_dynamic_quant.yaml deleted file mode 100644 index 06d35d57ef8..00000000000 --- a/neural_coder/backends/pytorch_ipex_int8_dynamic_quant.yaml +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - content: - - |- - [+] if "quantize" not in str(type(MODEL_NAME)) and "jit" not in str(type(MODEL_NAME)): - [+] import torch - [+] import intel_extension_for_pytorch as ipex - [+] qconfig = ipex.quantization.default_dynamic_qconfig - [+] MODEL_NAME = ipex.quantization.prepare(MODEL_NAME, qconfig, example_inputs=INPUT_NAME, inplace=False) - [+] with torch.no_grad(): - [+] for i in range(10): - [+] INFERENCE_LINE - [+] MODEL_NAME = ipex.quantization.convert(MODEL_NAME) - [+] with torch.no_grad(): - [+] INFERENCE_LINE - [+] MODEL_NAME.eval() - order: - - below: - - pytorch_channels_last - above: - - pytorch_jit_script - - pytorch_jit_script_ofi - - pytorch_jit_trace - - pytorch_jit_trace_ofi diff --git a/neural_coder/backends/pytorch_ipex_int8_static_quant.yaml b/neural_coder/backends/pytorch_ipex_int8_static_quant.yaml deleted file mode 100644 index 9de931ee9fe..00000000000 --- a/neural_coder/backends/pytorch_ipex_int8_static_quant.yaml +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - content: - - |- - [+] if "quantize" not in str(type(MODEL_NAME)) and "jit" not in str(type(MODEL_NAME)): - [+] import torch - [+] import intel_extension_for_pytorch as ipex - [+] qconfig = ipex.quantization.default_static_qconfig - [+] MODEL_NAME = ipex.quantization.prepare(MODEL_NAME, qconfig, example_inputs=INPUT_NAME, inplace=False) - [+] with torch.no_grad(): - [+] for i in range(10): - [+] INFERENCE_LINE - [+] MODEL_NAME = ipex.quantization.convert(MODEL_NAME) - [+] with torch.no_grad(): - [+] INFERENCE_LINE - [+] MODEL_NAME.eval() - order: - - below: - - pytorch_channels_last - above: - - pytorch_jit_script - - pytorch_jit_script_ofi - - pytorch_jit_trace - - pytorch_jit_trace_ofi diff --git a/neural_coder/backends/pytorch_jit_script.yaml b/neural_coder/backends/pytorch_jit_script.yaml deleted file mode 100644 index 014cc5177f1..00000000000 --- a/neural_coder/backends/pytorch_jit_script.yaml +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - insert_below_model_definition_line - content: - - |- - [+] if "jit" not in str(type(MODEL_NAME)): - [+] import torch - [+] with torch.no_grad(): - [+] MODEL_NAME.eval() - [+] MODEL_NAME = torch.jit.script(MODEL_NAME) - [+] MODEL_NAME = torch.jit.freeze(MODEL_NAME) - order: - - below: - - pytorch_inc_static_quant_fx - - pytorch_inc_static_quant_ipex - - pytorch_inc_dynamic_quant - - pytorch_ipex_fp32 - - pytorch_ipex_bf16 - - pytorch_ipex_int8_static_quant - - pytorch_ipex_int8_dynamic_quant - - pytorch_channels_last - above: diff --git a/neural_coder/backends/pytorch_jit_script_ofi.yaml b/neural_coder/backends/pytorch_jit_script_ofi.yaml deleted file mode 100644 index 2e9c5868d86..00000000000 --- a/neural_coder/backends/pytorch_jit_script_ofi.yaml +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - insert_below_model_definition_line - content: - - |- - [+] if "jit" not in str(type(MODEL_NAME)): - [+] import torch - [+] with torch.no_grad(): - [+] MODEL_NAME.eval() - [+] MODEL_NAME = torch.jit.optimize_for_inference(torch.jit.script(MODEL_NAME)) - order: - - below: - - pytorch_inc_static_quant_fx - - pytorch_inc_static_quant_ipex - - pytorch_inc_dynamic_quant - - pytorch_ipex_fp32 - - pytorch_ipex_bf16 - - pytorch_ipex_int8_static_quant - - pytorch_ipex_int8_dynamic_quant - - pytorch_channels_last - above: diff --git a/neural_coder/backends/pytorch_jit_trace.yaml b/neural_coder/backends/pytorch_jit_trace.yaml deleted file mode 100644 index e52fb7f62ab..00000000000 --- a/neural_coder/backends/pytorch_jit_trace.yaml +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - content: - - |- - [+] if "jit" not in str(type(MODEL_NAME)): - [+] import torch - [+] with torch.no_grad(): - [+] MODEL_NAME.eval() - [+] MODEL_NAME = torch.jit.trace(MODEL_NAME, INPUT_NAME, strict=False, check_trace=False) - [+] MODEL_NAME = torch.jit.freeze(MODEL_NAME) - order: - - below: - - pytorch_inc_static_quant_fx - - pytorch_inc_static_quant_ipex - - pytorch_inc_dynamic_quant - - pytorch_ipex_fp32 - - pytorch_ipex_bf16 - - pytorch_ipex_int8_static_quant - - pytorch_ipex_int8_dynamic_quant - - pytorch_channels_last - above: diff --git a/neural_coder/backends/pytorch_jit_trace_ofi.yaml b/neural_coder/backends/pytorch_jit_trace_ofi.yaml deleted file mode 100644 index 3b52bdbd5b1..00000000000 --- a/neural_coder/backends/pytorch_jit_trace_ofi.yaml +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - ["insert_below_model_definition_line", "insert_below_input_definition_line"] - content: - - |- - [+] if "jit" not in str(type(MODEL_NAME)): - [+] import torch - [+] with torch.no_grad(): - [+] MODEL_NAME.eval() - [+] MODEL_NAME = torch.jit.optimize_for_inference(torch.jit.trace(MODEL_NAME, INPUT_NAME, strict=False, check_trace=False)) - order: - - below: - - pytorch_inc_static_quant_fx - - pytorch_inc_static_quant_ipex - - pytorch_inc_dynamic_quant - - pytorch_ipex_fp32 - - pytorch_ipex_bf16 - - pytorch_ipex_int8_static_quant - - pytorch_ipex_int8_dynamic_quant - - pytorch_channels_last - above: diff --git a/neural_coder/backends/pytorch_mixed_precision_cpu.yaml b/neural_coder/backends/pytorch_mixed_precision_cpu.yaml deleted file mode 100644 index ad4337f5e57..00000000000 --- a/neural_coder/backends/pytorch_mixed_precision_cpu.yaml +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - insert_above_inference_line - - indent_inference_line - content: - - |- - [+] import torch - [+] with torch.cpu.amp.autocast(enabled=True, dtype=torch.bfloat16): - - 1 - order: - - below: - above: - - below: - above: diff --git a/neural_coder/backends/pytorch_mixed_precision_cuda.yaml b/neural_coder/backends/pytorch_mixed_precision_cuda.yaml deleted file mode 100644 index 60c597cedd8..00000000000 --- a/neural_coder/backends/pytorch_mixed_precision_cuda.yaml +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - insert_above_inference_line - - indent_inference_line - content: - - |- - [+] import torch - [+] with torch.cuda.amp.autocast(enabled=True, dtype=torch.float16): - - 1 - order: - - below: - above: - - below: - above: diff --git a/neural_coder/backends/pytorch_mixed_precision_intel_gpu.yaml b/neural_coder/backends/pytorch_mixed_precision_intel_gpu.yaml deleted file mode 100644 index 3b5c86ae977..00000000000 --- a/neural_coder/backends/pytorch_mixed_precision_intel_gpu.yaml +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - insert_above_inference_line - - indent_inference_line - content: - - |- - [+] import torch - [+] with torch.xpu.amp.autocast(dtype=torch.half): - - 1 - order: - - below: - above: - - below: - above: diff --git a/neural_coder/backends/pytorch_torchdynamo_jit_script.yaml b/neural_coder/backends/pytorch_torchdynamo_jit_script.yaml deleted file mode 100644 index 48281956ca7..00000000000 --- a/neural_coder/backends/pytorch_torchdynamo_jit_script.yaml +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - insert_below_model_definition_line - - insert_above_inference_line - - indent_inference_line - content: - - |- - [+] from typing import List - [+] import torch - [+] import torchdynamo - [+] torchdynamo.config.raise_on_backend_error = False - [+] def dynamo_backend(gm: torch.fx.GraphModule, example_inputs: List[torch.Tensor]): - [+] return torch.jit.script(gm) - - |- - [+] import torchdynamo - [+] with torchdynamo.optimize(dynamo_backend): - - 1 - order: - - below: - above: - - below: - above: - - below: - above: diff --git a/neural_coder/backends/pytorch_torchdynamo_jit_script_ofi.yaml b/neural_coder/backends/pytorch_torchdynamo_jit_script_ofi.yaml deleted file mode 100644 index dcee3603d33..00000000000 --- a/neural_coder/backends/pytorch_torchdynamo_jit_script_ofi.yaml +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - insert_below_model_definition_line - - insert_above_inference_line - - indent_inference_line - content: - - |- - [+] from typing import List - [+] import torch - [+] import torchdynamo - [+] torchdynamo.config.raise_on_backend_error = False - [+] def dynamo_backend(gm: torch.fx.GraphModule, example_inputs: List[torch.Tensor]): - [+] return torch.jit.optimize_for_inference(torch.jit.script(gm)) - - |- - [+] import torchdynamo - [+] with torchdynamo.optimize(dynamo_backend): - - 1 - order: - - below: - above: - - below: - above: - - below: - above: diff --git a/neural_coder/backends/pytorch_torchdynamo_jit_trace.yaml b/neural_coder/backends/pytorch_torchdynamo_jit_trace.yaml deleted file mode 100644 index d3673153986..00000000000 --- a/neural_coder/backends/pytorch_torchdynamo_jit_trace.yaml +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - insert_below_model_definition_line - - insert_above_inference_line - - indent_inference_line - content: - - |- - [+] from typing import List - [+] import torch - [+] import torchdynamo - [+] torchdynamo.config.raise_on_backend_error = False - [+] def dynamo_backend(gm: torch.fx.GraphModule, example_inputs: List[torch.Tensor]): - [+] return torch.jit.trace(gm, example_inputs) - - |- - [+] import torchdynamo - [+] with torchdynamo.optimize(dynamo_backend): - - 1 - order: - - below: - above: - - below: - above: - - below: - above: diff --git a/neural_coder/backends/pytorch_torchdynamo_jit_trace_ofi.yaml b/neural_coder/backends/pytorch_torchdynamo_jit_trace_ofi.yaml deleted file mode 100644 index 9f9d1eafce5..00000000000 --- a/neural_coder/backends/pytorch_torchdynamo_jit_trace_ofi.yaml +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - insert_below_model_definition_line - - insert_above_inference_line - - indent_inference_line - content: - - |- - [+] from typing import List - [+] import torch - [+] import torchdynamo - [+] torchdynamo.config.raise_on_backend_error = False - [+] def dynamo_backend(gm: torch.fx.GraphModule, example_inputs: List[torch.Tensor]): - [+] return torch.jit.optimize_for_inference(torch.jit.trace(gm, example_inputs)) - - |- - [+] import torchdynamo - [+] with torchdynamo.optimize(dynamo_backend): - - 1 - order: - - below: - above: - - below: - above: - - below: - above: diff --git a/neural_coder/backends/template.yaml b/neural_coder/backends/template.yaml deleted file mode 100644 index 1e3b1fa1501..00000000000 --- a/neural_coder/backends/template.yaml +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -transformation: - location: - - - - - - - content: - - |- - [+] YOUR CODE LINE 1 - [+] YOUR CODE LINE 2 - [+] YOUR CODE LINE 3 - - |- - [+] YOUR CODE LINE 1 - [+] YOUR CODE LINE 2 - [+] YOUR CODE LINE 3 - - |- - [+] YOUR CODE LINE 1 - [+] YOUR CODE LINE 2 - [+] YOUR CODE LINE 3 - order: - - below: - - - - - above: - - - - - - below: - - - - - above: - - - - - - below: - - - - - above: - - - - diff --git a/neural_coder/coders/__init__.py b/neural_coder/coders/__init__.py deleted file mode 100644 index e833188cc78..00000000000 --- a/neural_coder/coders/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/neural_coder/coders/autoinc/__init__.py b/neural_coder/coders/autoinc/__init__.py deleted file mode 100644 index e833188cc78..00000000000 --- a/neural_coder/coders/autoinc/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/neural_coder/coders/autoinc/autoinc_harness.py b/neural_coder/coders/autoinc/autoinc_harness.py deleted file mode 100644 index e21b9bfdf8e..00000000000 --- a/neural_coder/coders/autoinc/autoinc_harness.py +++ /dev/null @@ -1,476 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import logging -import os -import re -import sys - -import yaml - -from ... import globals -from ...utils.line_operation import ( - get_line_indent_level, - get_line_left_hand_side, - get_line_wo_comment, - is_eval_func_model_name, - single_line_comment_or_empty_line_detection, -) - -logging.basicConfig( - level=globals.logging_level, format="%(asctime)s %(levelname)s %(message)s", datefmt="%a, %d %b %Y %H:%M:%S +0000" -) -logger = logging.getLogger(__name__) - - -class AutoInc_Harness(object): - def __init__(self, backend): - self.backend = backend - - def print_info(self): - for i in globals.list_model_def_instance: - logger.debug(f"i.print_info(): {i.print_info()}") - - # collect file transformation info and register in globals - # (i.e. which file to add which lines at which location) - def register_transformation(self): - backend_file = open(os.path.dirname(__file__) + "/../../backends/" + self.backend + ".yaml") - backend_dict = yaml.load(backend_file, Loader=yaml.BaseLoader) - logger.debug(f"backend_dict: {backend_dict}") - bk_trans_location = backend_dict["transformation"]["location"] # string - bk_trans_content = backend_dict["transformation"]["content"] # string - bk_trans_order = backend_dict["transformation"]["order"] # list - - # modular design - if globals.use_modular: - content = globals.modular_item - bk_trans_content = ["[+] " + content.replace("\n", "\n[+] ")[:-5]] - - list_code = [] - history = set() - for i in globals.list_code_path: - list_code.append(open(i, "r").read()) - for loc in bk_trans_location: - # PART 1 - "model_definition_line" - if "insert_below_model_definition_line" in loc: - for ins in globals.list_model_def_instance: - model_name = ins.model_name - if model_name in history and globals.code_domain == "torchvision": - continue - else: - history.add(model_name) - file_path = ins.file_path - model_def_line_idx = ins.model_def_line_idx - - file_path_idx = globals.list_code_path.index(file_path) - lines = list_code[file_path_idx].split("\n") - line_idx = 0 - - # to check if this model has an inference line is in the file - # if not, skip this model - to_transform = False - for i in range(len(lines)): - line = lines[i] - if model_name + "(" in line or ( - model_name + "." in line and line.find(model_name) < line.find(".") and "(" in line - ): - to_transform = True - if not to_transform and globals.code_domain == "onnx": - pass - elif not to_transform: - continue - ### information - - # search DataLoader definition in this file - dataloader_name = "" - for i in range(len(lines)): - line = lines[i] - if not single_line_comment_or_empty_line_detection(line): - if ("DataLoader(" in line and "=" in line and line.find("=") < line.find("DataLoader")) or ( - "dataloader" in line and "=" in line and line.find("=") > line.find("dataloader") - ): - dataloader_def_line_indent_level = get_line_indent_level(line) - dataloader_name = get_line_left_hand_side(line) - dataloader_def_line_idx = i - - # search inference line in this file, and also input_name - inference_line = "" - input_name = "" - for i in range(len(lines)): - line = lines[i] - is_eval_func, eval_func_type = is_eval_func_model_name(model_name, line) - if not single_line_comment_or_empty_line_detection(line): - if is_eval_func and "[coder-enabled]" not in line: - inference_line = line - input_name = line[line.find("(") + 1 : line.find(")")].replace("*", "") - # get "c" in "a = b(**c)" - - # search input definition in this file (if any) - if input_name != "": - for i in range(len(lines)): - line = lines[i] - if not single_line_comment_or_empty_line_detection(line): - if input_name in line and "=" in line and line.find("=") > line.find(input_name): - input_def_line_indent_level = get_line_indent_level(line) - input_def_line_idx = i - - # search model definition line and its end line index - # (only has 1 model definition line, because it's in loop of globals.list_model_def_instance) - for i in range(len(lines)): - line = lines[i] - if line_idx == model_def_line_idx and "[coder-enabled]" not in line: - model_def_line_indent_level = get_line_indent_level(line) - if ")" in line and line.count(")") == line.count("("): # e.g. model = Net(xxx) - model_definition_end_line_idx = line_idx + 1 - else: # e.g. model = Net(xxx, \n xxx, \n xxx) - do_search = True - i_search = 1 - while do_search: - following_line = lines[line_idx + i_search] - if ")" in following_line and following_line.count(")") > following_line.count("("): - do_search = False - i_search += 1 - model_definition_end_line_idx = line_idx + i_search - line_idx += 1 - - ### check - - bk_trans_content_this = bk_trans_content[bk_trans_location.index(loc)] - if file_path_idx == 0 and (globals.code_domain in ["transformers_trainer", "torchvision", "onnx"]): - pass - elif ( - ("INPUT_NAME" in bk_trans_content_this and input_name == "") - or ("DATALOADER_NAME" in bk_trans_content_this and dataloader_name == "") - or ("INFERENCE_LINE" in bk_trans_content_this and inference_line == "") - ): - logger.info( - f"Skipped due to not having enough information required by " - "the transformation content specified in the config file " - "(e.g. INPUT_NAME, DATALOADER_NAME, INFERENCE_LINE). " - f"File path: {file_path}" - ) - continue - - ### location - - # search for features to put below them - """ - Example (psuedo-code): - model = Net() - # jit script begin mark - model = torch.jit.script(model) - # jit script end mark (feature name + model name to handle multi-model situation) - model = ipex.optimize(model, "fp32") # "ipex fp32" must be put below "jit script" - """ - put_below_idx = 0 - for i in range(len(lines)): - for item in bk_trans_order[0]["below"]: - line = lines[i] - if item in line and model_name in line: - put_below_idx = max(put_below_idx, i + 1) - - # search for features to put above them - put_above_idx = sys.maxsize - for i in range(len(lines)): - for item in bk_trans_order[0]["above"]: - line = lines[i] - if item in line and model_name in line: - put_above_idx = min(put_above_idx, i) - - # location assignment (below model def / dataloader def / input def) - torchvision_indent = -1 - if file_path_idx == 0 and globals.code_domain == "transformers_trainer": - for i in range(len(lines)): - line = lines[i] - if re.findall("trainer = .*Trainer", line): - if "(" in line and line.count(")") == line.count("("): - trans_insert_location = i + 1 - else: - do_search = True - i_search = 1 - while do_search: - following_line = lines[i + i_search] - if ")" in following_line and following_line.count(")") > following_line.count( - "(" - ): - do_search = False - i_search += 1 - trans_insert_location = i + i_search - trans_insert_location = min(max(trans_insert_location, put_below_idx), put_above_idx) - elif file_path_idx == 0 and globals.code_domain == "torchvision": - trans_insert_location = 1 - for i in range(len(lines)): - line = lines[i] - if ( - "val_loader" in line - and "aux_val_loader" not in line - and ( - "torch.utils.data.DataLoader" in line - or "utils.data.DataLoader" in line - or "DataLoader" in line - ) - ): - torchvision_indent = get_line_indent_level(line) - if "(" in line and line.count(")") == line.count("("): - trans_insert_location = i + 1 - else: - do_search = True - i_search = 1 - while do_search: - following_line = lines[i + i_search] - if ")" in following_line and following_line.count(")") > following_line.count( - "(" - ): - do_search = False - i_search += 1 - trans_insert_location = i + i_search - trans_insert_location = min(max(trans_insert_location, put_below_idx), put_above_idx) - else: - if "insert_below_model_definition_line" in loc: - trans_insert_location = min( - max(model_definition_end_line_idx, put_below_idx), put_above_idx - ) - if "insert_below_dataloader_definition_line" in loc: - try: - dataloader_def_line_idx - except: - logger.warning( - f"Skipped due to not having dataloader definition required by " - "the transformation content specified in the config file. " - f"File path: {file_path}" - ) - continue - trans_insert_location = max( - trans_insert_location, - min(max(dataloader_def_line_idx + 1, put_below_idx), put_above_idx), - ) - if "insert_below_input_definition_line" in loc: - try: - input_def_line_idx - except: - logger.warning( - f"Skipped due to not having input definition required by " - "the transformation content specified in the config file. " - f"File path: {file_path}" - ) - continue - trans_insert_location = max( - trans_insert_location, min(max(input_def_line_idx + 1, put_below_idx), put_above_idx) - ) - - insert_indent_level = ( - get_line_indent_level(lines[trans_insert_location - 1]) - if torchvision_indent == -1 - else torchvision_indent - ) - ### content - # lines to insert - lines_to_insert = bk_trans_content_this - if globals.code_domain == "transformers_trainer": - lines_to_insert = lines_to_insert.replace( - "EVAL_FUNC_LINES", globals.list_eval_func_lines[0] - ).replace("DATALOADER_NAME", globals.list_calib_dataloader_name[0]) - elif globals.code_domain == "transformers_no_trainer": - pass - elif globals.code_domain == "torchvision": - lines_to_insert = lines_to_insert.replace( - "EVAL_FUNC_LINES", globals.list_eval_func_lines[0] - ).replace("DATALOADER_NAME", globals.list_calib_dataloader_name[0]) - elif globals.code_domain == "onnx": - lines_to_insert = lines_to_insert.replace( - "EVAL_FUNCTION_NAME", globals.list_eval_func_name[0] - ).replace("DATALOADER_NAME", globals.list_calib_dataloader_name[0]) - else: - lines_to_insert = lines_to_insert.replace("DATALOADER_NAME", dataloader_name).replace( - "def eval_func", "# def eval_func" - ) - - optimum_quant_config_line = ( - 'IncQuantizationConfig.from_pretrained("' + globals.optimum_quant_config + '")' - ) - - # replace [+] indication with empty - lines_to_insert = lines_to_insert.replace("[+] ", " " * insert_indent_level) - # add begin indicator - lines_to_insert = ( - " " * insert_indent_level - + "# [NeuralCoder] " - + self.backend - + " for " - + model_name - + " [Beginning Line]\n" - + lines_to_insert - ) - # replace INDICATIONS with real stuff - lines_to_insert = ( - lines_to_insert.replace("MODEL_NAME", model_name) - .replace("INPUT_NAME", input_name) - .replace("EVAL_FUNC_LINES", "# return 1") - .replace("OPTIMUM_QUANT_CONFIG", optimum_quant_config_line) - .replace("\n", " # [coder-enabled]\n") - ) - # add end indicator - lines_to_insert += ( - " # [coder-enabled]\n" - + " " * insert_indent_level - + "# [NeuralCoder] " - + self.backend - + " for " - + model_name - + " [Ending Line] # [coder-enabled]" - ) - - ### register - - if file_path not in globals.list_trans_insert_modified_file: - globals.list_trans_insert_modified_file.append(file_path) - globals.list_trans_insert_location_idxs.append([trans_insert_location]) - globals.list_trans_insert_number_insert_lines.append([lines_to_insert.count("\n") + 1]) - globals.list_trans_insert_lines_to_insert.append([lines_to_insert]) - else: - idx = globals.list_trans_insert_modified_file.index(file_path) - globals.list_trans_insert_location_idxs[idx].append(trans_insert_location) - globals.list_trans_insert_number_insert_lines[idx].append(lines_to_insert.count("\n") + 1) - globals.list_trans_insert_lines_to_insert[idx].append(lines_to_insert) - - # PART 2 - "inference line" - if ( - "indent_inference_line" in loc - or "insert_above_inference_line" in loc - or "insert_below_inference_line" in loc - ): - for file_path in globals.list_code_path: - code = open(file_path, "r").read() - lines = code.split("\n") - line_idx = 0 - for i in range(len(lines)): - line = lines[i] - for model_name in globals.list_model_name: - is_eval_func, eval_func_type = is_eval_func_model_name(model_name, line) - if is_eval_func and "[coder-enabled]" not in line: - if eval_func_type == "non-forward": - pass # do something - - inference_line_indent_level = get_line_indent_level(line) - - if "indent_inference_line" in loc: - bk_trans_content_this = bk_trans_content[bk_trans_location.index(loc)] - add_indent_level = int(bk_trans_content_this) - - trans_indent_location = [] - # indent can have multiple location, so is a list of numbers - trans_indent_level = [] - - if ")" in line: # e.g. model = Net(xxx) - trans_indent_location.append(line_idx) - trans_indent_level.append(add_indent_level) - else: # e.g. model = Net(xxx, \n xxx, \n xxx) - trans_indent_location.append(line_idx) - trans_indent_level.append(add_indent_level) - do_search = True - i_search = 1 - while do_search: - trans_indent_location.append(line_idx + i_search) - trans_indent_level.append(add_indent_level) - following_line = lines[line_idx + i_search] - if ")" in following_line: - do_search = False - i_search += 1 - - ### register - - if file_path not in globals.list_trans_indent_modified_file: - globals.list_trans_indent_modified_file.append(file_path) - globals.list_trans_indent_location_idxs.append(trans_indent_location) - globals.list_trans_indent_level.append(trans_indent_level) - else: - idx = globals.list_trans_indent_modified_file.index(file_path) - for i in trans_indent_location: - globals.list_trans_indent_location_idxs[idx].append(i) - for i in trans_indent_level: - globals.list_trans_indent_level[idx].append(i) - - if "insert_above_inference_line" in loc: - idx_offset = 0 - elif "insert_below_inference_line" in loc: - idx_offset = 1 - - if "insert_above_inference_line" in loc or "insert_below_inference_line" in loc: - bk_trans_content_this = bk_trans_content[bk_trans_location.index(loc)] - - trans_insert_location = line_idx + idx_offset - - insert_indent_level = inference_line_indent_level - - ### content - - # lines to insert - lines_to_insert = bk_trans_content_this - # replace [+] indication with empty - lines_to_insert = lines_to_insert.replace("[+] ", " " * insert_indent_level) - # add begin indicator - lines_to_insert = ( - " " * insert_indent_level - + "# [NeuralCoder] " - + self.backend - + " [Beginning Line] \n" - + lines_to_insert - ) - # replace INDICATIONS with real stuff - # (for now, inference_line related transformations ) - # (have nothing to do with input, dataloader etc, ) - # (so no need to put replaces here.) - lines_to_insert = lines_to_insert.replace("\n", " # [coder-enabled]\n") - # add end indicator - lines_to_insert += ( - " # [coder-enabled]\n" - + " " * insert_indent_level - + "# [NeuralCoder] " - + self.backend - + " [Ending Line] # [coder-enabled]" - ) - - # customized argument - if self.backend == "pytorch_benchmark": - lines_to_insert = lines_to_insert.replace( - "NUM_BENCHMARK_ITERATION", globals.num_benchmark_iteration - ) - lines_to_insert = lines_to_insert.replace("ACCURACY_MODE", str(False)) - lines_to_insert = lines_to_insert.replace("EVAL_FUNC_LINES", line.strip()) - - ### register - - if file_path not in globals.list_trans_insert_modified_file: - globals.list_trans_insert_modified_file.append(file_path) - globals.list_trans_insert_location_idxs.append([trans_insert_location]) - globals.list_trans_insert_number_insert_lines.append( - [lines_to_insert.count("\n") + 1] - ) - globals.list_trans_insert_lines_to_insert.append([lines_to_insert]) - else: - idx = globals.list_trans_insert_modified_file.index(file_path) - globals.list_trans_insert_location_idxs[idx].append(trans_insert_location) - globals.list_trans_insert_number_insert_lines[idx].append( - lines_to_insert.count("\n") + 1 - ) - globals.list_trans_insert_lines_to_insert[idx].append(lines_to_insert) - - line_idx += 1 - - # PART 3 - for customized location - - logger.debug(f"globals.list_trans_insert_modified_file: {globals.list_trans_insert_modified_file}") - logger.debug(f"globals.list_trans_insert_location_idxs: {globals.list_trans_insert_location_idxs}") - logger.debug(f"globals.list_trans_insert_number_insert_lines: {globals.list_trans_insert_number_insert_lines}") - logger.debug(f"globals.list_trans_insert_lines_to_insert: {globals.list_trans_insert_lines_to_insert}") diff --git a/neural_coder/coders/autoinc/calib_dataloader.py b/neural_coder/coders/autoinc/calib_dataloader.py deleted file mode 100644 index 8d287837676..00000000000 --- a/neural_coder/coders/autoinc/calib_dataloader.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import logging - -from ... import globals - - -class Calib_Dataloader(object): - def __init__(self): - pass - - def register_transformation(self): - if globals.code_domain == "transformers_trainer": - globals.list_calib_dataloader_name.append("trainer.get_eval_dataloader()") - elif globals.code_domain == "transformers_no_trainer": - pass - elif globals.code_domain == "torchvision": - globals.list_calib_dataloader_name.append("val_loader") - elif globals.code_domain == "onnx": - codes = open(globals.list_code_path[0], "r").read().split("\n") - for line in codes: - line = line.strip() - if "loader" in line and "=" in line: - end = 0 - for i in range(len(line)): - if line[i] == "=": - end = i - if line[end - 1] == " ": - globals.list_calib_dataloader_name.append(line[: end - 1]) - else: - globals.list_calib_dataloader_name.append(line[:end]) - else: # random model - pass diff --git a/neural_coder/coders/autoinc/domain.py b/neural_coder/coders/autoinc/domain.py deleted file mode 100644 index ed4437d7455..00000000000 --- a/neural_coder/coders/autoinc/domain.py +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import re - - -def determine_domain(path) -> str: - codes = open(path, "r").read() - if ("import torchvision.models" in codes or "from torchvision.models" in codes) and "val_loader" in codes: - return "torchvision" - elif re.search(r"from (.*)transformers import", codes) and re.search(r"(.*)Model(.*)", codes): - if "Trainer" in codes or "trainer" in codes: - return "transformers_trainer" - else: - return "transformers_no_trainer" - elif "onnx.load(" in codes: - return "onnx" - elif "keras.Sequential" in codes: - return "keras_script" - elif "from tensorflow import" in codes or "import tensorflow" in codes: - return "tensorflow_keras_model" - else: - return "random model" diff --git a/neural_coder/coders/autoinc/eval_func.py b/neural_coder/coders/autoinc/eval_func.py deleted file mode 100644 index 9ea65d36315..00000000000 --- a/neural_coder/coders/autoinc/eval_func.py +++ /dev/null @@ -1,111 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from ... import globals -from ...utils.line_operation import get_line_indent_level - - -class Eval_Func(object): - def __init__(self): - pass - - def register_transformation(self): - if globals.code_domain == "transformers_trainer": - lines = [ - "trainer.model = model", - "metrics = trainer.evaluate() # check if all tasks do not have parameters in evaluate()", - "keys = [", - ' "eval_accuracy",', - ' "eval_bleu",', - ' "eval_matthews_correlation",', - ' "eval_pearsonr",', - ' "eval_precision",', - ' "eval_recall",', - ' "eval_rouge",', - ' "eval_sacrebleu",', - ' "eval_spearmanr",', - ' "eval_mcc",', - ' "eval_acc",', - ' "eval_acc_and_f1",', - ' "eval_corr",', - ' "eval_mnli/acc",', - ' "eval_mnli-mm/acc",', - ' "eval_exact_match",', - ' "eval_f1",', - "] # METRIC_TAGS in transformers", - "for key in keys:", - " if key in metrics.keys():", - " return metrics[key]", - 'assert False, "No metric returned, Please check inference metric!"', - ] - for index, line in enumerate(lines): - if index != 0: - lines[index] = "[+] " + " " * 4 + line - lines = "\n".join(lines) - globals.list_eval_func_lines.append(lines) - elif globals.code_domain == "transformers_no_trainer": - pass - elif globals.code_domain == "torchvision": - # search for 'validate()' - codes = open(globals.list_code_path[0], "r").read().split("\n") - lines = [] - for index, line in enumerate(codes): - if "def validate(" in line: - start = index - start_indent = get_line_indent_level(codes[start]) - for i in range(start + 1, len(codes)): - if codes[i] == "": - continue - line_indent = get_line_indent_level(codes[i]) - if line_indent > start_indent: - change_indent = line_indent - 4 - lines.append(" " * change_indent + codes[i].lstrip()) - # no 'print' - else: - break - break - else: - pass - for index, line in enumerate(lines): - if "return" in line: - indent = get_line_indent_level(line) - line_list = line.split() - line_list[1] = "float(" + line_list[1] + ")" - lines[index] = " " * indent + " ".join(line_list) - for index, line in enumerate(lines): - if index != 0: - lines[index] = "[+] " + " " * 8 + line - lines = "\n".join(lines) - globals.list_eval_func_lines.append(lines) - elif globals.code_domain == "onnx": - # look for sess = onnxruntime.InferenceSession(MODEL_NAME.SerializeToString(), None) - codes = open(globals.list_code_path[0], "r").read().split("\n") - start = 0 - for idx, line in enumerate(codes): - if "onnxruntime.InferenceSession(" in line: - start = idx - break - line_indent = get_line_indent_level(codes[start]) - target = None - for i in range(start, -1, -1): - if "def" in codes[i] and (line_indent - get_line_indent_level(codes[i])) == 4: - target = codes[i].split(" ")[1] - break - func_name = None - for i in range(len(target)): - if target[i] == "(": - globals.list_eval_func_name.append(target[:i]) - break - else: # random model - pass diff --git a/neural_coder/coders/pytorch/__init__.py b/neural_coder/coders/pytorch/__init__.py deleted file mode 100644 index e833188cc78..00000000000 --- a/neural_coder/coders/pytorch/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/neural_coder/coders/pytorch/batch_size.py b/neural_coder/coders/pytorch/batch_size.py deleted file mode 100644 index ec61e19d70f..00000000000 --- a/neural_coder/coders/pytorch/batch_size.py +++ /dev/null @@ -1,83 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from ... import globals - - -class BatchSizeCoder(object): - def __init__(self, file) -> None: - self.file = file - self.result = [] - - def transform(self): - lines = self.file.split("\n") - for line in lines: - if self.not_modify(line): - new_line = self.modify(line) - self.result.append(new_line) - else: - self.result.append(line) - for index, line in enumerate(self.result): - if index != len(self.result) - 1: - self.result[index] += "\n" - return "".join(self.result) - - def not_modify(self, s): - if "batch_size" in s and "=" in s: - return True - return False - - def modify(self, s): - idx = s.find("batch_size") - s_right = s[idx:] - if " = " in s_right: - index = s.find(" = ") - s_left = s[:index] - if "batch_size" in s_left: - if "," in s_left: - index1 = s_left.find(",") - index2 = s_left.find("batch_size") - if index1 > index2: - slice1 = s_left[:index1] - else: - s_left1 = s_left[:index2] - s_right = s_left[index2:] - index3 = s_left1.rfind(",") - if "," in s_right: - index4 = s_right.find(",") + len(s_left1) - slice1 = s_left[index3 + 2 : index4] - else: - slice1 = s_left[index3 + 2 : index] - s1 = slice1 + " = " + globals.target_batch_size - s = s[:] + "\n" + s1 - else: - s_right = s[index + 3 :] - s_right = s_right.replace(s_right, globals.target_batch_size) - s = s_left + " = " + s_right - elif "batch_size=" in s: - idx = s.find("batch_size=") - s_right = s[idx:] - idx2 = s_right.find("batch_size") - if "," in s_right: - index2 = s_right.find(",") - old = s_right[idx2:index2] - s = s.replace(old, "batch_size=" + globals.target_batch_size) - elif ")" in s_right: - index2 = s_right.find(")") - old = s_right[idx2:index2] - s = s.replace(old, "batch_size=" + globals.target_batch_size) - else: - old = s_right[idx2:] - s = s.replace(old, "batch_size=" + globals.target_batch_size) - return s diff --git a/neural_coder/coders/pytorch/change_trainer_to_nlptrainer.py b/neural_coder/coders/pytorch/change_trainer_to_nlptrainer.py deleted file mode 100644 index 7c0d71ce534..00000000000 --- a/neural_coder/coders/pytorch/change_trainer_to_nlptrainer.py +++ /dev/null @@ -1,47 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -from ...utils.line_operation import get_line_indent_level - - -class TrainerToNLPTrainer(object): - def __init__(self, file) -> None: - self.file = file - self.result = [] - - def transform(self): - lines = self.file.split("\n") - - for line in lines: - if self.is_modify(line): - new_line = self.modify(line) - self.result.append(new_line) - else: - self.result.append(line) - for index, line in enumerate(self.result): - if index != len(self.result) - 1: - self.result[index] += "\n" - return "".join(self.result) - - def is_modify(self, s): - if "trainer = Trainer(" in s: - return True - else: - return False - - def modify(self, s): - old = "Trainer" - s = s.replace(old, "NLPTrainer") - return s diff --git a/neural_coder/coders/pytorch/cuda_to_cpu.py b/neural_coder/coders/pytorch/cuda_to_cpu.py deleted file mode 100644 index 2d6c9c8a13e..00000000000 --- a/neural_coder/coders/pytorch/cuda_to_cpu.py +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -from ...utils.line_operation import get_line_indent_level - - -class CudaToCpu(object): - def __init__(self, file) -> None: - self.file = file - self.result = [] - - def transform(self): - lines = self.file.split("\n") - # determine if jump the whole file (in cases where: args.device, args.cuda etc) - to_jump = False - for line in lines: - if self.is_jump_file(line): - to_jump = True - break - - if to_jump: # this file do not need transformation - for line in lines: - self.result.append(line) - else: # this file might need transformation - for line in lines: - if self.is_delete(line): - indent_level = get_line_indent_level(line) - new_line = " " * indent_level + "pass" - self.result.append(new_line) - elif self.is_modify(line): - new_line = self.change_to_cpu(line) - self.result.append(new_line) - else: - self.result.append(line) - for index, line in enumerate(self.result): - if index != len(self.result) - 1: - self.result[index] += "\n" - return "".join(self.result) - - def is_jump_file(self, s): - if ( - "args.device" in s - or "args.cpu" in s - or "args.gpu" in s - or "args.cuda" in s - or "torch.cuda.is_available()" in s - ): - return True - else: - return False - - def is_delete(self, s): - if "cuda." in s and "=" not in s and "if" not in s: - return True - else: - return False - - def is_modify(self, s): - if "'cuda'" in s or '"cuda"' in s or "'cuda:0'" in s or '"cuda:0"' in s or "cuda()" in s: - return True - else: - return False - - def change_to_cpu(self, s): - if "'cuda'" in s or "'cuda:0'" in s: - old = "'cuda'" if "'cuda'" in s else "'cuda:0'" - s = s.replace(old, "'cpu'") - elif '"cuda"' in s or '"cuda:0"' in s: - old = '"cuda"' if '"cuda"' in s else '"cuda:0"' - s = s.replace(old, '"cpu"') - elif "cuda()" in s: - old = "cuda" - s = s.replace(old, "cpu") - return s diff --git a/neural_coder/coders/pytorch/dummy_dataloader.py b/neural_coder/coders/pytorch/dummy_dataloader.py deleted file mode 100644 index 64e745cdacf..00000000000 --- a/neural_coder/coders/pytorch/dummy_dataloader.py +++ /dev/null @@ -1,124 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import logging - -from ... import globals -from ...utils.line_operation import get_line_indent_level, get_line_left_hand_side, is_eval_func_model_name - -logging.basicConfig( - level=globals.logging_level, format="%(asctime)s %(levelname)s %(message)s", datefmt="%a, %d %b %Y %H:%M:%S +0000" -) -logger = logging.getLogger(__name__) - - -class DummyDataLoader(object): - def __init__(self, list_model_def_instance): - self.list_model_def_instance = list_model_def_instance - - def print_info(self): - for i in self.list_model_def_instance: - logger.debug(f"i.print_info(): {i.print_info()}") - - # collect file transformation info and register (store) in globals - # (i.e. which file to add which lines at which location) - def register_transformation(self): - list_code = [] - for i in globals.list_code_path: - list_code.append(open(i, "r").read()) - - for ins in self.list_model_def_instance: - model_name = ins.model_name - file_path = ins.file_path - model_def_line_idx = ins.model_def_line_idx - function_def_line_idx = ins.function_def_line_idx - class_name = ins.class_name - - # transformation - file_path_idx = globals.list_code_path.index(file_path) - lines = list_code[file_path_idx].split("\n") - line_idx = 0 - - # search DataLoader - dataloader_name = "" - for i in range(len(lines)): # each item is a str of this code line - line = lines[i] - if "DataLoader(" in line and "=" in line and line.find("=") < line.find("DataLoader"): - dataloader_name = get_line_left_hand_side(line) - dataloader_def_line_idx = i - - if dataloader_name != "": - return - else: - input_dimension_str = "3, 224, 224)" - for i in range(len(lines)): - line = lines[i] - if ("input" in line and "=" in line and line.find("=") > line.find("input")) or ( - "image" in line and "=" in line and line.find("=") > line.find("image") - ): - input_dimension_str = line[line.find(",") + 2 :] - - for i in range(len(lines)): - line = lines[i] - if line_idx == model_def_line_idx: - indent_level = get_line_indent_level(line) - lines_to_insert = "" - lines_to_insert += " " * indent_level + "import torch" + "\n" - lines_to_insert += " " * indent_level + "from torch.utils.data import Dataset" + "\n" - lines_to_insert += " " * indent_level + "class DummyDataset(Dataset):" + "\n" - lines_to_insert += ( - " " * indent_level + " def __init__(self, *shapes, num_samples: int = 10000):" + "\n" - ) - lines_to_insert += " " * indent_level + " super().__init__()" + "\n" - lines_to_insert += " " * indent_level + " self.shapes = shapes" + "\n" - lines_to_insert += " " * indent_level + " self.num_samples = num_samples" + "\n" - lines_to_insert += " " * indent_level + " def __len__(self):" + "\n" - lines_to_insert += " " * indent_level + " return self.num_samples" + "\n" - lines_to_insert += " " * indent_level + " def __getitem__(self, idx: int):" + "\n" - lines_to_insert += " " * indent_level + " sample = []" + "\n" - lines_to_insert += " " * indent_level + " for shape in self.shapes:" + "\n" - lines_to_insert += " " * indent_level + " spl = torch.rand(*shape)" + "\n" - lines_to_insert += " " * indent_level + " sample.append(spl)" + "\n" - lines_to_insert += " " * indent_level + " return sample" + "\n" - lines_to_insert += " " * indent_level + "from torch.utils.data import DataLoader" + "\n" - lines_to_insert += ( - " " * indent_level - + "dummy_dataset = DummyDataset((" - + input_dimension_str - + ", (1, ))" - + "\n" - ) - lines_to_insert += ( - " " * indent_level + "dummy_dataloader = DataLoader(dummy_dataset, batch_size=1)" - ) - - trans_insert_location = 0 - - if file_path not in globals.list_trans_insert_modified_file: - globals.list_trans_insert_modified_file.append(file_path) - globals.list_trans_insert_location_idxs.append([trans_insert_location]) - globals.list_trans_insert_number_insert_lines.append([lines_to_insert.count("\n") + 1]) - globals.list_trans_insert_lines_to_insert.append([lines_to_insert]) - else: - idx = globals.list_trans_insert_modified_file.index(file_path) - globals.list_trans_insert_location_idxs[idx].append(trans_insert_location) - globals.list_trans_insert_number_insert_lines[idx].append(lines_to_insert.count("\n") + 1) - globals.list_trans_insert_lines_to_insert[idx].append(lines_to_insert) - - line_idx += 1 - - logger.debug(f"globals.list_trans_insert_modified_file: {globals.list_trans_insert_modified_file}") - logger.debug(f"globals.list_trans_insert_location_idxs: {globals.list_trans_insert_location_idxs}") - logger.debug(f"globals.list_trans_insert_number_insert_lines: {globals.list_trans_insert_number_insert_lines}") - logger.debug(f"globals.list_trans_insert_lines_to_insert: {globals.list_trans_insert_lines_to_insert}") diff --git a/neural_coder/coders/pytorch/harness.py b/neural_coder/coders/pytorch/harness.py deleted file mode 100644 index 3921383791e..00000000000 --- a/neural_coder/coders/pytorch/harness.py +++ /dev/null @@ -1,421 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import logging -import os -import sys - -import yaml - -from ... import globals -from ...utils.line_operation import ( - get_line_indent_level, - get_line_left_hand_side, - get_line_wo_comment, - is_eval_func_model_name, - single_line_comment_or_empty_line_detection, -) - -logging.basicConfig( - level=globals.logging_level, format="%(asctime)s %(levelname)s %(message)s", datefmt="%a, %d %b %Y %H:%M:%S +0000" -) -logger = logging.getLogger(__name__) - - -class Harness(object): - def __init__(self, backend): - self.backend = backend - - def print_info(self): - for i in globals.list_model_def_instance: - logger.debug(f"i.print_info(): {i.print_info()}") - - # collect file transformation info and register in globals - # (i.e. which file to add which lines at which location) - def register_transformation(self): - backend_file = open(os.path.dirname(__file__) + "/../../backends/" + self.backend + ".yaml") - backend_dict = yaml.load(backend_file, Loader=yaml.BaseLoader) - logger.debug(f"backend_dict: {backend_dict}") - - bk_trans_location = backend_dict["transformation"]["location"] # string - bk_trans_content = backend_dict["transformation"]["content"] # string - bk_trans_order = backend_dict["transformation"]["order"] # list - - list_code = [] - for i in globals.list_code_path: - list_code.append(open(i, "r").read()) - - for loc in bk_trans_location: - # PART 1 - "model_definition_line" - if "insert_below_model_definition_line" in loc: - for ins in globals.list_model_def_instance: - model_name = ins.model_name - file_path = ins.file_path - model_def_line_idx = ins.model_def_line_idx - - file_path_idx = globals.list_code_path.index(file_path) - lines = list_code[file_path_idx].split("\n") - line_idx = 0 - - # to check if this model has an inference line is in the file - # if not, skip this model - to_transform = False - for i in range(len(lines)): - line = lines[i] - if model_name + "(" in line or ( - model_name + "." in line and line.find(model_name) < line.find(".") and "(" in line - ): - to_transform = True - if not to_transform: - continue - - ### information - - # search DataLoader definition in this file - dataloader_name = "" - for i in range(len(lines)): - line = lines[i] - if not single_line_comment_or_empty_line_detection(line): - if ("DataLoader(" in line and "=" in line and line.find("=") < line.find("DataLoader")) or ( - "dataloader" in line and "=" in line and line.find("=") > line.find("dataloader") - ): - dataloader_def_line_indent_level = get_line_indent_level(line) - dataloader_name = get_line_left_hand_side(line) - dataloader_def_line_idx = i - - # search inference line in this file, and also input_name - inference_line = "" - input_name = "" - for i in range(len(lines)): - line = lines[i] - is_eval_func, eval_func_type = is_eval_func_model_name(model_name, line) - if not single_line_comment_or_empty_line_detection(line): - if is_eval_func and "[coder-enabled]" not in line: - inference_line = line - input_name = line[line.find("(") + 1 : line.find(")")].replace("*", "") - # get "c" in "a = b(**c)" - - # search input definition in this file (if any) - if input_name != "": - for i in range(len(lines)): - line = lines[i] - if not single_line_comment_or_empty_line_detection(line): - if input_name in line and "=" in line and line.find("=") > line.find(input_name): - input_def_line_indent_level = get_line_indent_level(line) - input_def_line_idx = i - - # search trainer definition in this file (for transformers trainer only) - trainer_def_line_idx = -1 - for i in range(len(lines)): - line = lines[i] - if not single_line_comment_or_empty_line_detection(line): - if "trainer = Trainer(" in line: - trainer_def_line_indent_level = get_line_indent_level(line) - trainer_def_line_idx = i - - # search model definition line and its end line index - # (only has 1 model definition line, because it's in loop of globals.list_model_def_instance) - for i in range(len(lines)): - line = lines[i] - if line_idx == model_def_line_idx and "[coder-enabled]" not in line: - model_def_line_indent_level = get_line_indent_level(line) - if ")" in line and line.count(")") == line.count("("): # e.g. model = Net(xxx) - model_definition_end_line_idx = line_idx + 1 - else: # e.g. model = Net(xxx, \n xxx, \n xxx) - do_search = True - i_search = 1 - while do_search: - following_line = lines[line_idx + i_search] - if ")" in following_line and following_line.count(")") > following_line.count("("): - do_search = False - i_search += 1 - model_definition_end_line_idx = line_idx + i_search - line_idx += 1 - - ### check - - bk_trans_content_this = bk_trans_content[bk_trans_location.index(loc)] - - if ( - ("INPUT_NAME" in bk_trans_content_this and input_name == "") - or ("DATALOADER_NAME" in bk_trans_content_this and dataloader_name == "") - or ("INFERENCE_LINE" in bk_trans_content_this and inference_line == "") - ): - logger.info( - f"Skipped due to not having enough information required by " - "the transformation content specified in the config file " - "(e.g. INPUT_NAME, DATALOADER_NAME, INFERENCE_LINE). " - f"File path: {file_path}" - ) - continue - - ### location - - # search for features to put below them - """ - Example (psuedo-code): - model = Net() - # jit script begin mark - model = torch.jit.script(model) - # jit script end mark (feature name + model name to handle multi-model situation) - model = ipex.optimize(model, "fp32") # "ipex fp32" must be put below "jit script" - """ - put_below_idx = 0 - for i in range(len(lines)): - for item in bk_trans_order[0]["below"]: - line = lines[i] - if item in line and model_name in line: - put_below_idx = max(put_below_idx, i + 1) - - # search for features to put above them - put_above_idx = sys.maxsize - for i in range(len(lines)): - for item in bk_trans_order[0]["above"]: - line = lines[i] - if item in line and model_name in line: - put_above_idx = min(put_above_idx, i) - - # location assignment (below model def / dataloader def / input def) - if "insert_below_model_definition_line" in loc: - trans_insert_location = min(max(model_definition_end_line_idx, put_below_idx), put_above_idx) - if trainer_def_line_idx > 0: - trans_insert_location = trainer_def_line_idx - 1 - # for transformers trainer to put right above trainer def - if "insert_below_dataloader_definition_line" in loc: - try: - dataloader_def_line_idx - except: - logger.warning( - f"Skipped due to not having dataloader definition required by " - "the transformation content specified in the config file. " - f"File path: {file_path}" - ) - continue - trans_insert_location = max( - trans_insert_location, min(max(dataloader_def_line_idx + 1, put_below_idx), put_above_idx) - ) - if "insert_below_input_definition_line" in loc: - try: - input_def_line_idx - except: - logger.warning( - f"Skipped due to not having input definition required by " - "the transformation content specified in the config file. " - f"File path: {file_path}" - ) - continue - trans_insert_location = max( - trans_insert_location, min(max(input_def_line_idx + 1, put_below_idx), put_above_idx) - ) - - insert_indent_level = get_line_indent_level(lines[trans_insert_location - 1]) - if trainer_def_line_idx > 0: # for transformers trainer to put right above trainer def - insert_indent_level = get_line_indent_level(lines[trans_insert_location]) - ### content - - # lines to insert - lines_to_insert = bk_trans_content_this - # replace [+] indication with empty - lines_to_insert = lines_to_insert.replace("[+] ", " " * insert_indent_level) - # add begin indicator - lines_to_insert = ( - " " * insert_indent_level - + "# [NeuralCoder] " - + self.backend - + " for " - + model_name - + " [Beginning Line]\n" - + lines_to_insert - ) - # replace INDICATIONS with real stuff - lines_to_insert = ( - lines_to_insert.replace("MODEL_NAME", model_name) - .replace("INPUT_NAME", input_name) - .replace("DATALOADER_NAME", dataloader_name) - .replace("INFERENCE_LINE", inference_line.strip()) - .replace("\n", " # [coder-enabled]\n") - ) - # add end indicator - lines_to_insert += ( - " # [coder-enabled]\n" - + " " * insert_indent_level - + "# [NeuralCoder] " - + self.backend - + " for " - + model_name - + " [Ending Line] # [coder-enabled]" - ) - - ### register - - if file_path not in globals.list_trans_insert_modified_file: - globals.list_trans_insert_modified_file.append(file_path) - globals.list_trans_insert_location_idxs.append([trans_insert_location]) - globals.list_trans_insert_number_insert_lines.append([lines_to_insert.count("\n") + 1]) - globals.list_trans_insert_lines_to_insert.append([lines_to_insert]) - else: - idx = globals.list_trans_insert_modified_file.index(file_path) - globals.list_trans_insert_location_idxs[idx].append(trans_insert_location) - globals.list_trans_insert_number_insert_lines[idx].append(lines_to_insert.count("\n") + 1) - globals.list_trans_insert_lines_to_insert[idx].append(lines_to_insert) - - # PART 2 - "inference line" - if ( - "indent_inference_line" in loc - or "insert_above_inference_line" in loc - or "insert_below_inference_line" in loc - ): - for file_path in globals.list_code_path: - code = open(file_path, "r").read() - lines = code.split("\n") - line_idx = 0 - for i in range(len(lines)): - line = lines[i] - for model_name in globals.list_model_name: - is_eval_func, eval_func_type = is_eval_func_model_name(model_name, line) - if is_eval_func and "[coder-enabled]" not in line: - if eval_func_type == "non-forward": - pass # do something - inference_line = line - inference_line_indent_level = get_line_indent_level(line) - - if "indent_inference_line" in loc: - bk_trans_content_this = bk_trans_content[bk_trans_location.index(loc)] - add_indent_level = int(bk_trans_content_this) - - trans_indent_location = [] - # indent can have multiple location, so is a list of numbers - trans_indent_level = [] - - if ")" in line: # e.g. model = Net(xxx) - trans_indent_location.append(line_idx) - trans_indent_level.append(add_indent_level) - else: # e.g. model = Net(xxx, \n xxx, \n xxx) - trans_indent_location.append(line_idx) - trans_indent_level.append(add_indent_level) - do_search = True - i_search = 1 - while do_search: - trans_indent_location.append(line_idx + i_search) - trans_indent_level.append(add_indent_level) - following_line = lines[line_idx + i_search] - if ")" in following_line: - do_search = False - i_search += 1 - - ### register - - if file_path not in globals.list_trans_indent_modified_file: - globals.list_trans_indent_modified_file.append(file_path) - globals.list_trans_indent_location_idxs.append(trans_indent_location) - globals.list_trans_indent_level.append(trans_indent_level) - else: - idx = globals.list_trans_indent_modified_file.index(file_path) - for i in trans_indent_location: - globals.list_trans_indent_location_idxs[idx].append(i) - for i in trans_indent_level: - globals.list_trans_indent_level[idx].append(i) - - if "insert_above_inference_line" in loc: - idx_offset = 0 - elif "insert_below_inference_line" in loc: - if ")" in line: # e.g. model = Net(xxx) - idx_offset = 1 - else: # e.g. model = Net(xxx, \n xxx, \n xxx) - do_search = True - i_search = 1 - while do_search: - following_line = lines[line_idx + i_search] - if ")" in following_line: - do_search = False - i_search += 1 - inference_line = ( - inference_line - + "\n" - + " " * (get_line_indent_level(line) + 4) - + following_line - ) - idx_offset = i_search - - if "insert_above_inference_line" in loc or "insert_below_inference_line" in loc: - bk_trans_content_this = bk_trans_content[bk_trans_location.index(loc)] - - trans_insert_location = line_idx + idx_offset - - insert_indent_level = inference_line_indent_level - - ### content - - # lines to insert - lines_to_insert = bk_trans_content_this - # replace [+] indication with empty - lines_to_insert = lines_to_insert.replace("[+] ", " " * insert_indent_level) - # add begin indicator - lines_to_insert = ( - " " * insert_indent_level - + "# [NeuralCoder] " - + self.backend - + " [Beginning Line] \n" - + lines_to_insert - ) - # replace INDICATIONS with real stuff - # (for now, inference_line related transformations ) - # (have nothing to do with input, dataloader etc, ) - # (so no need to put replaces here.) - lines_to_insert = lines_to_insert.replace("\n", " # [coder-enabled]\n") - # add end indicator - lines_to_insert += ( - " # [coder-enabled]\n" - + " " * insert_indent_level - + "# [NeuralCoder] " - + self.backend - + " [Ending Line] # [coder-enabled]" - ) - - # customized argument - if self.backend == "pytorch_benchmark": - lines_to_insert = lines_to_insert.replace( - "NUM_BENCHMARK_ITERATION", globals.num_benchmark_iteration - ) - lines_to_insert = lines_to_insert.replace("ACCURACY_MODE", str(False)) - lines_to_insert = lines_to_insert.replace( - "INFERENCE_LINE", inference_line.strip() - ) - - ### register - - if file_path not in globals.list_trans_insert_modified_file: - globals.list_trans_insert_modified_file.append(file_path) - globals.list_trans_insert_location_idxs.append([trans_insert_location]) - globals.list_trans_insert_number_insert_lines.append( - [lines_to_insert.count("\n") + 1] - ) - globals.list_trans_insert_lines_to_insert.append([lines_to_insert]) - else: - idx = globals.list_trans_insert_modified_file.index(file_path) - globals.list_trans_insert_location_idxs[idx].append(trans_insert_location) - globals.list_trans_insert_number_insert_lines[idx].append( - lines_to_insert.count("\n") + 1 - ) - globals.list_trans_insert_lines_to_insert[idx].append(lines_to_insert) - - break # already transformed this line, so skip any further model_name search - line_idx += 1 - - # PART 3 - for customized location - - logger.debug(f"globals.list_trans_insert_modified_file: {globals.list_trans_insert_modified_file}") - logger.debug(f"globals.list_trans_insert_location_idxs: {globals.list_trans_insert_location_idxs}") - logger.debug(f"globals.list_trans_insert_number_insert_lines: {globals.list_trans_insert_number_insert_lines}") - logger.debug(f"globals.list_trans_insert_lines_to_insert: {globals.list_trans_insert_lines_to_insert}") diff --git a/neural_coder/coders/pytorch/lightning.py b/neural_coder/coders/pytorch/lightning.py deleted file mode 100644 index 383432e2c3f..00000000000 --- a/neural_coder/coders/pytorch/lightning.py +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -class Lightning(object): - def __init__(self, file) -> None: - self.file = file - self.result = [] - - def transform(self): - lines = self.file.split("\n") - for line in lines: - if self.not_add_accelerator(line) or self.not_add_precision(line): - new_line = self.add(line) - if self.not_modify(new_line): - new_line = self.modify(new_line) - self.result.append(new_line) - elif self.not_modify(line): - new_line = self.modify(line) - self.result.append(new_line) - if not self.not_add_accelerator(line) and not self.not_add_precision(line) and not self.not_modify(line): - if line == "" and self.result[-1] == "": - continue - self.result.append(line) - - for index, line in enumerate(self.result): - if index != len(self.result) - 1: - self.result[index] += "\n" - return "".join(self.result) - - def not_add_precision(self, s): - if "Trainer" in s: - if "precision" not in s: - return True - else: - return False - return False - - def not_add_accelerator(self, s): - if "Trainer" in s: - if "accelerator" not in s: - return True - else: - return False - return False - - def add(self, s): - if "Trainer" in s: - if "precision" not in s: - s_index = s.find(")") - s = s[:s_index] + ', precision="bf16"' + s[s_index:] - if "accelerator" not in s: - s_index = s.find(")") - s = s[:s_index] + ', accelerator="cpu"' + s[s_index:] - return s - - def not_modify(self, s): - if "bf16" in s and "cpu" in s: - return False - return True - - def modify(self, s): - if "16" in s: - old = "16" - s = s.replace(old, '"bf16"') - if "32" in s: - old = "32" - s = s.replace(old, '"bf16"') - if '"gpu"' in s: - old = '"gpu"' - s = s.replace(old, '"cpu"') - if '"tpu"' in s: - old = '"tpu"' - s = s.replace(old, '"cpu"') - return s diff --git a/neural_coder/coders/pytorch/reclaim_inference_transformers_trainer.py b/neural_coder/coders/pytorch/reclaim_inference_transformers_trainer.py deleted file mode 100644 index 82f324e26b3..00000000000 --- a/neural_coder/coders/pytorch/reclaim_inference_transformers_trainer.py +++ /dev/null @@ -1,75 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import logging - -from ... import globals -from ...utils.line_operation import ( - get_line_indent_level, - get_line_left_hand_side, - is_eval_func_model_name, - single_line_comment_or_empty_line_detection, -) - -logging.basicConfig( - level=globals.logging_level, format="%(asctime)s %(levelname)s %(message)s", datefmt="%a, %d %b %Y %H:%M:%S +0000" -) -logger = logging.getLogger(__name__) - - -class ReclaimInferenceTransformersTrainer(object): - def __init__(self, list_model_def_instance): - self.list_model_def_instance = list_model_def_instance - - def print_info(self): - for i in self.list_model_def_instance: - logger.debug(f"i.print_info(): {i.print_info()}") - - # collect file transformation info and register (store) in globals - # (i.e. which file to add which lines at which location) - def register_transformation(self): - file_path = globals.list_code_path[0] - lines = open(file_path, "r").read().split("\n") - line_idx = 0 - - for i in range(len(lines)): - line = lines[i] - - if "# Evaluation" in line: - indent_level = get_line_indent_level(line) - trans_insert_location = i - lines_to_insert = "" - lines_to_insert += " " * indent_level + "eval_dataloader = trainer.get_eval_dataloader()" + "\n" - lines_to_insert += " " * indent_level + "import torch" + "\n" - lines_to_insert += " " * indent_level + "for step, inputs in enumerate(eval_dataloader):" + "\n" - lines_to_insert += " " * indent_level + " with torch.no_grad():" + "\n" - lines_to_insert += " " * indent_level + " model(**inputs)" - - if file_path not in globals.list_trans_insert_modified_file: - globals.list_trans_insert_modified_file.append(file_path) - globals.list_trans_insert_location_idxs.append([trans_insert_location]) - globals.list_trans_insert_number_insert_lines.append([lines_to_insert.count("\n") + 1]) - globals.list_trans_insert_lines_to_insert.append([lines_to_insert]) - else: - idx = globals.list_trans_insert_modified_file.index(file_path) - globals.list_trans_insert_location_idxs[idx].append(trans_insert_location) - globals.list_trans_insert_number_insert_lines[idx].append(lines_to_insert.count("\n") + 1) - globals.list_trans_insert_lines_to_insert[idx].append(lines_to_insert) - - line_idx += 1 - - logger.debug(f"globals.list_trans_insert_modified_file: {globals.list_trans_insert_modified_file}") - logger.debug(f"globals.list_trans_insert_location_idxs: {globals.list_trans_insert_location_idxs}") - logger.debug(f"globals.list_trans_insert_number_insert_lines: {globals.list_trans_insert_number_insert_lines}") - logger.debug(f"globals.list_trans_insert_lines_to_insert: {globals.list_trans_insert_lines_to_insert}") diff --git a/neural_coder/coders/pytorch/reclaim_inputs.py b/neural_coder/coders/pytorch/reclaim_inputs.py deleted file mode 100644 index 16397012e37..00000000000 --- a/neural_coder/coders/pytorch/reclaim_inputs.py +++ /dev/null @@ -1,106 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import logging - -from ... import globals -from ...utils.line_operation import ( - get_line_indent_level, - get_line_left_hand_side, - is_eval_func_model_name, - single_line_comment_or_empty_line_detection, -) - -logging.basicConfig( - level=globals.logging_level, format="%(asctime)s %(levelname)s %(message)s", datefmt="%a, %d %b %Y %H:%M:%S +0000" -) -logger = logging.getLogger(__name__) - - -class ReclaimInputs(object): - def __init__(self, list_model_def_instance): - self.list_model_def_instance = list_model_def_instance - - def print_info(self): - for i in self.list_model_def_instance: - logger.debug(f"i.print_info(): {i.print_info()}") - - # collect file transformation info and register (store) in globals - # (i.e. which file to add which lines at which location) - def register_transformation(self): - list_code = [] - for i in globals.list_code_path: - list_code.append(open(i, "r").read()) - - for ins in self.list_model_def_instance: - model_name = ins.model_name - file_path = ins.file_path - model_def_line_idx = ins.model_def_line_idx - function_def_line_idx = ins.function_def_line_idx - class_name = ins.class_name - - # transformation - file_path_idx = globals.list_code_path.index(file_path) - lines = list_code[file_path_idx].split("\n") - line_idx = 0 - - # search inference line in this file, and also input_name - inference_line = "" - input_name = "" - for i in range(len(lines)): - line = lines[i] - is_eval_func, eval_func_type = is_eval_func_model_name(model_name, line) - if is_eval_func and "[coder-enabled]" not in line: - inference_line = line - input_name = line[line.find("(") + 1 : line.find(")")].replace("*", "") # get "c" in "a = b(**c)" - - # if there is already a "input = xxx", then quit this function - if input_name != "": - for i in range(len(lines)): - line = lines[i] - if not single_line_comment_or_empty_line_detection(line): - if input_name in line and "=" in line and line.find(input_name) < line.find("="): - return - - # add the created lines for inputs - if inference_line != "" and input_name != "": - for i in range(len(lines)): - line = lines[i] - is_eval_func, eval_func_type = is_eval_func_model_name(model_name, line) - if is_eval_func and "[coder-enabled]" not in line: - indent_level = get_line_indent_level(line) - trans_insert_location = i - lines_to_insert = "" - lines_to_insert += " " * indent_level + "try:" + "\n" - lines_to_insert += " " * indent_level + " " + input_name + " = " + input_name + "\n" - lines_to_insert += " " * indent_level + "except:" + "\n" - lines_to_insert += " " * indent_level + " pass" - - if file_path not in globals.list_trans_insert_modified_file: - globals.list_trans_insert_modified_file.append(file_path) - globals.list_trans_insert_location_idxs.append([trans_insert_location]) - globals.list_trans_insert_number_insert_lines.append([lines_to_insert.count("\n") + 1]) - globals.list_trans_insert_lines_to_insert.append([lines_to_insert]) - else: - idx = globals.list_trans_insert_modified_file.index(file_path) - globals.list_trans_insert_location_idxs[idx].append(trans_insert_location) - globals.list_trans_insert_number_insert_lines[idx].append(lines_to_insert.count("\n") + 1) - globals.list_trans_insert_lines_to_insert[idx].append(lines_to_insert) - - line_idx += 1 - - logger.debug(f"globals.list_trans_insert_modified_file: {globals.list_trans_insert_modified_file}") - logger.debug(f"globals.list_trans_insert_location_idxs: {globals.list_trans_insert_location_idxs}") - logger.debug(f"globals.list_trans_insert_number_insert_lines: {globals.list_trans_insert_number_insert_lines}") - logger.debug(f"globals.list_trans_insert_lines_to_insert: {globals.list_trans_insert_lines_to_insert}") diff --git a/neural_coder/coders/tensorflow/__init__.py b/neural_coder/coders/tensorflow/__init__.py deleted file mode 100644 index e833188cc78..00000000000 --- a/neural_coder/coders/tensorflow/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/neural_coder/coders/tensorflow/amp.py b/neural_coder/coders/tensorflow/amp.py deleted file mode 100644 index 77f349ef084..00000000000 --- a/neural_coder/coders/tensorflow/amp.py +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from ...utils.line_operation import get_line_left_hand_side - - -class TensorFlowKerasAMP(object): - def __init__(self, file) -> None: - self.file = file - self.result = [] - self.keras_edited_flag = False - - def transform(self): - lines = self.file.split("\n") - for line in lines: - if self.is_modify(line): - if ".ConfigProto()" in line: # TF AMP - config_name = get_line_left_hand_side(line) - new_line_1 = "from tensorflow.core.protobuf import rewriter_config_pb2" - new_line_2 = ( - config_name - + ".graph_options.rewrite_options.auto_mixed_precision_mkl = " - + "rewriter_config_pb2.RewriterConfig.ON" - ) - self.result.append(line) - self.result.append(new_line_1) - self.result.append(new_line_2) - elif "keras" in line and "import" in line: # Keras AMP - if not self.keras_edited_flag: - new_line_1 = "from tensorflow.keras.mixed_precision import experimental as mixed_precision" - new_line_2 = "policy = mixed_precision.Policy('mixed_bfloat16')" - new_line_3 = "mixed_precision.set_policy(policy)" - self.result.append(line) - self.result.append(new_line_1) - self.result.append(new_line_2) - self.result.append(new_line_3) - self.keras_edited_flag = True - else: - self.result.append(line) - else: - self.result.append(line) - for index, line in enumerate(self.result): - if index != len(self.result) - 1: - self.result[index] += "\n" - return "".join(self.result) - - def is_modify(self, s): - if ".ConfigProto()" in s or ("keras" in s and "import" in s): - return True - else: - return False diff --git a/neural_coder/coders/tensorflow/inc.py b/neural_coder/coders/tensorflow/inc.py deleted file mode 100644 index 30455bc27c8..00000000000 --- a/neural_coder/coders/tensorflow/inc.py +++ /dev/null @@ -1,48 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from ...utils.line_operation import get_line_indent_level, get_line_left_hand_side - - -class TensorFlowKerasINC(object): - def __init__(self, file) -> None: - self.file = file - self.result = [] - - def transform(self): - lines = self.file.split("\n") - for line in lines: - if self.is_modify(line): - model_name = "model" - indent_level = get_line_indent_level(line) - self.result.append(line) - self.result.append(" " * indent_level + "from neural_compressor.quantization import fit") - self.result.append(" " * indent_level + "from neural_compressor.config import PostTrainingQuantConfig") - self.result.append(" " * indent_level + "from neural_compressor import common") - self.result.append(" " * indent_level + "config = PostTrainingQuantConfig(quant_level=1)") - self.result.append(" " * indent_level + model_name + " = fit(" + model_name + ", conf=config)") - self.result.append(" " * indent_level + model_name + '.save("./quantized_model")') - else: - self.result.append(line) - for index, line in enumerate(self.result): - if index != len(self.result) - 1: - self.result[index] += "\n" - return "".join(self.result) - - def is_modify(self, s): - if "model = tf." in s or "model = load_model(" in s: - if "self.model" not in s: - return True - else: - return False diff --git a/neural_coder/coders/transform.py b/neural_coder/coders/transform.py deleted file mode 100644 index c553cbbb87b..00000000000 --- a/neural_coder/coders/transform.py +++ /dev/null @@ -1,84 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import logging - -from .. import globals - -logging.basicConfig( - level=globals.logging_level, format="%(asctime)s %(levelname)s %(message)s", datefmt="%a, %d %b %Y %H:%M:%S +0000" -) -logger = logging.getLogger(__name__) - - -def execute_insert_transformation(list_transformed_code): - """Insert code lines into file.""" - for index, file_path in enumerate(globals.list_trans_insert_modified_file): - trans_location_idxs = globals.list_trans_insert_location_idxs[index] - trans_number_insert_lines = globals.list_trans_insert_number_insert_lines[index] - trans_lines_to_insert = globals.list_trans_insert_lines_to_insert[index] - - # sort trans_location_idxs and sort the other lists accordingly - trans_number_insert_lines = [i for _, i in sorted(zip(trans_location_idxs, trans_number_insert_lines))] - trans_lines_to_insert = [i for _, i in sorted(zip(trans_location_idxs, trans_lines_to_insert))] - trans_location_idxs = sorted(trans_location_idxs) - - file_path_idx = globals.list_code_path.index(file_path) - lines_transformed = list_transformed_code[file_path_idx].split("\n") - - # math - t = [0] - u = 0 - for n in trans_number_insert_lines: - u = u + n - t.append(u) - t = t[:-1] - - logger.debug(f"t: {t}") - trans_location_idxs = [sum(i) for i in zip(trans_location_idxs, t)] - logger.debug(f"trans_location_idxs after adjustment: {trans_location_idxs}") - - for idx in trans_location_idxs: # actual transformation (insertion) - additions = trans_lines_to_insert[trans_location_idxs.index(idx)].split("\n") - additions = additions[::-1] # reverse - for i in range(len(additions)): - lines_transformed.insert(idx, additions[i]) - - # transfer lines_transformed to code format ("\n" save write) - code_transformed = "".join([i + "\n" for i in lines_transformed])[0:-1] - - list_transformed_code[file_path_idx] = code_transformed - - return list_transformed_code - - -def execute_indent_transformation(list_transformed_code): - """Indent code lines with spaces at the beginning.""" - for index, file_path in enumerate(globals.list_trans_indent_modified_file): - trans_location_idxs = globals.list_trans_indent_location_idxs[index] - trans_indent_level = globals.list_trans_indent_level[index] - - file_path_idx = globals.list_code_path.index(file_path) - lines_transformed = list_transformed_code[file_path_idx].split("\n") - - for idx in trans_location_idxs: # actual transformation (indent) - this_indent_level = trans_indent_level[trans_location_idxs.index(idx)] - lines_transformed[idx] = " " * 4 * this_indent_level + lines_transformed[idx] - - # transfer lines_transformed to code format ("\n" save write) - code_transformed = "".join([i + "\n" for i in lines_transformed])[0:-1] - - list_transformed_code[file_path_idx] = code_transformed - - return list_transformed_code diff --git a/neural_coder/docs/AWSSageMakerSupport.md b/neural_coder/docs/AWSSageMakerSupport.md deleted file mode 100644 index eb8926c12ee..00000000000 --- a/neural_coder/docs/AWSSageMakerSupport.md +++ /dev/null @@ -1,32 +0,0 @@ -AWS Amazon SageMaker Support -===== - -[AWS Amazon SageMaker](https://aws.amazon.com/sagemaker/) users can easily enjoy the productivity boost brought by Neural Coder by one-click installing [Neural Coder Jupyter Lab extension](https://www.npmjs.com/package/jupyter-lab-neural-compressor) in either **SageMaker Studio** or **SageMaker Notebook instance**. - -## Start Jupyter Lab 3 -[Neural Coder Jupyter extension](https://www.npmjs.com/package/jupyter-lab-neural-compressor) requires Jupyter Lab 3. Using Jupyter Lab 1 will cause installation error. To start Jupyter Lab 3, please check the following: - -#### For SageMaker Studio -SageMaker Studio Jupyter Lab 3 - -#### For SageMaker Notebook instance -SageMaker Notebook instance Jupyter Lab 3 - -## Installation Guide -For both cases, the installation process is exactly the same, which is by **searching ```neural-compressor``` in the Extension Manager**. - -1. Search and Install - -SageMaker Notebook instance Jupyter Lab 3 - -2. Rebuild - -SageMaker Notebook instance Jupyter Lab 3 - -3. Save and Reload - -SageMaker Notebook instance Jupyter Lab 3 - -4. Done! - -SageMaker Notebook instance Jupyter Lab 3 diff --git a/neural_coder/docs/BigDLNanoSupport.md b/neural_coder/docs/BigDLNanoSupport.md deleted file mode 100644 index 0ea0e4dc849..00000000000 --- a/neural_coder/docs/BigDLNanoSupport.md +++ /dev/null @@ -1,37 +0,0 @@ -BigDL Nano Support -=========================== - -Neural Coder collaborates with [BigDL-Nano](https://bigdl.readthedocs.io/en/latest/doc/Nano/Overview/nano.html), a Python library that automatically applies modern CPU optimizations, to further democratize ease-of-use BigDL-Nano APIs as a **no-code** solution for PyTorch Deep Learning programmers. - -## Example -For instance, to perform BF16 + Channels Last optimizations with BigDL-Nano API using Neural Coder on the [example code](../examples/nano/resnet18.py) and run this code with the enabled optimizations, users can simply execute this command: -``` -python -m neural_coder -o nano_bf16_channels_last ../examples/nano/resnet18.py -``` -The alias for each optimization set is documented in the below Support Matrix. Note that you need to ```pip install bigdl``` first following [BigDL-Nano documentation](https://github.com/intel-analytics/BigDL#installing). - -## Support Matrix - -| Optimization Set | API Alias | -| ------------- | ------------- | -| BF16 + Channels Last | `nano_bf16_channels_last` | -| BF16 + IPEX + Channels Last | `nano_bf16_ipex_channels_last` | -| BF16 + IPEX | `nano_bf16_ipex` | -| BF16 | `nano_bf16` | -| Channels Last | `nano_fp32_channels_last` | -| IPEX + Channels Last | `nano_fp32_ipex_channels_last` | -| IPEX | `nano_fp32_ipex` | -| Convert CUDA TO GPU | `nano_gpu_to_cpu` | -| INT8 | `nano_int8` | -| JIT + BF16 + Channels Last | `nano_jit_bf16_channels_last` | -| JIT + BF16 + IPEX + Channels Last | `nano_jit_bf16_ipex_channels_last` | -| JIT + BF16 + IPEX | `nano_jit_bf16_ipex` | -| JIT + BF16 | `nano_jit_bf16` | -| JIT + Channels Last | `nano_jit_fp32_channels_last` | -| JIT + IPEX + Channels Last | `nano_jit_fp32_ipex_channels_last` | -| JIT + IPEX | `nano_jit_fp32_ipex` | -| JIT | `nano_jit_fp32` | -| ONNX Runtime | `nano_onnxruntime_fp32` | -| ONNX Runtime + INT8 | `nano_onnxruntime_int8_qlinear` | -| OpenVINO | `nano_openvino_fp32` | -| OpenVINO + INT8 | `nano_openvino_int8` | diff --git a/neural_coder/docs/IntelCPU_PerformanceSetting.md b/neural_coder/docs/IntelCPU_PerformanceSetting.md deleted file mode 100644 index a112fd3516f..00000000000 --- a/neural_coder/docs/IntelCPU_PerformanceSetting.md +++ /dev/null @@ -1,51 +0,0 @@ -## Intel CPU Platforms: Best Performance Setting -### Install MKL, OpenMP and JEMALLOC -The simplest way for installation is through ```conda install```: -```bash -conda install -y mkl mkl-include jemalloc -``` - -### Install NUMA Controller -```bash -apt-get update && apt-get install bc numactl -``` - -### Environment Variables -Check if your ```CONDA_PREFIX``` has a value by: -```bash -echo ${CONDA_PREFIX} -``` -If it is empty, it means that you are not in a traditional CONDA environment, you need to find the location of the ```.so``` files by: -```bash -find / -name "libjemalloc.so" -find / -name "libiomp5.so" -``` -It will show the path these files were installed into. For example: -```bash -/home/name/lib/libjemalloc.so -/home/name/lib/libiomp5.so -``` -And then you should ```export``` this path as ```CONDA_PREFIX```: -```bash -export CONDA_PREFIX="/home/name" -``` -Finally: -```bash -export LD_PRELOAD=${LD_PRELOAD}:${CONDA_PREFIX}/lib/libjemalloc.so -export LD_PRELOAD=${LD_PRELOAD}:${CONDA_PREFIX}/lib/libiomp5.so -export MALLOC_CONF="oversize_threshold:1,background_thread:true,metadata_thp:auto,dirty_decay_ms:9000000000,muzzy_decay_ms:9000000000" -export KMP_AFFINITY="granularity=fine,compact,1,0" -export KMP_BLOCKTIME=1 -export DNNL_PRIMITIVE_CACHE_CAPACITY=1024 -``` - -### Frequency Governers -Check the frequency governor state on your machine: -```bash -cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor -``` -If it shows ```powersave``` instead of ```performance```, execute: -```bash -echo "performance" | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor -cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor -``` diff --git a/neural_coder/docs/PythonAPI.md b/neural_coder/docs/PythonAPI.md deleted file mode 100644 index dfc7567fe43..00000000000 --- a/neural_coder/docs/PythonAPI.md +++ /dev/null @@ -1,58 +0,0 @@ -Neural Coder as Python API -=========================== - -Neural Coder can be used as Python APIs. We currently provide 3 main user-facing APIs for Neural Coder: enable, bench and superbench. - -#### Enable -Users can use ```enable()``` to enable specific features into DL scripts: -``` -from neural_coder import enable -enable( - code="neural_coder/examples/vision/resnet50.py", - features=[ - "pytorch_jit_script", - "pytorch_channels_last", - ], -) -``` -To run benchmark directly on the optimization together with the enabling: -``` -from neural_coder import enable -enable( - code="neural_coder/examples/vision/resnet50.py", - features=[ - "pytorch_jit_script", - "pytorch_channels_last" - ], - run_bench=True, -) -``` - -#### Bench -To run benchmark on your code with an existing patch: -``` -from neural_coder import bench -bench( - code="neural_coder/examples/vision/resnet50.py", - patch_path="${your_patch_path}", -) -``` - -#### SuperBench -To sweep on optimization sets with a fixed benchmark configuration: -``` -from neural_coder import superbench -superbench(code="neural_coder/examples/vision/resnet50.py") -``` -To sweep on benchmark configurations for a fixed optimization set: -``` -from neural_coder import superbench -superbench( - code="neural_coder/examples/vision/resnet50.py", - sweep_objective="bench_config", - bench_feature=[ - "pytorch_jit_script", - "pytorch_channels_last", - ], -) -``` diff --git a/neural_coder/docs/PythonLauncher.md b/neural_coder/docs/PythonLauncher.md deleted file mode 100644 index 74ad230e1f9..00000000000 --- a/neural_coder/docs/PythonLauncher.md +++ /dev/null @@ -1,40 +0,0 @@ -Python Launcher -=========================== - -Neural Coder can be used as a Python **Launcher**. Users can run the Python model code as it is with automatic enabling of Deep Learning optimizations by using Neural Coder's inline Python **Launcher** design. - -## Quick-Start - -Example: Let's say you are running an NLP model using ```run_glue.py``` from HuggingFace transformers [examples](https://github.com/huggingface/transformers/blob/v4.21-release/examples/pytorch/text-classification/run_glue.py). - -Pre-requisites: -```bash -pip install transformers==4.21.0 torch datasets -``` - -Generally we run this code with a Python command line like this: -```bash -python run_glue.py --model_name_or_path bert-base-cased --task_name mrpc --do_eval --output_dir result -``` - -With Neural Coder's **Launcher**, users can easily enjoy Deep Learning optimizations (e.g. default - INT8 dynamic quantization by Intel® Neural Compressor for PyTorch models) by simply adding an inline prefix -```bash --m neural_coder -``` -to the Python command line, and everything else remains the same: -```bash -python -m neural_coder run_glue.py --model_name_or_path bert-base-cased --task_name mrpc --do_eval --output_dir result -``` - -This will run ```run_glue.py``` with the Deep Learning optimization automatically enabled, while everything else (e.g. your input arguments for the code itself) remains the same as the original code. You can also check out the optimized code ```run_glue_optimized.py``` auto-generated by the **Launcher** under the same folder if you want to learn the code enabling. - -Note: Any modification on the optimized code ```run_glue_optimized.py``` will be overwritten every time you run Neural Coder **Launcher** on ```run_glue.py```, so please make any modification on the original code ```run_glue.py``` instead of the optimized one. The optimized code is only saved for your reference. - -## Launcher Arguments (Optional) - -Users can specify which Deep Learning optimization they want to conduct using ```--opt``` argument. The list of supported Deep Learning optimization features can be found [here](SupportMatrix.md). - -Note that if specifically optimizing with INT8 quantization by Intel® Neural Compressor, to choose a quantization approach (strategy), ```--approach``` argument can be specified with either ```static```, ```static_ipex``` or ```dynamic```. For example, to run INT8 static quantization by Intel® Neural Compressor: -```bash -python -m neural_coder --approach static run_glue.py --model_name_or_path bert-base-cased --task_name mrpc --do_eval --output_dir result -``` diff --git a/neural_coder/docs/Quantization.md b/neural_coder/docs/Quantization.md deleted file mode 100644 index 555834c74a8..00000000000 --- a/neural_coder/docs/Quantization.md +++ /dev/null @@ -1,39 +0,0 @@ -Neural Coder for Quantization -=========================== -This feature helps automatically enable quantization on Deep Learning models and automatically evaluates for the best performance on the model. It is a code-free solution that can help users enable quantization algorithms on a model with no manual coding needed. Supported features include Post-Training Static Quantization, Post-Training Dynamic Quantization, and Mixed Precision. - - -## Features Supported -- Post-Training Static Quantization for [Stock PyTorch](https://pytorch.org/tutorials/prototype/fx_graph_mode_ptq_static.html) (with FX backend) -- Post-Training Static Quantization for [IPEX](https://github.com/intel/intel-extension-for-pytorch/blob/v1.12.0/docs/tutorials/features/int8.md) -- Post-Training Dynamic Quantization for [Stock PyTorch](https://pytorch.org/tutorials/recipes/recipes/dynamic_quantization.html) -- Mixed Precision for [Stock PyTorch](https://pytorch.org/tutorials/recipes/recipes/amp_recipe.html) - -## Models Supported -- HuggingFace [Transformers](https://github.com/huggingface/transformers) models -- [torchvision](https://pytorch.org/vision/stable/index.html) models -- Broad models (under development) - -## Usage -- PyPI distribution with a one-line API call -- [JupyterLab extension](../extensions/neural_compressor_ext_lab/README.md) - -## Example -### PyPI distribution: -HuggingFace [Transformers](https://github.com/huggingface/transformers) models: [text-classification/run_glue.py](https://github.com/huggingface/transformers/blob/v4.21-release/examples/pytorch/text-classification/run_glue.py) -``` -from neural_coder import auto_quant -auto_quant( - code="https://github.com/huggingface/transformers/blob/v4.21-release/examples/pytorch/text-classification/run_glue.py", - args="--model_name_or_path albert-base-v2 --task_name sst2 --do_eval --output_dir result", -) -``` - -[torchvision](https://pytorch.org/vision/stable/index.html) models: [imagenet/main.py](https://github.com/pytorch/examples/blob/main/imagenet/main.py) -``` -from neural_coder import auto_quant -auto_quant( - code="https://github.com/pytorch/examples/blob/main/imagenet/main.py", - args="-a alexnet --pretrained -e /path/to/imagenet/", -) -``` diff --git a/neural_coder/docs/SupportMatrix.md b/neural_coder/docs/SupportMatrix.md deleted file mode 100644 index be2a7fea308..00000000000 --- a/neural_coder/docs/SupportMatrix.md +++ /dev/null @@ -1,26 +0,0 @@ -Supported Optimization Features -=========================== - -| Category | Optimization | API Alias | -| ------------- | ------------- | ------------- | -| PyTorch | [Mixed Precision](https://pytorch.org/docs/stable/amp.html) | `pytorch_amp` | -| PyTorch | [Channels Last](https://pytorch.org/tutorials/intermediate/memory_format_tutorial.html) | `pytorch_channels_last` | -| PyTorch | [JIT (Just-In-Time) Script/Trace](https://pytorch.org/docs/stable/jit.html) & [optimize_for_inference](https://pytorch.org/docs/stable/generated/torch.jit.optimize_for_inference.html) | `pytorch_jit_script`, `pytorch_jit_trace`, `pytorch_jit_script_ofi`, `pytorch_jit_trace_ofi` | -| PyTorch | JIT with [TorchDynamo](https://github.com/pytorch/torchdynamo) | `pytorch_torchdynamo_jit_script`, `pytorch_torchdynamo_jit_trace`, `pytorch_torchdynamo_jit_script_ofi`, `pytorch_torchdynamo_jit_trace_ofi` | -| PyTorch | [Intel Neural Compressor (INC) Mixed Precision](https://github.com/intel/neural-compressor/blob/master/docs/source/mixed_precision.md) | `pytorch_inc_bf16` | -| PyTorch | [INC INT8 Static Quantization (FX/IPEX)](https://github.com/intel/neural-compressor/blob/master/docs/source/quantization.md#supported-feature-matrix) | `pytorch_inc_static_quant_fx`, `pytorch_inc_static_quant_ipex`, `pytorch_inc_static_quant_ipex_xpu` | -| PyTorch | [INC INT8 Dynamic Quantization](https://github.com/intel/neural-compressor/blob/master/docs/source/quantization.md#supported-feature-matrix) | `pytorch_inc_dynamic_quant` | -| PyTorch | [Intel Extension for PyTorch (FP32, BF16, INT8 Static/Dynamic Quantization)](https://github.com/intel/intel-extension-for-pytorch) | `pytorch_ipex_fp32`, `pytorch_ipex_bf16`, `pytorch_ipex_int8_static_quant`, `pytorch_ipex_int8_dynamic_quant` | -| PyTorch | [Alibaba Blade-DISC](https://github.com/alibaba/BladeDISC) | `pytorch_aliblade` | -| PyTorch Lightning | [Mixed Precision](https://pytorch-lightning.readthedocs.io/en/latest/guides/speed.html) | `pytorch_lightning_bf16_cpu` | -| TensorFlow | [Mixed Precision](https://www.intel.com/content/www/us/en/developer/articles/guide/getting-started-with-automixedprecisionmkl.html) | `tensorflow_amp` | -| Keras | [Mixed Precision](https://www.tensorflow.org/guide/mixed_precision) | `keras_amp` | -| TensorFlow/Keras Model | [INC Quantization](https://github.com/intel/neural-compressor/blob/master/docs/source/quantization.md#supported-feature-matrix) | `tensorflow_inc` | -| Keras Script | [INC Quantization](https://github.com/intel/neural-compressor/tree/master/examples/keras/mnist) | `keras_inc` | -| ONNX Runtime | [INC Static Quantization (QLinear)](https://github.com/intel/neural-compressor/blob/master/docs/source/quantization.md#supported-feature-matrix) | `onnx_inc_static_quant_qlinear` | -| ONNX Runtime | [INC Static Quantization (QDQ)](https://github.com/intel/neural-compressor/blob/master/docs/source/quantization.md#supported-feature-matrix) | `onnx_inc_static_quant_qdq` | -| ONNX Runtime | [INC Dynamic Quantization](https://github.com/intel/neural-compressor/blob/master/docs/source/quantization.md#supported-feature-matrix) | `onnx_inc_dynamic_quant` | -| [HuggingFace Optimum-Intel](https://huggingface.co/docs/optimum/intel/index) | INC Quantization | `pytorch_inc_huggingface_optimum_static`, `pytorch_inc_huggingface_optimum_dynamic` | -| [Intel Extension for Transformers](https://github.com/intel/intel-extension-for-transformers/) | INC Quantization | `intel_extension_for_transformers` | -| [BigDL Nano](https://bigdl.readthedocs.io/en/latest/doc/PythonAPI/Nano/pytorch.html#bigdl-nano-pytorch-inferenceoptimizer) | [Optimization List](./BigDLNanoSupport.md) | `nano_` + [specific alias](./BigDLNanoSupport.md) | -| Auto-Detect | [INC Quantization](https://github.com/intel/neural-compressor) | `inc_auto` | diff --git a/neural_coder/docs/cloud_autobench/CloudAutobench.MD b/neural_coder/docs/cloud_autobench/CloudAutobench.MD deleted file mode 100644 index d906a80292f..00000000000 --- a/neural_coder/docs/cloud_autobench/CloudAutobench.MD +++ /dev/null @@ -1,95 +0,0 @@ -# Cloud Auto-bench -This is a user guide for the automated bash script for creating a cloud instance, configuring the environment, running the benchmark code, and terminating the instance. The script supports AWS and Ali Yun for now and will support more cloud vendors in the future. - -## Prerequisite -## AWS -#### Install AWS CLI -Install the latest AWS CLI according to https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html. -Example: install AWS CLI on Linux x86 (64-bit) by the following commands. -``` -curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" -unzip awscliv2.zip -./aws/install -i ~/.Awscli2 -b ~/.Awscli2/bin -export PATH=/.Awscli2/bin:$PATH -``` -Confirm the installation with the following command. -``` -export PATH=/.Awscli2/bin:$PATH -``` - -#### Configure IAM role -Configure IAM role to access AWS according to https://us-east-2.console.aws.amazon.com/iamv2/home#/users. - -#### Configure AWS clients -Configure AWS clients via "aws configure" which fetch from step 2. -``` -aws --configure -AWS Access Key ID [None]: x -AWS Secret Access Key [None]: x -Default region name [None]: us-east-2 -Default output format [None]: text -``` - -#### Create a key pair -Create a key pair x.pem via https://us-east-2.console.aws.amazon.com/ec2/v2/home?region=us-east-2#KeyPairs:, add x.pem to the current folder, and modify its permission by -``` -chmod 400 x.pem -``` - -## Ali Yun -#### Install Alibaba Cloud CLI -Download the installation package for Linux from https://www.alibabacloud.com/help/en/alibaba-cloud-cli/latest/linux - -Decompress the downloaded file to obtain the executable file named aliyun -``` -tar xzvf (aliyun-cli-linux-latest-amd64.tgz) -``` -In the "()" is the file name of the installation file you have downloaded - -Set environment variables -add this line into the ~/.bash_profile file -``` -export PATH=/home/your_directory/.Awscli2/bin:$PATH -``` - -Your directory is the directory of bin in the ALi Yun installation directory) -source environment variables - -#### Configure Ali Yun clients -run -``` -aliyun configure -``` - -Input the key ID, key secret, region ID and default language of your Ali Yun account -``` -Access Key Id [************************]: -Access Key Secret [******************************]: -Default Region Id [**-****]: -Default Output Format [json]: json (Only support json) -Default Language [zh|en] en -``` - -### Create a key pair of Ali Yun according to page https://ecs.console.aliyun.com/#/keyPair/ -add x.pem to the current folder, and modify its permission by -``` -chmod 400 x.pem -``` - -## Launch the cloud benchmark script -### Modify the permission of bench.sh -``` -chmod 755 bench.sh -``` - -### Input your task config information in the config.conf file -You need to input the information of your task in the config.conf file -You can choose the cloud vendor(AWS or Ali Yun), Instance number, type and other information with the comments as a reference - -### Launch the script -``` -./bench.sh -``` - -### Output -Example Cloud auto-bench report: ```superbench_report_aws_icx.pdf``` diff --git a/neural_coder/docs/cloud_autobench/bench.sh b/neural_coder/docs/cloud_autobench/bench.sh deleted file mode 100644 index b28b2de9ed2..00000000000 --- a/neural_coder/docs/cloud_autobench/bench.sh +++ /dev/null @@ -1,497 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -#!/bin/bash - -# Read the user input - -check_input() -{ -if [ $whether_launch_new -eq "1" ] -then - if [ $vendor -eq "1" ] - then - if [ -z $security_id_aws ] - then - echo "[ERROR] There is no security group ID, you must specify security ID in config file when creating a new instance" - fi - - if [ -z $subnet_id_aws ] - then - echo "[ERROR] There is no subnet ID, you must specify subnet ID in config file when creating a new instance" - fi - elif [ $vendor -eq "2" ] - then - if [ -z $security_id_ali ] - then - echo "[ERROR] There is no security group ID, you must specify security ID in config file when creating a new instance" - fi - - if [ -z $region_id_ali ] - then - echo "[ERROR] There is no region ID, you must specify region ID in config file when creating a new instance" - fi - else - echo "[ERROR] There is no this vendor" - fi -else - if [ -z $instance_id ] - then - echo "[ERROR] There is no instance ID, you must specify instance ID in config file when using an existed instance" - fi -fi - -} - -create_AWS_instance() -{ -if [ $os -eq "1" ] -then - if [ $arch -eq "1" ] - then - ami_ID="ami-02f3416038bdb17fb" - else - ami_ID="ami-0ff596d41505819fd" - fi -elif [ $os -eq "2" ] -then - if [ $arch -eq "1" ] - then - ami_ID="ami-02d1e544b84bf7502" - else - ami_ID="ami-03e57de632660544c" - fi -elif [ $os -eq "3" ] -then - if [ $arch -eq "1" ] - then - ami_ID="ami-092b43193629811af" - else - ami_ID="ami-0082f8c86a7132597" - fi -elif [ $os -eq "4" ] -then - if [ $arch -eq "1" ] - then - ami_ID="ami-0f7cb53c916a75006" - else - ami_ID="ami-075a486be6269029f" - fi -else - echo "[ERROR] The operating system is invalid" - exit 0 -fi - -echo "[INFO] Starting creating AMS instance ..." - -instance_id=$(aws ec2 run-instances --image-id $ami_ID --count $count --instance-type $i_type --key-name $key_name --security-group-ids $security_id_aws --subnet-id $subnet_id_aws --block-device-mappings 'DeviceName=/dev/sda1, Ebs={VolumeSize=30}' --query "Instances[0].InstanceId") -result=$? -if [ $result -ne '0' ] -then - echo "[ERROR] Create AWS Instance failed" - exit 0 -else - echo "[INFO] Create AWS instance success" - echo "[INFO] Your Instance Id is $instance_id" - echo "[INFO] Waiting for instance to initialize ..." - echo "[INFO] 15s left ..." - sleep 5s - echo "[INFO] 10s left ..." - sleep 5s - echo "[INFO] 5s left ..." - sleep 5s -fi -} - -create_Ali_Yun_instance() -{ -if [ $os -eq "1" ] -then - if [ $arch -eq "1" ] - then - ami_ID="ubuntu_20_04_x64_20G_alibase_20220524.vhd" - else - ami_ID="ubuntu_20_04_x64_20G_alibase_20220524.vhd" - fi -elif [ $os -eq "2" ] -then - if [ $arch -eq "1" ] - then - ami_ID="ubuntu_20_04_x64_20G_alibase_20220524.vhd" - else - ami_ID="ubuntu_20_04_x64_20G_alibase_20220524.vhd" - fi -elif [ $os -eq "3" ] -then - if [ $arch -eq "1" ] - then - ami_ID="ubuntu_20_04_x64_20G_alibase_20220524.vhd" - else - ami_ID="ubuntu_20_04_x64_20G_alibase_20220524.vhd" - fi -elif [ $os -eq "4" ] -then - if [ $arch -eq "1" ] - then - ami_ID="ubuntu_20_04_x64_20G_alibase_20220524.vhd" - else - ami_ID="ubuntu_20_04_x64_20G_alibase_20220524.vhd" - fi -else - echo "[ERROR] The operating system is invalid" - exit 0 -fi - -i_type="ecs.$i_type_family.$i_type_size" - -echo "[INFO] Starting creating Ali Yun instance ..." - -instance_id=$(aliyun ecs RunInstances --RegionId $region_id_ali --InstanceType $i_type --InstanceChargeType PostPaid --ImageId $ami_ID --KeyPairName $key_name --SecurityGroupId $security_id_ali --VSwitchId vsw-m5ethlhigvonp2kuyzhjw --InternetMaxBandwidthIn 1 --InternetMaxBandwidthOut 1 |grep "i-") -result=$? - -instance_id="${instance_id:4:22}" -if [ $result -ne '0' ] -then - echo "[ERROR] Create Ali Yun Instance failed" - exit 0 -else - echo "[INFO] Create Ali Yun instance successfully" - echo "[INFO] The Ali Yun instance id is: $instance_id" - echo "[INFO] Waiting for instance to initialize ..." - echo "[INFO] 35s left ..." - sleep 5s - echo "[INFO] 30s left ..." - sleep 5s - echo "[INFO] 25s left ..." - sleep 5s - echo "[INFO] 20s left ..." - sleep 5s - echo "[INFO] 15s left ..." - sleep 5s - echo "[INFO] 10s left ..." - sleep 5s - echo "[INFO] 5s left ..." - sleep 5s -fi -} - -connect_AWS() -{ -dns_name=$(aws ec2 describe-instances --instance-ids $instance_id --query "Reservations[0].Instances[0].PublicDnsName") -result=$? -if [ $result -ne '0' ] -then - echo "[ERROR] Can not find this instance, please check" - exit 0 -fi - -host_name=$dns_name - -if [ $os -eq "1" ] -then - host_name="ubuntu@$dns_name" -else - host_name="ec2-user@$dns_name" -fi - -key_name="$key_name.pem" -echo "[INFO] Your instance host name is: $host_name" -echo "[INFO] Connecting to AWS Instance ..." -ssh -i $key_name $host_name -o "StrictHostKeyChecking no" "uname -a ; exit" -result=$? -if [ $result -ne '0' ] -then - echo "[ERROR] SSH connection failed" - echo "[INFO] Start terminating the Instance" - aws ec2 terminate-instances --instance-ids $instance_id - result=$? - if [ $result -ne '0' ] - then - echo "[ERROR] Instance termination failed" - else - echo "[INFO] Instance termination success" - fi - exit 0 -else - echo "[INFO] Connect to AWS Instance success" -fi - -echo "[INFO] Start to transferring benchmark files" -scp -i $key_name -r ./code/ $host_name:/tmp -result=$? -if [ $result -ne '0' ] -then - echo "[ERROR] SSH connection failed" - exit 0 -else - echo "[INFO] File transferring success" -fi - -if [ $whether_launch_new -eq "1" ] -then - ssh -i $key_name $host_name "cd /tmp/code; chmod +x ./config.sh; ./config.sh; exit" - echo "[INFO] Install dependencies finished" -else - echo "[INFO] Configured environment" -fi - -echo "[INFO] Start launching the task ..." - -ssh -i $key_name $host_name "cd /tmp/code; chmod +x ./launch.sh; ./launch.sh; exit" - -echo "[INFO] Benchmark Execution finished" -} - -connect_Ali_Yun() -{ -public_ip=$(aliyun ecs DescribeInstances --output cols=InstanceId,PublicIpAddress.IpAddress rows=Instances.Instance[] |grep $instance_id) -result=$? -if [ $result -ne '0' ] -then - echo "[ERROR] Can not find this instance, please check" - exit 0 -fi - -public_ip="${public_ip:25}" -length=${#public_ip} -public_ip="${public_ip:1:$length-2}" -host_name="root@$public_ip" -key_name="$key_name.pem" -echo "[INFO] Your instance host name is: $host_name" - -echo "[INFO] Start to connecting Ali Yun instance" -ssh -i $key_name $host_name -o "StrictHostKeyChecking no" "uname -a ; exit" -result=$? -if [ $result -ne '0' ] -then - echo "[ERROR] SSH connection failed" - echo "[INFO] Start to delete instance $instance_id" - sleep 60s - aliyun ecs DeleteInstance --InstanceId $instance_id --Force true - result=$? - if [ $result -ne '0' ] - then - echo "[ERROR] Instance termination failed" - exit 0 - else - echo "[INFO] Instance termination success" - fi - exit 0 -else - echo "[INFO] Connect to Ali Yun Instance success" -fi - -echo "[INFO] Start to transferring benchmark files" -scp -i $key_name -r ./code/ $host_name:/tmp -result=$? -if [ $result -ne '0' ] -then - echo "[ERROR] SSH connection failed" - exit 0 -else - echo "[INFO] File transferring success" -fi - -if [ $whether_launch_new -eq "1" ] -then - ssh -i $key_name $host_name "cd /tmp/code; chmod +x ./config.sh; ./config.sh; exit" - echo "[INFO] Install dependencies finished" -else - echo "[INFO] Configured environment" -fi - -echo "[INFO] Start launching the task ..." - -ssh -i $key_name $host_name "cd /tmp/code; chmod +x ./launch.sh; ./launch.sh; exit" - -echo "[INFO] Benchmark Execution finished" -} - -close_AWS() -{ - -if [ $whether_retain -eq "1" ] -then - echo "[INFO] Start stopping the Instance" - - aws ec2 stop-instances --instance-ids $instance_id - result=$? - if [ $result -ne '0' ] - then - echo "[ERROR] Instance stop failed" - exit 0 - else - echo "[INFO] Instance stop success" - echo "[INFO] The instance id is $instance_id, Please record this $instance_id for next use" - fi -else - echo "[INFO] Start terminating the Instance" - - aws ec2 terminate-instances --instance-ids $instance_id - result=$? - if [ $result -ne '0' ] - then - echo "[ERROR] Instance termination failed" - exit 0 - else - echo "[INFO] Instance termination success" - fi -fi -} - -close_Ali_Yun() -{ - -if [ $whether_retain -eq "1" ] -then - echo "[INFO] Start stopping the Instance" - - aliyun ecs StopInstance --InstanceId $instance_id - result=$? - if [ $result -ne '0' ] - then - echo "[ERROR] Instance stop failed" - exit 0 - else - echo "[INFO] Instance stop success" - echo "[INFO] The instance id is $instance_id, Please record this $instance_id for next use" - fi -elif [ $whether_retain -eq "2" ] -then - echo "[INFO] Start terminating the Instance" - - aliyun ecs DeleteInstance --InstanceId $instance_id --Force true - result=$? - if [ $result -ne '0' ] - then - echo "[ERROR] Instance termination failed" - exit 0 - else - echo "[INFO] Instance termination success" - fi -fi -} - - -main() -{ -vendor=$(sed '/^cloud_vendor=/!d; s/.*=//' config.conf) -os=$(sed '/^OS=/!d; s/.*=//' config.conf) -arch=$(sed '/^arch=/!d; s/.*=//' config.conf) -count=$(sed '/^count=/!d; s/.*=//' config.conf) -i_type_family=$(sed '/^i_type_family=/!d; s/.*=//' config.conf) -i_type_size=$(sed '/^i_type_size=/!d; s/.*=//' config.conf) -key_name=$(sed '/^key_name=/!d; s/.*=//' config.conf) -instance_id=$(sed '/^instance_id=/!d; s/.*=//' config.conf) -security_id_aws=$(sed '/^security_id_aws=/!d; s/.*=//' config.conf) -subnet_id_aws=$(sed '/^subnet_id_aws=/!d; s/.*=//' config.conf) -security_id_ali=$(sed '/^security_id_ali=/!d; s/.*=//' config.conf) -region_id_ali=$(sed '/^region_id_ali=/!d; s/.*=//' config.conf) - -whether_retain=$(sed '/^whether_retain=/!d; s/.*=//' config.conf) -whether_launch_new=$(sed '/^whether_launch_new=/!d; s/.*=//' config.conf) - -i_type="$i_type_family.$i_type_size" - -check_input - -if [ ! -f "$key_name.pem" ]; then - echo "[ERROR] Can not find the key pair file $key_name.pem, please put the $key_name.pem file in this folder" - exit 0 -else - chmod 400 ./"$key_name.pem" -fi - -if [ ! -f "./code/benchmark.py" ]; then - echo "[ERROR] Can not find the benchmark file, please put the benchmark file in code folder" - exit 0 -fi - - -if [ $whether_launch_new -eq "1" ] -then - echo "[INFO] Your instance info:" - echo "[INFO] Instance key name: $key_name" - echo "[INFO] Instance count: $count" - echo "[INFO] Instance_type: $i_type" -else - echo "[INFO] The existed instance you choose: $instance_id" -fi - -if [ $whether_launch_new -eq "1" ] -then - if [ $vendor -eq "1" ] - then - create_AWS_instance - elif [ $vendor -eq "2" ] - then - create_Ali_Yun_instance - else - echo "Tencent Cloud" - fi -else - if [ $vendor -eq "1" ] - then - aws ec2 start-instances --instance-ids $instance_id - echo "[INFO] Waiting for instance to Start ..." - echo "[INFO] 15s left ..." - sleep 5s - echo "[INFO] 10s left ..." - sleep 5s - echo "[INFO] 5s left ..." - sleep 5s - elif [ $vendor -eq "2" ] - then - aliyun ecs StartInstance --InstanceId $instance_id - echo "[INFO] Waiting for instance to Start ..." - echo "[INFO] 45s left ..." - sleep 15s - echo "[INFO] 30s left ..." - sleep 15s - echo "[INFO] 15s left ..." - sleep 15s - else - echo "Tencent Cloud" - fi -fi - -if [ $vendor -eq "1" ] -then - connect_AWS -elif [ $vendor -eq "2" ] -then - connect_Ali_Yun -else - echo "Tencent Cloud" -fi - -if [ $vendor -eq "1" ] -then - close_AWS -elif [ $vendor -eq "2" ] -then - close_Ali_Yun -else - echo "Tencent Cloud" -fi - -exit 0 - -} - -main - - - - diff --git a/neural_coder/docs/cloud_autobench/code/config.sh b/neural_coder/docs/cloud_autobench/code/config.sh deleted file mode 100644 index 10e9449a12f..00000000000 --- a/neural_coder/docs/cloud_autobench/code/config.sh +++ /dev/null @@ -1,47 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -x - -echo "[INFO] Start installing software packages and dependencies" - -# install machine packages -sudo apt-get -y update -sudo apt-get install -y wget -sudo apt-get install -y git -sudo apt-get install -y build-essential -sudo apt-get install -y htop aha html2text numactl bc -sudo apt-get install -y ffmpeg libsm6 libxext6 -sudo apt-get install -y automake libtool -sudo apt-get install -y python3 pip - -# install conda -wget https://repo.continuum.io/archive/Anaconda3-5.0.0-Linux-x86_64.sh -O anaconda3.sh -chmod +x anaconda3.sh -sudo ./anaconda3.sh -b -p /home/anaconda3 -export PATH=/home/anaconda3/bin:$PATH -conda create -yn test python=3.9 -source activate test - -# install pip modules -pip install numpy -pip install pyyaml -pip install typing_extensions -pip install psutil -pip install neural_compressor intel_extension_for_pytorch - -# install torch -pip3 install torch torchvision torchaudio -pip3 install torchdynamo -pip3 install transformers diff --git a/neural_coder/docs/cloud_autobench/code/launch.sh b/neural_coder/docs/cloud_autobench/code/launch.sh deleted file mode 100644 index 1521301e1c3..00000000000 --- a/neural_coder/docs/cloud_autobench/code/launch.sh +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -set -x - -export PATH=/home/anaconda3/bin:$PATH -source activate test -echo "[INFO] Start running auto benchmark..." -python -c "from neural_coder import superreport; superreport(code='resnet50.py')" -# Note: you need to uncomment superreport in neural_coder/interface.py and neural_coder/__init__.py to use this API. diff --git a/neural_coder/docs/cloud_autobench/code/resnet50.py b/neural_coder/docs/cloud_autobench/code/resnet50.py deleted file mode 100644 index 13caa61334a..00000000000 --- a/neural_coder/docs/cloud_autobench/code/resnet50.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import torch -import torchvision.models as models - -model = models.resnet50(pretrained=True) -model.eval() -batch_size = 1 -input = torch.rand(batch_size, 3, 224, 224) -with torch.no_grad(): - model(input) diff --git a/neural_coder/docs/cloud_autobench/config.conf b/neural_coder/docs/cloud_autobench/config.conf deleted file mode 100644 index d598178debb..00000000000 --- a/neural_coder/docs/cloud_autobench/config.conf +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# This is an example of providing Cloud configs for cloud benchmark - -# Choose Cloud Vendor -# 1 AWS 2 Ali Yun 3 Tencent Cloud -cloud_vendor=1 - -# Choose Instance Operating System -# 1 Ubuntu 2 Amazon Linux 3 Red Hat 4 SUSE Linux -OS=1 - -# Choose Instance CPU architecture -# 1 x86 2 ARM -arch=1 - -# Number of Instances need to be launched -count=1 - -# Family of instance type -i_type_family=c6i - -# Size of instance type -i_type_size=2xlarge - -# Private key name -key_name=huangyu - -# Instance id (Required if use an existing instance) -instance_id=i-0ecdba84ca1ea5d68 - -# Security Group id AWS (Required) -security_id_aws=sg-00139ed15a90e83e0 - -# Subnet id AWS (Required) -subnet_id_aws=subnet-010cad6a296e44f8b - -# Security Group id Ali Yun (Required) -security_id_ali=sg-m5e61j9zh9hivx3k9iwp - -# RegionId Ali Yun (Required) -region_id_ali=cn-qingdao - -# Whether retain the instance after this task -# 1 retain 2 Not retain -whether_retain=2 - -# Create a new instance or use an existing instance -# 1 Creat new 2 Use an existing one -whether_launch_new=2 diff --git a/neural_coder/docs/cloud_autobench/superbench_report_aws_icx.pdf b/neural_coder/docs/cloud_autobench/superbench_report_aws_icx.pdf deleted file mode 100644 index cdb6d01608c..00000000000 Binary files a/neural_coder/docs/cloud_autobench/superbench_report_aws_icx.pdf and /dev/null differ diff --git a/neural_coder/docs/release_notes/v0.4.md b/neural_coder/docs/release_notes/v0.4.md deleted file mode 100644 index 933c02900a3..00000000000 --- a/neural_coder/docs/release_notes/v0.4.md +++ /dev/null @@ -1,25 +0,0 @@ -v0.4 -===== - -## Highlights -- **Visual Studio Code extension**: We are delighted to announce the release of Neural Coder's [Visual Studio Code extension](https://marketplace.visualstudio.com/items?itemName=IntelNeuralCompressor.neural-coder-ext-vscode). VS Code programmers can enjoy one-click automatic enabling of Deep Learning optimization API and accelerate their Deep Learning models without manual coding. - -- **HuggingFace Transformers**: - - We supported **all** HuggingFace Transformers [examples](https://github.com/huggingface/transformers/tree/main/examples/pytorch) that calls ```Trainer``` class, and validated over **500** models from HuggingFace Transformers [model hub](https://huggingface.co/models). The models are able to be accelerated automatically with Neural Coder with minimum loss of prediction accuracy. - - We enabled the support of [HuggingFace Optimum-Intel](https://huggingface.co/docs/optimum/intel/index). User scripts of HuggingFace Transformers models will by default be optimized with Optimum-Intel API to enjoy performance speed-up brought by INT8 quantization. - - We enabled the support of [Intel® Extension for Transformers](https://github.com/intel/intel-extension-for-transformers), an innovative toolkit to accelerate Transformer-based models on Intel platforms. For more details, please refer to the updated [support matrix](../SupportMatrix.md). - -- **Support of BigDL Nano**: We are delighted to announce the collaboration between Neural Coder and [BigDL Nano](https://bigdl.readthedocs.io/en/latest/doc/Nano/index.html). Users can now one-click enable BigDL Nano optimizations for PyTorch in Neural Coder. For detailed support matrix for BigDL Nano features, please refer to this [guide](../BigDLNanoSupport.md). - -- **Amazon AWS SageMaker**: We provided a user [tutorial](../AWSSageMakerSupport.md) for installing Neural Coder's JupyterLab extension in AWS SageMaker platform. Users are able to one-click install the extension in Amazon AWS SageMaker with Jupyter 3 and enjoy Neural Coder's functionalities. - -- **Python Launcher**: We added the implementation of [Python Launcher](../PythonLauncher.md) usage for Neural Coder, which will be one of the recommended user interfaces in the future as a replacement of Python API. Users can run the Python model code as it is with automatic enabling of Deep Learning optimizations by using Neural Coder's inline Python Launcher design: ```-m neural_coder```. - -- **Device Detection**: We enabled the capability of detecting running device and its ISA automatically and adjusting applied optimization features accordingly. For instance, when running Neural Coder on Intel GPU instead of Intel CPU, the PyTorch Mixed Precision optimization feature will adapt ```xpu``` instead of ```cpu```, and ```torch.half``` instead of ```torch.bfloat16```. - -## Others -- **INT8 Accuracy Evaluation**: We enabled accuracy evaluation for INT8 quantizations in Neural Coder. Users are able to view the accuracy delta for each quantization optimization in Neural Coder's auto-benchmark output log. The calculation is ```acc_delta = (int8_acc - fp32_acc)/(fp32_acc)```. - -- **Auto-quantize TensorFlow/Keras scripts**: We enabled the support of auto-quantizing TensorFlow/Keras script-based models with Intel® Neural Compressor. The default quantization scheme will be applied. For more details, please refer to the updated [support matrix](../SupportMatrix.md). - -- **Auto-quantize ONNX Runtime scripts**: We enabled the support of auto-quantizing ONNX Runtime script-based models with Intel® Neural Compressor. We support [dynamic quantization](https://github.com/intel/neural-compressor/tree/master/examples/onnxrt#dynamic-quantization), static quantization ([QDQ](https://github.com/intel/neural-compressor/tree/master/examples/onnxrt#tensor-oriented-qdq-format)), and static quantization ([QLinearOps](https://github.com/intel/neural-compressor/tree/master/examples/onnxrt#operator-oriented-with-qlinearops)). For more details, please refer to the updated [support matrix](../SupportMatrix.md). diff --git a/neural_coder/examples/keras/mnist.py b/neural_coder/examples/keras/mnist.py deleted file mode 100644 index 22ba9d66876..00000000000 --- a/neural_coder/examples/keras/mnist.py +++ /dev/null @@ -1,97 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import tensorflow as tf -import numpy as np -from tensorflow import keras -from tensorflow.keras import layers -import time -from torch.utils.data import DataLoader - -num_classes = 10 - -def build_dataset(): - # Load the data and split it between train and test sets - (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data() - - # Scale images to the [0, 1] range - x_train = x_train.astype("float32") / 255 - x_test = x_test.astype("float32") / 255 - # Make sure images have shape (28, 28, 1) - x_train = np.expand_dims(x_train, -1) - x_test = np.expand_dims(x_test, -1) - - # convert class vectors to binary class matrices - y_train = keras.utils.to_categorical(y_train, num_classes) - y_test = keras.utils.to_categorical(y_test, num_classes) - return x_train, y_train, x_test, y_test - -class Dataset(): - def __init__(self, ): - _, _ , self.inputs, self.labels = build_dataset() - - def __getitem__(self, idx): - return self.inputs[idx], self.labels[idx] - - def __len__(self): - assert len(self.inputs) == len(self.labels), 'inputs should have equal len with labels' - return len(self.inputs) - -def build_model(x_train, y_train, x_test, y_test): - if os.path.exists('fp32_model'): - model = keras.models.load_model('fp32_model') - return model - # Model / data parameters - input_shape = (28, 28, 1) - model = keras.Sequential( - [ - keras.Input(shape=input_shape), - layers.Conv2D(32, kernel_size=(3, 3), activation="relu"), - layers.MaxPooling2D(pool_size=(2, 2)), - layers.Conv2D(64, kernel_size=(3, 3), activation="relu"), - layers.MaxPooling2D(pool_size=(2, 2)), - layers.Flatten(), - layers.Dropout(0.5), - layers.Dense(num_classes, activation="softmax"), - ] - ) - - batch_size = 128 - epochs = 1 - - model.compile(loss="categorical_crossentropy", optimizer="adam", - metrics=["accuracy"], run_eagerly=True) - model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.1) - model.summary() - if not os.path.exists('fp32_model'): - model.save('fp32_model') - return model - -def eval_func(model): - x_train, y_train, x_test, y_test = build_dataset() - model.compile(metrics=["accuracy"], run_eagerly=False) - score = model.evaluate(x_test, y_test) - return score[1] - -def main(): - x_train, y_train, x_test, y_test = build_dataset() - model = build_model(x_train, y_train, x_test, y_test) - calib_dataloader = DataLoader(Dataset(), batch_size=10) - -if __name__ == '__main__': - main() diff --git a/neural_coder/examples/nano/resnet18.py b/neural_coder/examples/nano/resnet18.py deleted file mode 100644 index 8d189bf75b2..00000000000 --- a/neural_coder/examples/nano/resnet18.py +++ /dev/null @@ -1,26 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import torch -from torchvision.models import resnet18 - -if __name__ == "__main__": - - model_ft = resnet18(pretrained=True) - - x = torch.rand(2, 3, 224, 224) - y_hat = model_ft(x) - predictions = y_hat.argmax(dim=1) - print(predictions) diff --git a/neural_coder/examples/nlp/distilbert.py b/neural_coder/examples/nlp/distilbert.py deleted file mode 100644 index eab5513a51a..00000000000 --- a/neural_coder/examples/nlp/distilbert.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -from transformers import ( - AutoModelForSequenceClassification, - AutoTokenizer -) - -finetuned_model = "distilbert-base-uncased-finetuned-sst-2-english" - - -class MyDataLoader(object): - def __init__(self): - self.tokenizer = AutoTokenizer.from_pretrained(finetuned_model) - self.sequence = "Shanghai is a beautiful city!" - self.encoded_input = self.tokenizer( - self.sequence, - return_tensors='pt' - ) - self.label = 1 # negative sentence: 0; positive sentence: 1 - self.batch_size = 1 - - def __iter__(self): - yield self.encoded_input, self.label - - -my_nlp_model = AutoModelForSequenceClassification.from_pretrained( - finetuned_model, -) - -my_nlp_dataloader = MyDataLoader() - -output = my_nlp_model(**my_nlp_dataloader.encoded_input) diff --git a/neural_coder/examples/nlp/run_glue.py b/neural_coder/examples/nlp/run_glue.py deleted file mode 100644 index f3a8ccfd75c..00000000000 --- a/neural_coder/examples/nlp/run_glue.py +++ /dev/null @@ -1,617 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# code source -# https://github.com/huggingface/transformers/blob/v4.21-release/examples/pytorch/text-classification/run_glue.py - -import logging -import os -import random -import sys -from dataclasses import dataclass, field -from typing import Optional - -import datasets -import numpy as np -from datasets import load_dataset, load_metric - -import transformers -from transformers import ( - AutoConfig, - AutoModelForSequenceClassification, - AutoTokenizer, - DataCollatorWithPadding, - EvalPrediction, - HfArgumentParser, - PretrainedConfig, - Trainer, - TrainingArguments, - default_data_collator, - set_seed, -) -from transformers.trainer_utils import get_last_checkpoint -from transformers.utils import check_min_version, send_example_telemetry -from transformers.utils.versions import require_version - - -# Will error if the minimal version of Transformers is not installed. Remove at your own risks. -check_min_version("4.21.0") - -require_version("datasets>=1.8.0", "To fix: pip install -r examples/pytorch/text-classification/requirements.txt") - -task_to_keys = { - "cola": ("sentence", None), - "mnli": ("premise", "hypothesis"), - "mrpc": ("sentence1", "sentence2"), - "qnli": ("question", "sentence"), - "qqp": ("question1", "question2"), - "rte": ("sentence1", "sentence2"), - "sst2": ("sentence", None), - "stsb": ("sentence1", "sentence2"), - "wnli": ("sentence1", "sentence2"), -} - -logger = logging.getLogger(__name__) - - -@dataclass -class DataTrainingArguments: - """ - Arguments pertaining to what data we are going to input our model for training and eval. - - Using `HfArgumentParser` we can turn this class - into argparse arguments to be able to specify them on - the command line. - """ - - task_name: Optional[str] = field( - default=None, - metadata={"help": "The name of the task to train on: " + ", ".join(task_to_keys.keys())}, - ) - dataset_name: Optional[str] = field( - default=None, metadata={"help": "The name of the dataset to use (via the datasets library)."} - ) - dataset_config_name: Optional[str] = field( - default=None, metadata={"help": "The configuration name of the dataset to use (via the datasets library)."} - ) - max_seq_length: int = field( - default=128, - metadata={ - "help": ( - "The maximum total input sequence length after tokenization. Sequences longer " - "than this will be truncated, sequences shorter will be padded." - ) - }, - ) - overwrite_cache: bool = field( - default=False, metadata={"help": "Overwrite the cached preprocessed datasets or not."} - ) - pad_to_max_length: bool = field( - default=True, - metadata={ - "help": ( - "Whether to pad all samples to `max_seq_length`. " - "If False, will pad the samples dynamically when batching to the maximum length in the batch." - ) - }, - ) - max_train_samples: Optional[int] = field( - default=None, - metadata={ - "help": ( - "For debugging purposes or quicker training, truncate the number of training examples to this " - "value if set." - ) - }, - ) - max_eval_samples: Optional[int] = field( - default=None, - metadata={ - "help": ( - "For debugging purposes or quicker training, truncate the number of evaluation examples to this " - "value if set." - ) - }, - ) - max_predict_samples: Optional[int] = field( - default=None, - metadata={ - "help": ( - "For debugging purposes or quicker training, truncate the number of prediction examples to this " - "value if set." - ) - }, - ) - train_file: Optional[str] = field( - default=None, metadata={"help": "A csv or a json file containing the training data."} - ) - validation_file: Optional[str] = field( - default=None, metadata={"help": "A csv or a json file containing the validation data."} - ) - test_file: Optional[str] = field(default=None, metadata={"help": "A csv or a json file containing the test data."}) - - def __post_init__(self): - if self.task_name is not None: - self.task_name = self.task_name.lower() - if self.task_name not in task_to_keys.keys(): - raise ValueError("Unknown task, you should pick one in " + ",".join(task_to_keys.keys())) - elif self.dataset_name is not None: - pass - elif self.train_file is None or self.validation_file is None: - raise ValueError("Need either a GLUE task, a training/validation file or a dataset name.") - else: - train_extension = self.train_file.split(".")[-1] - assert train_extension in ["csv", "json"], "`train_file` should be a csv or a json file." - validation_extension = self.validation_file.split(".")[-1] - assert ( - validation_extension == train_extension - ), "`validation_file` should have the same extension (csv or json) as `train_file`." - - -@dataclass -class ModelArguments: - """ - Arguments pertaining to which model/config/tokenizer we are going to fine-tune from. - """ - - model_name_or_path: str = field( - metadata={"help": "Path to pretrained model or model identifier from huggingface.co/models"} - ) - config_name: Optional[str] = field( - default=None, metadata={"help": "Pretrained config name or path if not the same as model_name"} - ) - tokenizer_name: Optional[str] = field( - default=None, metadata={"help": "Pretrained tokenizer name or path if not the same as model_name"} - ) - cache_dir: Optional[str] = field( - default=None, - metadata={"help": "Where do you want to store the pretrained models downloaded from huggingface.co"}, - ) - use_fast_tokenizer: bool = field( - default=True, - metadata={"help": "Whether to use one of the fast tokenizer (backed by the tokenizers library) or not."}, - ) - model_revision: str = field( - default="main", - metadata={"help": "The specific model version to use (can be a branch name, tag name or commit id)."}, - ) - use_auth_token: bool = field( - default=False, - metadata={ - "help": ( - "Will use the token generated when running `transformers-cli login` (necessary to use this script " - "with private models)." - ) - }, - ) - ignore_mismatched_sizes: bool = field( - default=False, - metadata={"help": "Will enable to load a pretrained model whose head dimensions are different."}, - ) - - -def main(): - # See all possible arguments in src/transformers/training_args.py - # or by passing the --help flag to this script. - # We now keep distinct sets of args, for a cleaner separation of concerns. - - parser = HfArgumentParser((ModelArguments, DataTrainingArguments, TrainingArguments)) - if len(sys.argv) == 2 and sys.argv[1].endswith(".json"): - # If we pass only one argument to the script and it's the path to a json file, - # let's parse it to get our arguments. - model_args, data_args, training_args = parser.parse_json_file(json_file=os.path.abspath(sys.argv[1])) - else: - model_args, data_args, training_args = parser.parse_args_into_dataclasses() - - # Sending telemetry. Tracking the example usage helps us better allocate resources to maintain them. The - # information sent is the one passed as arguments along with your Python/PyTorch versions. - send_example_telemetry("run_glue", model_args, data_args) - - # Setup logging - logging.basicConfig( - format="%(asctime)s - %(levelname)s - %(name)s - %(message)s", - datefmt="%m/%d/%Y %H:%M:%S", - handlers=[logging.StreamHandler(sys.stdout)], - ) - - log_level = training_args.get_process_log_level() - logger.setLevel(log_level) - datasets.utils.logging.set_verbosity(log_level) - transformers.utils.logging.set_verbosity(log_level) - transformers.utils.logging.enable_default_handler() - transformers.utils.logging.enable_explicit_format() - - # Log on each process the small summary: - logger.warning( - f"Process rank: {training_args.local_rank}, device: {training_args.device}, n_gpu: {training_args.n_gpu}" - + f"distributed training: {bool(training_args.local_rank != -1)}, 16-bits training: {training_args.fp16}" - ) - logger.info(f"Training/evaluation parameters {training_args}") - - # Detecting last checkpoint. - last_checkpoint = None - if os.path.isdir(training_args.output_dir) and training_args.do_train and not training_args.overwrite_output_dir: - last_checkpoint = get_last_checkpoint(training_args.output_dir) - if last_checkpoint is None and len(os.listdir(training_args.output_dir)) > 0: - raise ValueError( - f"Output directory ({training_args.output_dir}) already exists and is not empty. " - "Use --overwrite_output_dir to overcome." - ) - elif last_checkpoint is not None and training_args.resume_from_checkpoint is None: - logger.info( - f"Checkpoint detected, resuming training at {last_checkpoint}. To avoid this behavior, change " - "the `--output_dir` or add `--overwrite_output_dir` to train from scratch." - ) - - # Set seed before initializing model. - set_seed(training_args.seed) - - # Get the datasets: you can either provide your own CSV/JSON training and evaluation files (see below) - # or specify a GLUE benchmark task (the dataset will be downloaded automatically from the datasets Hub). - # - # For CSV/JSON files, this script will use as labels the column called 'label' and as pair of sentences the - # sentences in columns called 'sentence1' and 'sentence2' if such column exists or the first two columns not named - # label if at least two columns are provided. - # - # If the CSVs/JSONs contain only one non-label column, the script does single sentence classification on this - # single column. You can easily tweak this behavior (see below) - # - # In distributed training, the load_dataset function guarantee that only one local process can concurrently - # download the dataset. - if data_args.task_name is not None: - # Downloading and loading a dataset from the hub. - raw_datasets = load_dataset( - "glue", - data_args.task_name, - cache_dir=model_args.cache_dir, - use_auth_token=True if model_args.use_auth_token else None, - ) - elif data_args.dataset_name is not None: - # Downloading and loading a dataset from the hub. - raw_datasets = load_dataset( - data_args.dataset_name, - data_args.dataset_config_name, - cache_dir=model_args.cache_dir, - use_auth_token=True if model_args.use_auth_token else None, - ) - else: - # Loading a dataset from your local files. - # CSV/JSON training and evaluation files are needed. - data_files = {"train": data_args.train_file, "validation": data_args.validation_file} - - # Get the test dataset: you can provide your own CSV/JSON test file (see below) - # when you use `do_predict` without specifying a GLUE benchmark task. - if training_args.do_predict: - if data_args.test_file is not None: - train_extension = data_args.train_file.split(".")[-1] - test_extension = data_args.test_file.split(".")[-1] - assert ( - test_extension == train_extension - ), "`test_file` should have the same extension (csv or json) as `train_file`." - data_files["test"] = data_args.test_file - else: - raise ValueError("Need either a GLUE task or a test file for `do_predict`.") - - for key in data_files.keys(): - logger.info(f"load a local file for {key}: {data_files[key]}") - - if data_args.train_file.endswith(".csv"): - # Loading a dataset from local csv files - raw_datasets = load_dataset( - "csv", - data_files=data_files, - cache_dir=model_args.cache_dir, - use_auth_token=True if model_args.use_auth_token else None, - ) - else: - # Loading a dataset from local json files - raw_datasets = load_dataset( - "json", - data_files=data_files, - cache_dir=model_args.cache_dir, - use_auth_token=True if model_args.use_auth_token else None, - ) - # See more about loading any type of standard or custom dataset at - # https://huggingface.co/docs/datasets/loading_datasets.html. - - # Labels - if data_args.task_name is not None: - is_regression = data_args.task_name == "stsb" - if not is_regression: - label_list = raw_datasets["train"].features["label"].names - num_labels = len(label_list) - else: - num_labels = 1 - else: - # Trying to have good defaults here, don't hesitate to tweak to your needs. - is_regression = raw_datasets["train"].features["label"].dtype in ["float32", "float64"] - if is_regression: - num_labels = 1 - else: - # A useful fast method: - # https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.unique - label_list = raw_datasets["train"].unique("label") - label_list.sort() # Let's sort it for determinism - num_labels = len(label_list) - - # Load pretrained model and tokenizer - # - # In distributed training, the .from_pretrained methods guarantee that only one local process can concurrently - # download model & vocab. - config = AutoConfig.from_pretrained( - model_args.config_name if model_args.config_name else model_args.model_name_or_path, - num_labels=num_labels, - finetuning_task=data_args.task_name, - cache_dir=model_args.cache_dir, - revision=model_args.model_revision, - use_auth_token=True if model_args.use_auth_token else None, - ) - tokenizer = AutoTokenizer.from_pretrained( - model_args.tokenizer_name if model_args.tokenizer_name else model_args.model_name_or_path, - cache_dir=model_args.cache_dir, - use_fast=model_args.use_fast_tokenizer, - revision=model_args.model_revision, - use_auth_token=True if model_args.use_auth_token else None, - ) - model = AutoModelForSequenceClassification.from_pretrained( - model_args.model_name_or_path, - from_tf=bool(".ckpt" in model_args.model_name_or_path), - config=config, - cache_dir=model_args.cache_dir, - revision=model_args.model_revision, - use_auth_token=True if model_args.use_auth_token else None, - ignore_mismatched_sizes=model_args.ignore_mismatched_sizes, - ) - - # Preprocessing the raw_datasets - if data_args.task_name is not None: - sentence1_key, sentence2_key = task_to_keys[data_args.task_name] - else: - # Again, we try to have some nice defaults but don't hesitate to tweak to your use case. - non_label_column_names = [name for name in raw_datasets["train"].column_names if name != "label"] - if "sentence1" in non_label_column_names and "sentence2" in non_label_column_names: - sentence1_key, sentence2_key = "sentence1", "sentence2" - else: - if len(non_label_column_names) >= 2: - sentence1_key, sentence2_key = non_label_column_names[:2] - else: - sentence1_key, sentence2_key = non_label_column_names[0], None - - # Padding strategy - if data_args.pad_to_max_length: - padding = "max_length" - else: - # We will pad later, dynamically at batch creation, to the max sequence length in each batch - padding = False - - # Some models have set the order of the labels to use, so let's make sure we do use it. - label_to_id = None - if ( - model.config.label2id != PretrainedConfig(num_labels=num_labels).label2id - and data_args.task_name is not None - and not is_regression - ): - # Some have all caps in their config, some don't. - label_name_to_id = {k.lower(): v for k, v in model.config.label2id.items()} - if list(sorted(label_name_to_id.keys())) == list(sorted(label_list)): - label_to_id = {i: int(label_name_to_id[label_list[i]]) for i in range(num_labels)} - else: - logger.warning( - "Your model seems to have been trained with labels, but they don't match the dataset: ", - f"model labels: {list(sorted(label_name_to_id.keys()))}, dataset labels: {list(sorted(label_list))}." - "\nIgnoring the model labels as a result.", - ) - elif data_args.task_name is None and not is_regression: - label_to_id = {v: i for i, v in enumerate(label_list)} - - if label_to_id is not None: - model.config.label2id = label_to_id - model.config.id2label = {id: label for label, id in config.label2id.items()} - elif data_args.task_name is not None and not is_regression: - model.config.label2id = {l: i for i, l in enumerate(label_list)} - model.config.id2label = {id: label for label, id in config.label2id.items()} - - if data_args.max_seq_length > tokenizer.model_max_length: - logger.warning( - f"The max_seq_length passed ({data_args.max_seq_length}) is larger than the maximum length for the" - f"model ({tokenizer.model_max_length}). Using max_seq_length={tokenizer.model_max_length}." - ) - max_seq_length = min(data_args.max_seq_length, tokenizer.model_max_length) - - def preprocess_function(examples): - # Tokenize the texts - args = ( - (examples[sentence1_key],) if sentence2_key is None else (examples[sentence1_key], examples[sentence2_key]) - ) - result = tokenizer(*args, padding=padding, max_length=max_seq_length, truncation=True) - - # Map labels to IDs (not necessary for GLUE tasks) - if label_to_id is not None and "label" in examples: - result["label"] = [(label_to_id[l] if l != -1 else -1) for l in examples["label"]] - return result - - with training_args.main_process_first(desc="dataset map pre-processing"): - raw_datasets = raw_datasets.map( - preprocess_function, - batched=True, - load_from_cache_file=not data_args.overwrite_cache, - desc="Running tokenizer on dataset", - ) - if training_args.do_train: - if "train" not in raw_datasets: - raise ValueError("--do_train requires a train dataset") - train_dataset = raw_datasets["train"] - if data_args.max_train_samples is not None: - max_train_samples = min(len(train_dataset), data_args.max_train_samples) - train_dataset = train_dataset.select(range(max_train_samples)) - - if training_args.do_eval: - if "validation" not in raw_datasets and "validation_matched" not in raw_datasets: - raise ValueError("--do_eval requires a validation dataset") - eval_dataset = raw_datasets["validation_matched" if data_args.task_name == "mnli" else "validation"] - if data_args.max_eval_samples is not None: - max_eval_samples = min(len(eval_dataset), data_args.max_eval_samples) - eval_dataset = eval_dataset.select(range(max_eval_samples)) - - if training_args.do_predict or data_args.task_name is not None or data_args.test_file is not None: - if "test" not in raw_datasets and "test_matched" not in raw_datasets: - raise ValueError("--do_predict requires a test dataset") - predict_dataset = raw_datasets["test_matched" if data_args.task_name == "mnli" else "test"] - if data_args.max_predict_samples is not None: - max_predict_samples = min(len(predict_dataset), data_args.max_predict_samples) - predict_dataset = predict_dataset.select(range(max_predict_samples)) - - # Log a few random samples from the training set: - if training_args.do_train: - for index in random.sample(range(len(train_dataset)), 3): - logger.info(f"Sample {index} of the training set: {train_dataset[index]}.") - - # Get the metric function - if data_args.task_name is not None: - metric = load_metric("glue", data_args.task_name) - else: - metric = load_metric("accuracy") - - # You can define your custom compute_metrics function. It takes an `EvalPrediction` object (a namedtuple with a - # predictions and label_ids field) and has to return a dictionary string to float. - def compute_metrics(p: EvalPrediction): - preds = p.predictions[0] if isinstance(p.predictions, tuple) else p.predictions - preds = np.squeeze(preds) if is_regression else np.argmax(preds, axis=1) - if data_args.task_name is not None: - result = metric.compute(predictions=preds, references=p.label_ids) - if len(result) > 1: - result["combined_score"] = np.mean(list(result.values())).item() - return result - elif is_regression: - return {"mse": ((preds - p.label_ids) ** 2).mean().item()} - else: - return {"accuracy": (preds == p.label_ids).astype(np.float32).mean().item()} - - # Data collator will default to DataCollatorWithPadding when the tokenizer is passed to Trainer, so we change it if - # we already did the padding. - if data_args.pad_to_max_length: - data_collator = default_data_collator - elif training_args.fp16: - data_collator = DataCollatorWithPadding(tokenizer, pad_to_multiple_of=8) - else: - data_collator = None - - # Initialize our Trainer - trainer = Trainer( - model=model, - args=training_args, - train_dataset=train_dataset if training_args.do_train else None, - eval_dataset=eval_dataset if training_args.do_eval else None, - compute_metrics=compute_metrics, - tokenizer=tokenizer, - data_collator=data_collator, - ) - - # Training - if training_args.do_train: - checkpoint = None - if training_args.resume_from_checkpoint is not None: - checkpoint = training_args.resume_from_checkpoint - elif last_checkpoint is not None: - checkpoint = last_checkpoint - train_result = trainer.train(resume_from_checkpoint=checkpoint) - metrics = train_result.metrics - max_train_samples = ( - data_args.max_train_samples if data_args.max_train_samples is not None else len(train_dataset) - ) - metrics["train_samples"] = min(max_train_samples, len(train_dataset)) - - trainer.save_model() # Saves the tokenizer too for easy upload - - trainer.log_metrics("train", metrics) - trainer.save_metrics("train", metrics) - trainer.save_state() - - # Evaluation - if training_args.do_eval: - logger.info("*** Evaluate ***") - - # Loop to handle MNLI double evaluation (matched, mis-matched) - tasks = [data_args.task_name] - eval_datasets = [eval_dataset] - if data_args.task_name == "mnli": - tasks.append("mnli-mm") - eval_datasets.append(raw_datasets["validation_mismatched"]) - combined = {} - - for eval_dataset, task in zip(eval_datasets, tasks): - metrics = trainer.evaluate(eval_dataset=eval_dataset) - - max_eval_samples = ( - data_args.max_eval_samples if data_args.max_eval_samples is not None else len(eval_dataset) - ) - metrics["eval_samples"] = min(max_eval_samples, len(eval_dataset)) - - if task == "mnli-mm": - metrics = {k + "_mm": v for k, v in metrics.items()} - if task is not None and "mnli" in task: - combined.update(metrics) - - trainer.log_metrics("eval", metrics) - trainer.save_metrics("eval", combined if task is not None and "mnli" in task else metrics) - - if training_args.do_predict: - logger.info("*** Predict ***") - - # Loop to handle MNLI double evaluation (matched, mis-matched) - tasks = [data_args.task_name] - predict_datasets = [predict_dataset] - if data_args.task_name == "mnli": - tasks.append("mnli-mm") - predict_datasets.append(raw_datasets["test_mismatched"]) - - for predict_dataset, task in zip(predict_datasets, tasks): - # Removing the `label` columns because it contains -1 and Trainer won't like that. - predict_dataset = predict_dataset.remove_columns("label") - predictions = trainer.predict(predict_dataset, metric_key_prefix="predict").predictions - predictions = np.squeeze(predictions) if is_regression else np.argmax(predictions, axis=1) - - output_predict_file = os.path.join(training_args.output_dir, f"predict_results_{task}.txt") - if trainer.is_world_process_zero(): - with open(output_predict_file, "w") as writer: - logger.info(f"***** Predict results {task} *****") - writer.write("index\tprediction\n") - for index, item in enumerate(predictions): - if is_regression: - writer.write(f"{index}\t{item:3.3f}\n") - else: - item = label_list[item] - writer.write(f"{index}\t{item}\n") - - kwargs = {"finetuned_from": model_args.model_name_or_path, "tasks": "text-classification"} - if data_args.task_name is not None: - kwargs["language"] = "en" - kwargs["dataset_tags"] = "glue" - kwargs["dataset_args"] = data_args.task_name - kwargs["dataset"] = f"GLUE {data_args.task_name.upper()}" - - if training_args.push_to_hub: - trainer.push_to_hub(**kwargs) - else: - trainer.create_model_card(**kwargs) - - -def _mp_fn(index): - # For xla_spawn (TPUs) - main() - - -if __name__ == "__main__": - main() diff --git a/neural_coder/examples/onnx/onnx_model.py b/neural_coder/examples/onnx/onnx_model.py deleted file mode 100644 index 8e2c7b2d928..00000000000 --- a/neural_coder/examples/onnx/onnx_model.py +++ /dev/null @@ -1,211 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import logging -import argparse - -import onnx -import yaml - -from pycocotools.coco import COCO -from pycocotools.mask import iou, encode -import numpy as np -from torchvision import transforms -from PIL import Image -from onnx import numpy_helper -import os -import onnxruntime - -logger = logging.getLogger(__name__) -logging.basicConfig(format = '%(asctime)s - %(levelname)s - %(name)s - %(message)s', - datefmt = '%m/%d/%Y %H:%M:%S', - level = logging.WARN) -logger.info("Evaluating ONNXRuntime full precision accuracy and performance:") -parser = argparse.ArgumentParser( - formatter_class=argparse.ArgumentDefaultsHelpFormatter -) -parser.add_argument( - '--model_path', - type=str, - help="Pre-trained model on onnx file" -) -parser.add_argument( - '--label_path', - type=str, - help="Annotation file path" -) -parser.add_argument( - '--data_path', - type=str, - help="Path to val2017 of COCO" -) -parser.add_argument( - '--benchmark', - action='store_true', \ - default=False -) -parser.add_argument( - '--tune', - action='store_true', \ - default=False, - help="whether quantize the model" -) -parser.add_argument( - '--config', - type=str, - help="config yaml path" -) -parser.add_argument( - '--output_model', - type=str, - help="output model path" -) -parser.add_argument( - '--mode', - type=str, - help="benchmark mode of performance or accuracy" -) -args = parser.parse_args() - -# key = COCO id, value = Pascal VOC id -COCO_TO_VOC = { - 1: 15, # person - 2: 2, # bicycle - 3: 7, # car - 4: 14, # motorbike - 5: 1, # airplane - 6: 6, # bus - 7: 19, # train - 9: 4, # boat - 16: 3, # bird - 17: 8, # cat - 18: 12, # dog - 19: 13, # horse - 20: 17, # sheep - 21: 10, # cow - 44: 5, # bottle - 62: 9, # chair - 63: 18, # couch/sofa - 64: 16, # potted plant - 67: 11, # dining table - 72: 20, # tv -} -VOC_CAT_IDS = list(COCO_TO_VOC.keys()) -cocoGt = COCO(str(args.label_path)) - -preprocess = transforms.Compose([ - transforms.ToTensor(), - transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), -]) - -class Dataset: - def __init__(self): - imgIds = self.getImgIdsUnion(cocoGt, VOC_CAT_IDS) - self.data = [] - for imgId in imgIds: - img_path = os.path.join(args.data_path, cocoGt.imgs[imgId]['file_name']) - if os.path.exists(img_path): - input_tensor = self.load_image(img_path) - - _, height, width = input_tensor.shape - output_tensor = np.zeros((21, height, width), dtype=np.uint8) - - annIds = cocoGt.getAnnIds(imgId, VOC_CAT_IDS) - for ann in cocoGt.loadAnns(annIds): - mask = cocoGt.annToMask(ann) - output_tensor[COCO_TO_VOC[ann['category_id']]] |= mask - - # Set everything not labeled to be background - output_tensor[0] = 1 - np.max(output_tensor, axis=0) - self.data.append((input_tensor, output_tensor)) - - def __len__(self): - return len(self.data) - - def __getitem__(self, index): - return self.data[index] - - def getImgIdsUnion(self, gt, catIds): - """ - Returns all the images that have *any* of the categories in `catIds`, - unlike the built-in `gt.getImgIds` which returns all the images containing - *all* of the categories in `catIds`. - """ - imgIds = set() - for catId in catIds: - imgIds |= set(gt.catToImgs[catId]) - return list(imgIds) - - def load_image(self, img_path): - input_image = Image.open(img_path).convert('RGB') - input_tensor = preprocess(input_image) - input_tensor = input_tensor.detach().cpu().numpy() - return input_tensor - -def iou(model_tensor, target_tensor): - # Don't include the background when summing - model_tensor = model_tensor[:, 1:, :, :] - target_tensor = target_tensor[:, 1:, :, :] - - intersection = np.sum(np.logical_and(model_tensor, target_tensor)) - union = np.sum(np.logical_or(model_tensor, target_tensor)) - - if union == 0: - # Can only happen if nothing was there and nothing was predicted, - # which is a perfect score - return 1 - else: - return intersection / union - -def evaluate(model, dataloader): - totalIoU = 0 - sess = onnxruntime.InferenceSession(model.SerializeToString(), None) - idx = 1 - for input_tensor, target_tensor in dataloader: - input_tensor = input_tensor[np.newaxis, ...] - target_tensor = target_tensor[np.newaxis, ...] - model_tensor = sess.run(["out"], {"input": input_tensor})[0] - - batch_size, nclasses, height, width = model_tensor.shape - raw_labels = np.argmax(model_tensor, axis=1).astype(np.uint8) - - output_tensor = np.zeros((nclasses, batch_size, height, width), dtype=np.uint8) - for c in range(nclasses): - output_tensor[c][raw_labels==c] = 1 - - output_tensor = np.transpose(output_tensor, [1, 0, 2, 3]) - totalIoU += iou(output_tensor, target_tensor) - idx += 1 - return totalIoU / idx - -if __name__ == "__main__": - from neural_compressor.experimental import common - ds = Dataset() - dataloader = common.DataLoader(ds) - model = onnx.load(args.model_path) - def eval(model): - return evaluate(model, ds) - - if args.benchmark and args.mode == "accuracy": - results = eval(model) - print("Batch size = 1") - print("Accuracy: %.5f" % results) - - if args.benchmark and args.mode == "performance": - from neural_compressor.experimental import Benchmark, common - evaluator = Benchmark(args.config) - evaluator.model = common.Model(model) - evaluator.b_dataloader = common.DataLoader(ds) - evaluator(args.mode) diff --git a/neural_coder/examples/vision/alexnet.py b/neural_coder/examples/vision/alexnet.py deleted file mode 100644 index 10ac6d8b080..00000000000 --- a/neural_coder/examples/vision/alexnet.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import torch -import torchvision.models as models -model = models.alexnet(pretrained=True) -model.eval() -batch_size = 1 -input = torch.rand(batch_size, 3, 224, 224) -with torch.no_grad(): - model(input) diff --git a/neural_coder/examples/vision/main.py b/neural_coder/examples/vision/main.py deleted file mode 100644 index 3b9bfd65298..00000000000 --- a/neural_coder/examples/vision/main.py +++ /dev/null @@ -1,504 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# code source -# https://github.com/pytorch/examples/blob/main/imagenet/main.py - -import argparse -import os -import random -import shutil -import time -import warnings -from enum import Enum - -import torch -import torch.nn as nn -import torch.nn.parallel -import torch.backends.cudnn as cudnn -import torch.distributed as dist -import torch.optim -from torch.optim.lr_scheduler import StepLR -import torch.multiprocessing as mp -import torch.utils.data -import torch.utils.data.distributed -import torchvision.transforms as transforms -import torchvision.datasets as datasets -import torchvision.models as models -from torch.utils.data import Subset - -model_names = models.list_models(module=models) - -parser = argparse.ArgumentParser(description='PyTorch ImageNet Training') -parser.add_argument('data', metavar='DIR', nargs='?', default='imagenet', - help='path to dataset (default: imagenet)') -parser.add_argument('-a', '--arch', metavar='ARCH', default='resnet18', - choices=model_names, - help='model architecture: ' + - ' | '.join(model_names) + - ' (default: resnet18)') -parser.add_argument('-j', '--workers', default=4, type=int, metavar='N', - help='number of data loading workers (default: 4)') -parser.add_argument('--epochs', default=90, type=int, metavar='N', - help='number of total epochs to run') -parser.add_argument('--start-epoch', default=0, type=int, metavar='N', - help='manual epoch number (useful on restarts)') -parser.add_argument('-b', '--batch-size', default=256, type=int, - metavar='N', - help='mini-batch size (default: 256), this is the total ' - 'batch size of all GPUs on the current node when ' - 'using Data Parallel or Distributed Data Parallel') -parser.add_argument('--lr', '--learning-rate', default=0.1, type=float, - metavar='LR', help='initial learning rate', dest='lr') -parser.add_argument('--momentum', default=0.9, type=float, metavar='M', - help='momentum') -parser.add_argument('--wd', '--weight-decay', default=1e-4, type=float, - metavar='W', help='weight decay (default: 1e-4)', - dest='weight_decay') -parser.add_argument('-p', '--print-freq', default=10, type=int, - metavar='N', help='print frequency (default: 10)') -parser.add_argument('--resume', default='', type=str, metavar='PATH', - help='path to latest checkpoint (default: none)') -parser.add_argument('-e', '--evaluate', dest='evaluate', action='store_true', - help='evaluate model on validation set') -parser.add_argument('--pretrained', dest='pretrained', action='store_true', - help='use pre-trained model') -parser.add_argument('--world-size', default=-1, type=int, - help='number of nodes for distributed training') -parser.add_argument('--rank', default=-1, type=int, - help='node rank for distributed training') -parser.add_argument('--dist-url', default='tcp://224.66.41.62:23456', type=str, - help='url used to set up distributed training') -parser.add_argument('--dist-backend', default='nccl', type=str, - help='distributed backend') -parser.add_argument('--seed', default=None, type=int, - help='seed for initializing training. ') -parser.add_argument('--gpu', default=None, type=int, - help='GPU id to use.') -parser.add_argument('--multiprocessing-distributed', action='store_true', - help='Use multi-processing distributed training to launch ' - 'N processes per node, which has N GPUs. This is the ' - 'fastest way to use PyTorch for either single node or ' - 'multi node data parallel training') -parser.add_argument('--dummy', action='store_true', help="use fake data to benchmark") - -best_acc1 = 0 - - -def main(): - args = parser.parse_args() - - if args.seed is not None: - random.seed(args.seed) - torch.manual_seed(args.seed) - cudnn.deterministic = True - warnings.warn('You have chosen to seed training. ' - 'This will turn on the CUDNN deterministic setting, ' - 'which can slow down your training considerably! ' - 'You may see unexpected behavior when restarting ' - 'from checkpoints.') - - if args.gpu is not None: - warnings.warn('You have chosen a specific GPU. This will completely ' - 'disable data parallelism.') - - if args.dist_url == "env://" and args.world_size == -1: - args.world_size = int(os.environ["WORLD_SIZE"]) - - args.distributed = args.world_size > 1 or args.multiprocessing_distributed - - ngpus_per_node = torch.cuda.device_count() - if args.multiprocessing_distributed: - # Since we have ngpus_per_node processes per node, the total world_size - # needs to be adjusted accordingly - args.world_size = ngpus_per_node * args.world_size - # Use torch.multiprocessing.spawn to launch distributed processes: the - # main_worker process function - mp.spawn(main_worker, nprocs=ngpus_per_node, args=(ngpus_per_node, args)) - else: - # Simply call main_worker function - main_worker(args.gpu, ngpus_per_node, args) - - -def main_worker(gpu, ngpus_per_node, args): - global best_acc1 - args.gpu = gpu - - if args.gpu is not None: - print("Use GPU: {} for training".format(args.gpu)) - - if args.distributed: - if args.dist_url == "env://" and args.rank == -1: - args.rank = int(os.environ["RANK"]) - if args.multiprocessing_distributed: - # For multiprocessing distributed training, rank needs to be the - # global rank among all the processes - args.rank = args.rank * ngpus_per_node + gpu - dist.init_process_group(backend=args.dist_backend, init_method=args.dist_url, - world_size=args.world_size, rank=args.rank) - # create model - if args.pretrained: - print("=> using pre-trained model '{}'".format(args.arch)) - model = models.__dict__[args.arch](pretrained=True) - else: - print("=> creating model '{}'".format(args.arch)) - model = models.__dict__[args.arch]() - - if not torch.cuda.is_available(): - print('using CPU, this will be slow') - elif args.distributed: - # For multiprocessing distributed, DistributedDataParallel constructor - # should always set the single device scope, otherwise, - # DistributedDataParallel will use all available devices. - if args.gpu is not None: - torch.cuda.set_device(args.gpu) - model.cuda(args.gpu) - # When using a single GPU per process and per - # DistributedDataParallel, we need to divide the batch size - # ourselves based on the total number of GPUs of the current node. - args.batch_size = int(args.batch_size / ngpus_per_node) - args.workers = int((args.workers + ngpus_per_node - 1) / ngpus_per_node) - model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu]) - else: - model.cuda() - # DistributedDataParallel will divide and allocate batch_size to all - # available GPUs if device_ids are not set - model = torch.nn.parallel.DistributedDataParallel(model) - elif args.gpu is not None: - torch.cuda.set_device(args.gpu) - model = model.cuda(args.gpu) - else: - # DataParallel will divide and allocate batch_size to all available GPUs - if args.arch.startswith('alexnet') or args.arch.startswith('vgg'): - model.features = torch.nn.DataParallel(model.features) - model.cuda() - else: - model = torch.nn.DataParallel(model).cuda() - - # define loss function (criterion), optimizer, and learning rate scheduler - criterion = nn.CrossEntropyLoss().cuda(args.gpu) - - optimizer = torch.optim.SGD(model.parameters(), args.lr, - momentum=args.momentum, - weight_decay=args.weight_decay) - - """Sets the learning rate to the initial LR decayed by 10 every 30 epochs""" - scheduler = StepLR(optimizer, step_size=30, gamma=0.1) - - # optionally resume from a checkpoint - if args.resume: - if os.path.isfile(args.resume): - print("=> loading checkpoint '{}'".format(args.resume)) - if args.gpu is None: - checkpoint = torch.load(args.resume) - else: - # Map model to be loaded to specified single gpu. - loc = 'cuda:{}'.format(args.gpu) - checkpoint = torch.load(args.resume, map_location=loc) - args.start_epoch = checkpoint['epoch'] - best_acc1 = checkpoint['best_acc1'] - if args.gpu is not None: - # best_acc1 may be from a checkpoint from a different GPU - best_acc1 = best_acc1.to(args.gpu) - model.load_state_dict(checkpoint['state_dict']) - optimizer.load_state_dict(checkpoint['optimizer']) - scheduler.load_state_dict(checkpoint['scheduler']) - print("=> loaded checkpoint '{}' (epoch {})" - .format(args.resume, checkpoint['epoch'])) - else: - print("=> no checkpoint found at '{}'".format(args.resume)) - - cudnn.benchmark = True - - # Data loading code - if args.dummy: - print("=> Dummy data is used!") - train_dataset = datasets.FakeData(1281167, (3, 224, 224), 1000, transforms.ToTensor()) - val_dataset = datasets.FakeData(50000, (3, 224, 224), 1000, transforms.ToTensor()) - else: - traindir = os.path.join(args.data, 'train') - valdir = os.path.join(args.data, 'val') - normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], - std=[0.229, 0.224, 0.225]) - - train_dataset = datasets.ImageFolder( - traindir, - transforms.Compose([ - transforms.RandomResizedCrop(224), - transforms.RandomHorizontalFlip(), - transforms.ToTensor(), - normalize, - ])) - - val_dataset = datasets.ImageFolder( - valdir, - transforms.Compose([ - transforms.Resize(256), - transforms.CenterCrop(224), - transforms.ToTensor(), - normalize, - ])) - - if args.distributed: - train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset) - val_sampler = torch.utils.data.distributed.DistributedSampler(val_dataset, shuffle=False, drop_last=True) - else: - train_sampler = None - val_sampler = None - - train_loader = torch.utils.data.DataLoader( - train_dataset, batch_size=args.batch_size, shuffle=(train_sampler is None), - num_workers=args.workers, pin_memory=True, sampler=train_sampler) - - val_loader = torch.utils.data.DataLoader( - val_dataset, batch_size=args.batch_size, shuffle=False, - num_workers=args.workers, pin_memory=True, sampler=val_sampler) - - if args.evaluate: - validate(val_loader, model, criterion, args) - return - - for epoch in range(args.start_epoch, args.epochs): - if args.distributed: - train_sampler.set_epoch(epoch) - - # train for one epoch - train(train_loader, model, criterion, optimizer, epoch, args) - - # evaluate on validation set - acc1 = validate(val_loader, model, criterion, args) - - scheduler.step() - - - # remember best acc@1 and save checkpoint - is_best = acc1 > best_acc1 - best_acc1 = max(acc1, best_acc1) - - if not args.multiprocessing_distributed or (args.multiprocessing_distributed - and args.rank % ngpus_per_node == 0): - save_checkpoint({ - 'epoch': epoch + 1, - 'arch': args.arch, - 'state_dict': model.state_dict(), - 'best_acc1': best_acc1, - 'optimizer' : optimizer.state_dict(), - 'scheduler' : scheduler.state_dict() - }, is_best) - - -def train(train_loader, model, criterion, optimizer, epoch, args): - batch_time = AverageMeter('Time', ':6.3f') - data_time = AverageMeter('Data', ':6.3f') - losses = AverageMeter('Loss', ':.4e') - top1 = AverageMeter('Acc@1', ':6.2f') - top5 = AverageMeter('Acc@5', ':6.2f') - progress = ProgressMeter( - len(train_loader), - [batch_time, data_time, losses, top1, top5], - prefix="Epoch: [{}]".format(epoch)) - - # switch to train mode - model.train() - - end = time.time() - for i, (images, target) in enumerate(train_loader): - # measure data loading time - data_time.update(time.time() - end) - - if args.gpu is not None: - images = images.cuda(args.gpu, non_blocking=True) - if torch.cuda.is_available(): - target = target.cuda(args.gpu, non_blocking=True) - - # compute output - output = model(images) - loss = criterion(output, target) - - # measure accuracy and record loss - acc1, acc5 = accuracy(output, target, topk=(1, 5)) - losses.update(loss.item(), images.size(0)) - top1.update(acc1[0], images.size(0)) - top5.update(acc5[0], images.size(0)) - - # compute gradient and do SGD step - optimizer.zero_grad() - loss.backward() - optimizer.step() - - # measure elapsed time - batch_time.update(time.time() - end) - end = time.time() - - if i % args.print_freq == 0: - progress.display(i + 1) - - -def validate(val_loader, model, criterion, args): - - def run_validate(loader, base_progress=0): - with torch.no_grad(): - end = time.time() - for i, (images, target) in enumerate(loader): - i = base_progress + i - if args.gpu is not None: - images = images.cuda(args.gpu, non_blocking=True) - if torch.cuda.is_available(): - target = target.cuda(args.gpu, non_blocking=True) - - # compute output - output = model(images) - loss = criterion(output, target) - - # measure accuracy and record loss - acc1, acc5 = accuracy(output, target, topk=(1, 5)) - losses.update(loss.item(), images.size(0)) - top1.update(acc1[0], images.size(0)) - top5.update(acc5[0], images.size(0)) - - # measure elapsed time - batch_time.update(time.time() - end) - end = time.time() - - if i % args.print_freq == 0: - progress.display(i + 1) - - batch_time = AverageMeter('Time', ':6.3f', Summary.NONE) - losses = AverageMeter('Loss', ':.4e', Summary.NONE) - top1 = AverageMeter('Acc@1', ':6.2f', Summary.AVERAGE) - top5 = AverageMeter('Acc@5', ':6.2f', Summary.AVERAGE) - progress = ProgressMeter( - len(val_loader) + (args.distributed and (len(val_loader.sampler) * args.world_size < len(val_loader.dataset))), - [batch_time, losses, top1, top5], - prefix='Test: ') - - # switch to evaluate mode - model.eval() - - run_validate(val_loader) - if args.distributed: - top1.all_reduce() - top5.all_reduce() - - if args.distributed and (len(val_loader.sampler) * args.world_size < len(val_loader.dataset)): - aux_val_dataset = Subset(val_loader.dataset, - range(len(val_loader.sampler) * args.world_size, len(val_loader.dataset))) - aux_val_loader = torch.utils.data.DataLoader( - aux_val_dataset, batch_size=args.batch_size, shuffle=False, - num_workers=args.workers, pin_memory=True) - run_validate(aux_val_loader, len(val_loader)) - - progress.display_summary() - - return top1.avg - - -def save_checkpoint(state, is_best, filename='checkpoint.pth.tar'): - torch.save(state, filename) - if is_best: - shutil.copyfile(filename, 'model_best.pth.tar') - -class Summary(Enum): - NONE = 0 - AVERAGE = 1 - SUM = 2 - COUNT = 3 - -class AverageMeter(object): - """Computes and stores the average and current value""" - def __init__(self, name, fmt=':f', summary_type=Summary.AVERAGE): - self.name = name - self.fmt = fmt - self.summary_type = summary_type - self.reset() - - def reset(self): - self.val = 0 - self.avg = 0 - self.sum = 0 - self.count = 0 - - def update(self, val, n=1): - self.val = val - self.sum += val * n - self.count += n - self.avg = self.sum / self.count - - def all_reduce(self): - total = torch.FloatTensor([self.sum, self.count]) - dist.all_reduce(total, dist.ReduceOp.SUM, async_op=False) - self.sum, self.count = total.tolist() - self.avg = self.sum / self.count - - def __str__(self): - fmtstr = '{name} {val' + self.fmt + '} ({avg' + self.fmt + '})' - return fmtstr.format(**self.__dict__) - - def summary(self): - fmtstr = '' - if self.summary_type is Summary.NONE: - fmtstr = '' - elif self.summary_type is Summary.AVERAGE: - fmtstr = '{name} {avg:.3f}' - elif self.summary_type is Summary.SUM: - fmtstr = '{name} {sum:.3f}' - elif self.summary_type is Summary.COUNT: - fmtstr = '{name} {count:.3f}' - else: - raise ValueError('invalid summary type %r' % self.summary_type) - - return fmtstr.format(**self.__dict__) - - -class ProgressMeter(object): - def __init__(self, num_batches, meters, prefix=""): - self.batch_fmtstr = self._get_batch_fmtstr(num_batches) - self.meters = meters - self.prefix = prefix - - def display(self, batch): - entries = [self.prefix + self.batch_fmtstr.format(batch)] - entries += [str(meter) for meter in self.meters] - print('\t'.join(entries)) - - def display_summary(self): - entries = [" *"] - entries += [meter.summary() for meter in self.meters] - print(' '.join(entries)) - - def _get_batch_fmtstr(self, num_batches): - num_digits = len(str(num_batches // 1)) - fmt = '{:' + str(num_digits) + 'd}' - return '[' + fmt + '/' + fmt.format(num_batches) + ']' - -def accuracy(output, target, topk=(1,)): - """Computes the accuracy over the k top predictions for the specified values of k""" - with torch.no_grad(): - maxk = max(topk) - batch_size = target.size(0) - - _, pred = output.topk(maxk, 1, True, True) - pred = pred.t() - correct = pred.eq(target.view(1, -1).expand_as(pred)) - - res = [] - for k in topk: - correct_k = correct[:k].reshape(-1).float().sum(0, keepdim=True) - res.append(correct_k.mul_(100.0 / batch_size)) - return res - - -if __name__ == '__main__': - main() diff --git a/neural_coder/examples/vision/resnet18.py b/neural_coder/examples/vision/resnet18.py deleted file mode 100644 index a7fadf9c70b..00000000000 --- a/neural_coder/examples/vision/resnet18.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import torch -import torchvision.models as models -model = models.resnet18(pretrained=True) -model.eval() -batch_size = 1 -input = torch.rand(batch_size, 3, 224, 224) -with torch.no_grad(): - model(input) diff --git a/neural_coder/examples/vision/resnet50.py b/neural_coder/examples/vision/resnet50.py deleted file mode 100644 index c7091e2e7bc..00000000000 --- a/neural_coder/examples/vision/resnet50.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import torch -import torchvision.models as models -model = models.resnet50(pretrained=True) -model.eval() -batch_size = 1 -input = torch.rand(batch_size, 3, 224, 224) -with torch.no_grad(): - model(input) diff --git a/neural_coder/extensions/neural_compressor_ext_lab/.eslintignore b/neural_coder/extensions/neural_compressor_ext_lab/.eslintignore deleted file mode 100644 index fffa32fdf63..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/.eslintignore +++ /dev/null @@ -1,8 +0,0 @@ -node_modules -dist -coverage -**/*.d.ts -tests - -**/__tests__ -ui-tests diff --git a/neural_coder/extensions/neural_compressor_ext_lab/.eslintrc.js b/neural_coder/extensions/neural_compressor_ext_lab/.eslintrc.js deleted file mode 100644 index c64b3721828..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/.eslintrc.js +++ /dev/null @@ -1,44 +0,0 @@ -module.exports = { - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/eslint-recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:prettier/recommended' - ], - parser: '@typescript-eslint/parser', - parserOptions: { - project: 'tsconfig.json', - sourceType: 'module' - }, - plugins: ['@typescript-eslint'], - rules: { - '@typescript-eslint/naming-convention': [ - 'error', - { - selector: 'interface', - format: ['PascalCase'], - custom: { - regex: '^I[A-Z]', - match: true - } - } - ], - '@typescript-eslint/no-unused-vars': ['warn', { args: 'none' }], - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/no-namespace': 'off', - '@typescript-eslint/no-use-before-define': 'off', - '@typescript-eslint/quotes': [ - 'error', - 'single', - { avoidEscape: true, allowTemplateLiterals: false } - ], - node: { - fs: 'empty', - net:'empty', - tls:'empty', -}, - curly: ['error', 'all'], - eqeqeq: 'error', - 'prefer-arrow-callback': 'error' - } -}; diff --git a/neural_coder/extensions/neural_compressor_ext_lab/.prettierignore b/neural_coder/extensions/neural_compressor_ext_lab/.prettierignore deleted file mode 100644 index 0de58a6f50b..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/.prettierignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -**/node_modules -**/lib -**/package.json -neural_compressor_ext_lab diff --git a/neural_coder/extensions/neural_compressor_ext_lab/.prettierrc b/neural_coder/extensions/neural_compressor_ext_lab/.prettierrc deleted file mode 100644 index d0824a69c14..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/.prettierrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "singleQuote": true, - "trailingComma": "none", - "arrowParens": "avoid", - "endOfLine": "auto" -} diff --git a/neural_coder/extensions/neural_compressor_ext_lab/.stylelintrc b/neural_coder/extensions/neural_compressor_ext_lab/.stylelintrc deleted file mode 100644 index 0e1ff30327c..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/.stylelintrc +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": [ - "stylelint-config-recommended", - "stylelint-config-standard", - "stylelint-prettier/recommended" - ], - "rules": { - "property-no-vendor-prefix": null, - "selector-no-vendor-prefix": null, - "value-no-vendor-prefix": null - } -} diff --git a/neural_coder/extensions/neural_compressor_ext_lab/CHANGELOG.md b/neural_coder/extensions/neural_compressor_ext_lab/CHANGELOG.md deleted file mode 100644 index 2d352af421a..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/CHANGELOG.md +++ /dev/null @@ -1,5 +0,0 @@ -# Changelog - - - - diff --git a/neural_coder/extensions/neural_compressor_ext_lab/DEVELOP.md b/neural_coder/extensions/neural_compressor_ext_lab/DEVELOP.md deleted file mode 100644 index 7141373e783..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/DEVELOP.md +++ /dev/null @@ -1,75 +0,0 @@ -# neural_compressor_ext_lab - -A JupyterLab extension. - -## Requirements - -- JupyterLab >= 3.0 - -## Install - -To install the extension, execute: - -```bash -pip install neural_compressor_ext_lab -``` - -## Uninstall - -To remove the extension, execute: - -```bash -pip uninstall neural_compressor_ext_lab -``` - -## Contributing - -### Development install - -Note: You will need NodeJS to build the extension package. - -The `jlpm` command is JupyterLab's pinned version of -[yarn](https://yarnpkg.com/) that is installed with JupyterLab. You may use -`yarn` or `npm` in lieu of `jlpm` below. - -```bash -# Clone the repo to your local environment -# Change directory to the neural_compressor_ext_lab directory -# Install package in development mode -pip install -e . -# Link your development version of the extension with JupyterLab -jupyter labextension develop . --overwrite -# Rebuild extension Typescript source after making changes -jlpm build -``` - -You can watch the source directory and run JupyterLab at the same time in different terminals to watch for changes in the extension's source and automatically rebuild the extension. - -```bash -# Watch the source directory in one terminal, automatically rebuilding when needed -jlpm watch -# Run JupyterLab in another terminal -jupyter lab -``` - -With the watch command running, every saved change will immediately be built locally and available in your running JupyterLab. Refresh JupyterLab to load the change in your browser (you may need to wait several seconds for the extension to be rebuilt). - -By default, the `jlpm build` command generates the source maps for this extension to make it easier to debug using the browser dev tools. To also generate source maps for the JupyterLab core extensions, you can run the following command: - -```bash -jupyter lab build --minimize=False -``` - -### Development uninstall - -```bash -pip uninstall neural_compressor_ext_lab -``` - -In development mode, you will also need to remove the symlink created by `jupyter labextension develop` -command. To find its location, you can run `jupyter labextension list` to figure out where the `labextensions` -folder is located. Then you can remove the symlink named `neural_compressor_ext_lab` within that folder. - -### Packaging the extension - -See [RELEASE](RELEASE.md) diff --git a/neural_coder/extensions/neural_compressor_ext_lab/LICENSE b/neural_coder/extensions/neural_compressor_ext_lab/LICENSE deleted file mode 100644 index d3f814da892..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2022, neural_coder -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/neural_coder/extensions/neural_compressor_ext_lab/MANIFEST.in b/neural_coder/extensions/neural_compressor_ext_lab/MANIFEST.in deleted file mode 100644 index 99115494fae..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/MANIFEST.in +++ /dev/null @@ -1,24 +0,0 @@ -include LICENSE -include *.md -include pyproject.toml - -include package.json -include install.json -include ts*.json -include yarn.lock - -graft neural_compressor_ext_lab/labextension - -# Javascript files -graft src -graft style -prune **/node_modules -prune lib -prune binder - -# Patterns to exclude from any directory -global-exclude *~ -global-exclude *.pyc -global-exclude *.pyo -global-exclude .git -global-exclude .ipynb_checkpoints diff --git a/neural_coder/extensions/neural_compressor_ext_lab/README.md b/neural_coder/extensions/neural_compressor_ext_lab/README.md deleted file mode 100644 index edd9e1e53a6..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/README.md +++ /dev/null @@ -1,45 +0,0 @@ -Intel® Neural Compressor as JupyterLab Extension -=========================== -A JupyterLab Extension library supporting Neural Coder, a novel feature powered by Intel® Neural Compressor providing automatic quantization to further simplify computing performance optimizations of Deep Learning models. - -## Installation -**By Extension Manager in JupyterLab (Recommended)** - -Search for ```jupyter-lab-neural-compressor``` in the Extension Manager in JupyterLab. - -**By Linux Terminal** -```bash -npm i jupyter-lab-neural-compressor -jupyter labextension install jupyter-lab-neural-compressor -``` - -## Getting Started! - -As shown in the drop-down list, the supported features include "INT8 (Static Quantization)", "INT8 (Dynamic Quantization)", "BF16", and "Auto Enable & Benchmark". Each of the first three options enables a specific quantization feature into your Deep Learning scripts. The last option automatically enables all quantization features on a Deep Learning script and automatically evaluates the best performance on the model. It is a code-free solution that can help users enable quantization algorithms on a Deep Learning model with no manual coding needed. - -Architecture - -### Auto-enable a feature -Click the run button on the left side of the drop-down list to start. After finishing, you can see the code changes for the specific optimization enabling as shown in the figure below: - -Architecture - -### Or let us help you auto-select the best feature -The last option automatically enables each quantization feature on your Deep Learning script and automatically evaluates for the best performance among all features on your Deep Learning model. Since it will automatically run the Python script for benchmark, it requires you to enter additional parameters needed to run your Python script. If there is no additional parameter needed, you can just leave it blank: - -Architecture - -In the new cell box appeared below your Code cell boxes, you can see the execution progress, and at the end you can see which one turns out to be the best optimization and how much performance gain can it bring to your Deep Learning model: - -Architecture - -When it is finished, you can also see that the code changes for the best optimization are automatically enabled into your script: - -Architecture - -## Pre-requisites -```bash -apt-get update && apt-get install bc numactl -conda install mkl mkl-include jemalloc -pip3 install neural-compressor opencv-python-headless -``` \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_lab/RELEASE.md b/neural_coder/extensions/neural_compressor_ext_lab/RELEASE.md deleted file mode 100644 index bd51b356f28..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/RELEASE.md +++ /dev/null @@ -1,61 +0,0 @@ -# Making a new release of neural_compressor_ext_lab - -The extension can be published to `PyPI` and `npm` manually or using the [Jupyter Releaser](https://github.com/jupyter-server/jupyter_releaser). - -## Manual release - -### Python package - -This extension can be distributed as Python -packages. All of the Python -packaging instructions in the `pyproject.toml` file to wrap your extension in a -Python package. Before generating a package, we first need to install `build`. - -```bash -pip install build twine -``` - -To create a Python source package (`.tar.gz`) and the binary package (`.whl`) in the `dist/` directory, do: - -```bash -python -m build -``` - -> `python setup.py sdist bdist_wheel` is deprecated and will not work for this package. - -Then to upload the package to PyPI, do: - -```bash -twine upload dist/* -``` - -### NPM package - -To publish the frontend part of the extension as a NPM package, do: - -```bash -npm login -npm publish --access public -``` - -## Automated releases with the Jupyter Releaser - -The extension repository should already be compatible with the Jupyter Releaser. - -Check out the [workflow documentation](https://github.com/jupyter-server/jupyter_releaser#typical-workflow) for more information. - -Here is a summary of the steps to cut a new release: - -- Fork the [`jupyter-releaser` repo](https://github.com/jupyter-server/jupyter_releaser) -- Add `ADMIN_GITHUB_TOKEN`, `PYPI_TOKEN` and `NPM_TOKEN` to the Github Secrets in the fork -- Go to the Actions panel -- Run the "Draft Changelog" workflow -- Merge the Changelog PR -- Run the "Draft Release" workflow -- Run the "Publish Release" workflow - -## Publishing to `conda-forge` - -If the package is not on conda forge yet, check the documentation to learn how to add it: https://conda-forge.org/docs/maintainer/adding_pkgs.html - -Otherwise a bot should pick up the new version publish to PyPI, and open a new PR on the feedstock repository automatically. diff --git a/neural_coder/extensions/neural_compressor_ext_lab/binder/environment.yml b/neural_coder/extensions/neural_compressor_ext_lab/binder/environment.yml deleted file mode 100644 index 23bed128c24..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/binder/environment.yml +++ /dev/null @@ -1,21 +0,0 @@ -# a mybinder.org-ready environment for demoing neural_compressor_ext_lab -# this environment may also be used locally on Linux/MacOS/Windows, e.g. -# -# conda env update --file binder/environment.yml -# conda activate neural-compressor-ext-lab-demo -# -name: neural-compressor-ext-lab-demo - -channels: - - conda-forge - -dependencies: - # runtime dependencies - - python >=3.8,<3.9.0a0 - - jupyterlab >=3,<4.0.0a0 - # labextension build dependencies - - nodejs >=14,<15 - - pip - - wheel - # additional packages for demos - # - ipywidgets diff --git a/neural_coder/extensions/neural_compressor_ext_lab/binder/postBuild b/neural_coder/extensions/neural_compressor_ext_lab/binder/postBuild deleted file mode 100644 index 95eabd91874..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/binder/postBuild +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env python3 -""" perform a development install of neural_compressor_ext_lab - - On Binder, this will run _after_ the environment has been fully created from - the environment.yml in this directory. - - This script should also run locally on Linux/MacOS/Windows: - - python3 binder/postBuild -""" -import subprocess -import sys -from pathlib import Path - - -ROOT = Path.cwd() - -def _(*args, **kwargs): - """ Run a command, echoing the args - - fails hard if something goes wrong - """ - print("\n\t", " ".join(args), "\n") - return_code = subprocess.call(args, **kwargs) - if return_code != 0: - print("\nERROR", return_code, " ".join(args)) - sys.exit(return_code) - -# verify the environment is self-consistent before even starting -_(sys.executable, "-m", "pip", "check") - -# install the labextension -_(sys.executable, "-m", "pip", "install", "-e", ".") -_(sys.executable, "-m", "jupyter", "labextension", "develop", "--overwrite", ".") - -# verify the environment the extension didn't break anything -_(sys.executable, "-m", "pip", "check") - -# list the extensions -_("jupyter", "server", "extension", "list") - -# initially list installed extensions to determine if there are any surprises -_("jupyter", "labextension", "list") - - -print("JupyterLab with neural_compressor_ext_lab is ready to run with:\n") -print("\tjupyter lab\n") diff --git a/neural_coder/extensions/neural_compressor_ext_lab/install.json b/neural_coder/extensions/neural_compressor_ext_lab/install.json deleted file mode 100644 index 24f9a58e094..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/install.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "packageManager": "python", - "packageName": "neural_compressor_ext_lab", - "uninstallInstructions": "Use your Python package manager (pip, conda, etc.) to uninstall the package neural_compressor_ext_lab" -} diff --git a/neural_coder/extensions/neural_compressor_ext_lab/lib/constants.d.ts b/neural_coder/extensions/neural_compressor_ext_lab/lib/constants.d.ts deleted file mode 100644 index 071e86ae2c1..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/lib/constants.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -export declare namespace Constants { - const SHORT_PLUGIN_NAME = "neural_compressor_ext_lab"; - const WORK_PATH = "neural_coder_workspace/"; - const ICON_FORMAT_ALL_SVG = ""; - const ICON_RUN = ""; - const SVG = ""; - const LONG_PLUGIN_NAME: string; - const SETTINGS_SECTION: string; - const COMMAND_SECTION_NAME = "Jupyterlab Code Optimizer"; - const PLUGIN_VERSION = "0.1.0"; -} diff --git a/neural_coder/extensions/neural_compressor_ext_lab/lib/constants.js b/neural_coder/extensions/neural_compressor_ext_lab/lib/constants.js deleted file mode 100644 index 13acd1a7ad3..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/lib/constants.js +++ /dev/null @@ -1,12 +0,0 @@ -export var Constants; -(function (Constants) { - Constants.SHORT_PLUGIN_NAME = 'neural_compressor_ext_lab'; - Constants.WORK_PATH = "neural_coder_workspace/"; - Constants.ICON_FORMAT_ALL_SVG = ''; - Constants.ICON_RUN = ''; - Constants.SVG = ''; - Constants.LONG_PLUGIN_NAME = `@rya/${Constants.SHORT_PLUGIN_NAME}`; - Constants.SETTINGS_SECTION = `${Constants.LONG_PLUGIN_NAME}:settings`; - Constants.COMMAND_SECTION_NAME = 'Jupyterlab Code Optimizer'; - Constants.PLUGIN_VERSION = '0.1.0'; -})(Constants || (Constants = {})); diff --git a/neural_coder/extensions/neural_compressor_ext_lab/lib/deepcoder.d.ts b/neural_coder/extensions/neural_compressor_ext_lab/lib/deepcoder.d.ts deleted file mode 100644 index dcf8ddfba2a..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/lib/deepcoder.d.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Cell, CodeCell } from '@jupyterlab/cells'; -import { ToolbarButton } from '@jupyterlab/apputils'; -import { Widget } from '@lumino/widgets'; -import { INotebookTracker, NotebookPanel, Notebook } from '@jupyterlab/notebook'; -declare class JupyterlabCodeOptimizer { - protected working: boolean; - protected panel: NotebookPanel; - private tmp_path; - log_path: string; - tmp_log_path: string; - rand: number; - markdown: Cell | undefined; - cells: CodeCell[]; - constructor(panel: NotebookPanel); - optimizeCode(code: string[], formatter: string, name: string, next: string, options: string | undefined, notebook: boolean, panel: NotebookPanel, cell: CodeCell, run?: ToolbarButton | undefined): Promise; -} -export declare class JupyterlabNotebookCodeOptimizer extends JupyterlabCodeOptimizer { - protected notebookname: string; - protected notebookTracker: INotebookTracker; - constructor(notebookTracker: INotebookTracker, panel: NotebookPanel); - optimizeAction(config: any, formatter?: string): Promise; - optimizeAllCodeCells(config?: string, formatter?: string, notebook?: Notebook, run?: ToolbarButton): Promise; - private getCodeCells; - private optimizeCells; - applicable(formatter: string, currentWidget: Widget): boolean | null; -} -export {}; diff --git a/neural_coder/extensions/neural_compressor_ext_lab/lib/deepcoder.js b/neural_coder/extensions/neural_compressor_ext_lab/lib/deepcoder.js deleted file mode 100644 index 744d7a7a8e3..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/lib/deepcoder.js +++ /dev/null @@ -1,295 +0,0 @@ -import { NotebookActions } from '@jupyterlab/notebook'; -import NotebookUtilities from "./utils"; -import { Constants } from './constants'; -class JupyterlabCodeOptimizer { - constructor(panel) { - this.working = false; - this.panel = panel; - this.tmp_path = "tmp.py"; - this.rand = NotebookUtilities.GetRandomNum(0, 200); - this.log_path = Constants.WORK_PATH + "NeuralCoder" + this.rand + ".log"; - this.tmp_log_path = Constants.WORK_PATH + "NeuralCoder_tmp" + ".log"; - this.cells = []; - } - async optimizeCode(code, formatter, name, next, options, notebook, panel, cell, run) { - let codes = []; - code.forEach(function (value) { - value = value.replace(/('\\n')/g, '^^^'); - value = value.replace(/\\n"/g, '###'); - value = value.replace(/\\n'/g, '###'); - value = value.replace(/"\\n/g, '@@'); - value = value.replace(/'\\n/g, '@@'); - value = value.replace(/\n/g, '\\n'); - value = value.replace(/"/g, '+++'); - value = value.replace(/,/g, '$'); - codes.push(value); - }); - let gen_code = `code = "${codes}"\ncodes = code.split(',')\nwith open( '${this.tmp_path}', 'w+' ) as f:\n for i in range(0,len(codes)):\n f.write('# this is the beginning of a single code snippet\\n')\n code_list = codes[i].replace('$',',').replace('+++','\"').split('\\n')\n for line in code_list:\n if('split(^^^)' in line):\n line=line.replace('split(^^^)', 'split(\\'\\\\n\\')')\n if('###' in line):\n line=line.replace('###', '\\\\n\"')\n if('@@' in line):\n line=line.replace('@@', '\"\\\\n')\n f.write(line+'\\n')`; - const expr = { code_list: `code_list` }; - NotebookUtilities.sendKernelRequestFromNotebook(panel, gen_code, expr, false); - if (options === 'normal') { - let runcode = `from neural_coder import enable\nenable(code="${this.tmp_path}",features=["${formatter}"], overwrite=True)`; - let expr = { sum: ` ` }; - NotebookUtilities.sendKernelRequestFromNotebook(panel, runcode, expr, false); - let run_code1 = `with open("${this.tmp_path}", 'r') as f:\n optimized_code = f.read()\n`; - let expr1 = { optimizedCode: "optimized_code" }; - let result2 = NotebookUtilities.sendKernelRequestFromNotebook(panel, run_code1, expr1, false); - result2.then(value => { - var _a, _b, _c, _d; - let optimizedTexts = Object.values(value.optimizedCode.data)[0]; - let optimizeCodes = optimizedTexts.split('# this is the beginning of a single code snippet\\n').slice(1); - optimizeCodes[optimizeCodes.length - 1] = optimizeCodes[optimizeCodes.length - 1].slice(0, -3); - for (let i = 0; i < optimizeCodes.length; ++i) { - const cell = this.cells[i]; - const currentTexts = this.cells.map(cell => cell.model.value.text); - const currentText = currentTexts[i]; - let optimizedtext = optimizeCodes[i]; - optimizedtext = optimizedtext.replace(/\\'\\\\n\\'/g, "^^^"); - optimizedtext = optimizedtext.replace(/\\\\n"/g, "+++"); - optimizedtext = optimizedtext.replace(/\\\\n'/g, "+++"); - optimizedtext = optimizedtext.replace(/"\\\\n/g, "@@@"); - optimizedtext = optimizedtext.replace(/'\\\\n/g, "@@@"); - optimizedtext = optimizedtext.replace(/\\n/g, '\n'); - optimizedtext = optimizedtext.replace(/\\'/g, "'"); - optimizedtext = optimizedtext.replace(/\^\^\^/g, "'\\n'"); - optimizedtext = optimizedtext.replace(/\+\+\+/g, "\\n\""); - optimizedtext = optimizedtext.replace(/\@\@\@/g, "\"\\n"); - if (cell.model.value.text === currentText) { - cell.model.value.text = optimizedtext; - } - const run_svg = document.createElement("svg"); - run_svg.innerHTML = Constants.ICON_RUN; - (_d = (_c = (_b = (_a = run === null || run === void 0 ? void 0 : run.node.firstChild) === null || _a === void 0 ? void 0 : _a.firstChild) === null || _b === void 0 ? void 0 : _b.firstChild) === null || _c === void 0 ? void 0 : _c.firstChild) === null || _d === void 0 ? void 0 : _d.replaceWith(run_svg); - } - }); - } - else { - if (formatter === '') { - if (this.markdown) { - this.markdown.model.value.text += "[NeuralCoder INFO] Enabling and Benchmarking for The Original Model ...... \n"; - } - // cell.outputArea.node.innerText += "[NeuralCoder INFO] Enabling and Benchmarking for The Original Model ......\n" - let runcode1 = `with open("${this.log_path}", 'a' ) as f:\n f.write("[NeuralCoder INFO] Enabling and Benchmarking for The Original Model ......\\n")`; - let expr1 = { path: "" }; - NotebookUtilities.sendKernelRequestFromNotebook(panel, runcode1, expr1, false); - let runcode = `from neural_coder import enable\nperfomance, mode, path = enable(code="${this.tmp_path}",features=[], run_bench=True, args="${options}")\nwith open(path + '/bench.log', 'r') as f:\n logs = f.readlines()\nlog_line = logs[4]\nlog = log_line.split("[")[1].split("]")[0]`; - let expr = { path: "path", log: "log" }; - let result = NotebookUtilities.sendKernelRequestFromNotebook(panel, runcode, expr, false); - let fps; - result.then(value => { - fps = Object.values(value.log.data)[0]; - if (this.markdown) { - this.markdown.model.value.text += `[NeuralCoder INFO] Benchmark Result (Performance) of The Original Model is ${fps} (samples/second) \n`; - } - // cell.outputArea.node.innerText += `[NeuralCoder INFO] Benchmark Result (Performance) of The Original Model is ${fps} (samples/second)\n` - let text = `[NeuralCoder INFO] Benchmark Result (Performance) of The Original Model is ${fps} (samples/second)\\n`; - let runcode = `with open("${this.log_path}", 'a' ) as f:\n f.write("${text}")`; - let expr = { path: "" }; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode, expr, false); - if (this.markdown) { - this.markdown.model.value.text += `[NeuralCoder INFO] Enabling and Benchmarking for ${next} ...... \n`; - } - // cell.outputArea.node.innerText += `[NeuralCoder INFO] Enabling and Benchmarking for ${next} ......\n` - let runcode1 = `with open("${this.log_path}", 'a' ) as f:\n f.write("[NeuralCoder INFO] Enabling and Benchmarking for ${next} ......\\n")`; - let expr1 = { path: "" }; - NotebookUtilities.sendKernelRequestFromNotebook(panel, runcode1, expr1, false); - let runcode2 = `with open("${this.tmp_log_path}", 'a' ) as f:\n f.write("${text}")`; - let expr2 = { path: "" }; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode2, expr2, false); - }); - } - else { - let runcode = `from neural_coder import enable\nperfomance, mode, path = enable(code="${this.tmp_path}", features=["${formatter}"], run_bench=True, args="${options}")\nwith open(path + '/bench.log', 'r') as f:\n logs = f.readlines()\nlog_line = logs[4]\nlog = log_line.split("[")[1].split("]")[0]`; - let expr = { path: "path", log: "log" }; - let result = NotebookUtilities.sendKernelRequestFromNotebook(panel, runcode, expr, false); - let fps; - result.then(value => { - fps = Object.values(value.log.data)[0]; - if (this.markdown) { - this.markdown.model.value.text += `[NeuralCoder INFO] Benchmark Result (Performance) of ${name} is ${fps} (samples/second) \n`; - } - // cell.outputArea.node.innerText += `[NeuralCoder INFO] Benchmark Result (Performance) of ${name} is ${fps} (FPS)\n` - let text = `[NeuralCoder INFO] Benchmark Result (Performance) of ${name} is ${fps} (samples/second)\\n`; - let runcode = `with open("${this.log_path}", 'a' ) as f:\n f.write("${text}")`; - let expr = { path: "" }; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode, expr, false); - if (next !== '') { - if (this.markdown) { - this.markdown.model.value.text += `[NeuralCoder INFO] Enabling and Benchmarking for ${next} ...... \n`; - } - // cell.outputArea.node.innerText += `[NeuralCoder INFO] Enabling and Benchmarking for ${next} ......\n` - let runcode2 = `with open("${this.log_path}", 'a' ) as f:\n f.write("[NeuralCoder INFO] Enabling and Benchmarking for ${next} ......\\n")`; - let expr2 = { path: "" }; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode2, expr2, false); - } - let runcode3 = `with open("${this.tmp_log_path}", 'a' ) as f:\n f.write("${text}")`; - let expr3 = { path: "" }; - let res_tmp = NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode3, expr3, false); - res_tmp.then(value => { - if (formatter === 'pytorch_inc_bf16') { - let read_log = `import re\nwith open("${this.tmp_log_path}", 'r') as f:\n logs = f.readlines()\n fps_list=[]\n for log_line in logs[-4:]:\n pat = re.compile(r\'\\d+\\.?\\d+')\n fps = re.findall(pat,log_line)[-1]\n fps_list.append(float(fps))\nmaxi = max(fps_list)\nindex = fps_list.index(maxi)\nboost = round(maxi/fps_list[0],1)\nfeatures=['','pytorch_inc_static_quant_fx','pytorch_inc_dynamic_quant','pytorch_inc_bf16']\nfeature_name=['Original Model','INC Enable INT8 (Static)','INC Enable INT8 (Dynamic)','INC Enable BF16']\nbest_feature = features[index]\nbest_name = feature_name[index]\nfeature_l = []\nfeature_l.append(best_feature)\nfrom neural_coder import enable\nenable(code="${this.tmp_path}",features=feature_l, overwrite=True)\nwith open("${this.tmp_path}", 'r') as f:\n optimized_code = f.read()\n`; - let read_expr = { boost: "boost", best_feature: "best_feature", best_name: "best_name", optimizeCode: "optimized_code", feature_l: "fps_list", maxi: "maxi", index: "index" }; - let read_result = NotebookUtilities.sendKernelRequestFromNotebook(this.panel, read_log, read_expr, false); - read_result.then(value => { - var _a, _b, _c, _d; - console.log("resres", value); - let boost = Object.values(value.boost.data)[0]; - let best_name = Object.values(value.best_name.data)[0]; - let optimizedTexts = Object.values(value.optimizeCode.data)[0]; - let optimizeCodes = optimizedTexts.split('# this is the beginning of a single code snippet\\n').slice(1); - if (this.markdown) { - this.markdown.model.value.text += `[NeuralCoder INFO] The Best Intel Optimization: ${best_name} \n`; - this.markdown.model.value.text += `[NeuralCoder INFO] You can get up to ${boost}X performance boost. \n`; - } - // cell.outputArea.node.innerText +=`[NeuralCoder INFO] The Best Intel Optimization: ${best_name}\n` - // cell.outputArea.node.innerText += `[NeuralCoder INFO] You can get up to ${boost}X performance boost.\n` - optimizeCodes[optimizeCodes.length - 1] = optimizeCodes[optimizeCodes.length - 1].slice(0, -3); - for (let i = 0; i < optimizeCodes.length; ++i) { - const cell = this.cells[i]; - const currentTexts = this.cells.map(cell => cell.model.value.text); - const currentText = currentTexts[i]; - let optimizedtext = optimizeCodes[i]; - optimizedtext = optimizedtext.replace(/\\'\\\\n\\'/g, "^^^"); - optimizedtext = optimizedtext.replace(/\\\\n"/g, "+++"); - optimizedtext = optimizedtext.replace(/\\\\n'/g, "+++"); - optimizedtext = optimizedtext.replace(/"\\\\n/g, "@@@"); - optimizedtext = optimizedtext.replace(/'\\\\n/g, "@@@"); - optimizedtext = optimizedtext.replace(/\\n/g, '\n'); - optimizedtext = optimizedtext.replace(/\\'/g, "'"); - optimizedtext = optimizedtext.replace(/\^\^\^/g, "'\\n'"); - optimizedtext = optimizedtext.replace(/\+\+\+/g, "\\n\""); - optimizedtext = optimizedtext.replace(/\@\@\@/g, "\"\\n"); - if (cell.model.value.text === currentText) { - cell.model.value.text = optimizedtext; - } - } - // if(this.markdown){ - // this.markdown.model.value.text += `[NeuralCoder INFO] HardWare: 4th Gen Intel Xeon Scalable processor with AMX \n` - // this.markdown.model.value.text += `[NeuralCoder INFO] The log was saved to neural_coder_workspace\\NeuralCoder${this.rand}.log \n` - // } - let command = "lscpu | grep 'Model name'"; - let get_hardware = `import subprocess\nsubp = subprocess.Popen("${command}",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding="utf-8")\nsubp.wait(2)\nhardware = subp.communicate()[0].replace("Model name:","").strip()`; - let expr_hardware = { hardware: "hardware" }; - let hard_res = NotebookUtilities.sendKernelRequestFromNotebook(this.panel, get_hardware, expr_hardware, false); - hard_res.then(value => { - let hard = Object.values(value.hardware.data)[0]; - if (this.markdown) { - this.markdown.model.value.text += `[NeuralCoder INFO] HardWare: ${hard} \n`; - this.markdown.model.value.text += `[NeuralCoder INFO] The log was saved to neural_coder_workspace\\NeuralCoder${this.rand}.log \n`; - } - // cell.outputArea.node.innerText += `[NeuralCoder INFO] HardWare: ${hard}\n` - }); - // cell.outputArea.node.innerText += `[NeuralCoder INFO] The log was saved to neural_coder_workspace\\NeuralCoder${this.rand}.log\n` - const run_svg = document.createElement("svg"); - run_svg.innerHTML = Constants.ICON_RUN; - (_d = (_c = (_b = (_a = run === null || run === void 0 ? void 0 : run.node.firstChild) === null || _a === void 0 ? void 0 : _a.firstChild) === null || _b === void 0 ? void 0 : _b.firstChild) === null || _c === void 0 ? void 0 : _c.firstChild) === null || _d === void 0 ? void 0 : _d.replaceWith(run_svg); - }); - } - }); - }); - } - } - } -} -export class JupyterlabNotebookCodeOptimizer extends JupyterlabCodeOptimizer { - constructor(notebookTracker, panel) { - super(panel); - this.notebookTracker = notebookTracker; - this.notebookname = ''; - } - async optimizeAction(config, formatter) { - return this.optimizeCells(true, config, formatter); - } - async optimizeAllCodeCells(config, formatter, notebook, run) { - return this.optimizeCells(false, config, formatter, notebook, run); - } - getCodeCells(ifmarkdown = true, notebook) { - if (!this.notebookTracker.currentWidget) { - return []; - } - const codeCells = []; - notebook = notebook || this.notebookTracker.currentWidget.content; - this.notebookname = notebook.title.label; - let count = 0; - notebook.widgets.forEach((cell) => { - if (cell.model.type === 'code') { - count += 1; - codeCells.push(cell); - } - }); - if (ifmarkdown) { - NotebookActions.insertBelow(notebook); - this.notebookTracker.currentWidget.content.activeCellIndex = count + 1; - NotebookActions.changeCellType(notebook, 'markdown'); - const activeCell = notebook.activeCell; - if (activeCell) { - this.markdown = activeCell; - } - } - this.cells = codeCells; - return codeCells; - } - async optimizeCells(selectedOnly, config, formatter, notebook, run) { - if (this.working) { - return new Promise((resolve, reject) => { - resolve("false!"); - }); - } - console.log("arrive here 333"); - this.working = true; - const optimize_type = formatter !== undefined ? formatter : 'pytorch_mixed_precision_cpu'; - if (optimize_type === 'auto-quant') { - selectedOnly = true; - } - else { - selectedOnly = false; - } - const selectedCells = this.getCodeCells(selectedOnly, notebook); - let cell = selectedCells[selectedCells.length - 1]; - if (selectedCells.length === 0) { - this.working = false; - return new Promise((resolve, reject) => { - resolve("false!"); - }); - } - const currentTexts = selectedCells.map(cell => cell.model.value.text); - if (optimize_type === 'auto-quant') { - console.log("arrive here 444-111"); - if (this.markdown) { - this.markdown.model.value.text = `[NeuralCoder INFO] Auto-Quant Started ...... \n`; - this.markdown.model.value.text += `[NeuralCoder INFO] Code: User code from Jupyter Lab notebook "${this.notebookname}" \n`; - this.markdown.model.value.text += `[NeuralCoder INFO] Benchmark Mode: Throughput \n`; - } - // cell.outputArea.node.innerText = `[NeuralCoder INFO] Auto-Quant Started ......\n` - // cell.outputArea.node.innerText += `[NeuralCoder INFO] Code: User code from Jupyter Lab notebook "${this.notebookname}"\n` - // cell.outputArea.node.innerText += `[NeuralCoder INFO] Benchmark Mode: Throughput\n` - let runcode = `with open('${this.log_path}', 'a' ) as f:\n f.write("[NeuralCoder INFO] Auto-Quant Started ......\\n")`; - let expr = { path: "" }; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode, expr, false); - let runcode2 = `with open('${this.log_path}', 'a' ) as f:\n f.write("[NeuralCoder INFO] Code: User code from Jupyter Lab notebook '${this.notebookname}'\\n")`; - let expr2 = { path: "" }; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode2, expr2, false); - let runcode3 = `with open('${this.log_path}', 'a' ) as f:\n f.write("[NeuralCoder INFO] Benchmark Mode: Throughput\\n")`; - let expr3 = { path: "" }; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode3, expr3, false); - // cell.outputArea.node.setAttribute("class","pad") - await this.optimizeCode(currentTexts, '', 'The Original Model', 'INC Enable INT8 (Static)', config, true, this.panel, cell, run); - await this.optimizeCode(currentTexts, 'pytorch_inc_static_quant_fx', 'INC Enable INT8 (Static)', 'INC Enable INT8 (Dynamic)', config, true, this.panel, cell, run); - await this.optimizeCode(currentTexts, 'pytorch_inc_dynamic_quant', 'INC Enable INT8 (Dynamic)', 'INC Enable BF16', config, true, this.panel, cell, run); - await this.optimizeCode(currentTexts, 'pytorch_inc_bf16', 'INC Enable BF16', '', config, true, this.panel, cell, run); - } - else { - console.log("arrive here 444-222"); - await this.optimizeCode(currentTexts, optimize_type, "", "", "normal", true, this.panel, cell, run); - } - this.working = false; - console.log("arrive here 555"); - return new Promise((resolve, reject) => { - resolve("success!"); - }); - } - applicable(formatter, currentWidget) { - const currentNotebookWidget = this.notebookTracker.currentWidget; - return currentNotebookWidget && currentWidget === currentNotebookWidget; - } -} diff --git a/neural_coder/extensions/neural_compressor_ext_lab/lib/index.d.ts b/neural_coder/extensions/neural_compressor_ext_lab/lib/index.d.ts deleted file mode 100644 index f256eada9ba..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/lib/index.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { JupyterFrontEndPlugin } from '@jupyterlab/application'; -/** - * Initialization data for the neural_compressor_ext_lab extension. - */ -declare const plugin: JupyterFrontEndPlugin; -export default plugin; diff --git a/neural_coder/extensions/neural_compressor_ext_lab/lib/index.js b/neural_coder/extensions/neural_compressor_ext_lab/lib/index.js deleted file mode 100644 index 190b66e0840..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/lib/index.js +++ /dev/null @@ -1,105 +0,0 @@ -import { INotebookTracker } from '@jupyterlab/notebook'; -import { ToolbarButton, showDialog, Dialog } from '@jupyterlab/apputils'; -import { ISettingRegistry } from '@jupyterlab/settingregistry'; -import { IMainMenu } from '@jupyterlab/mainmenu'; -import { LabIcon } from '@jupyterlab/ui-components'; -import { Widget } from '@lumino/widgets'; -import { JupyterlabNotebookCodeOptimizer } from './deepcoder'; -import { Constants } from './constants'; -class neural_compressor_ext_lab { - constructor(app, tracker, notebookpanel) { - this.app = app; - this.tracker = tracker; - this.notebookpanel = notebookpanel; - this.setupWidgetExtension(); - this.config = ''; - } - createNew(nb) { - this.notebookpanel = nb; - this.notebookCodeOptimizer = new JupyterlabNotebookCodeOptimizer(this.tracker, this.notebookpanel); - const svg = document.createElement("svg"); - svg.innerHTML = Constants.ICON_FORMAT_ALL_SVG; - const run_svg = document.createElement("svg"); - run_svg.innerHTML = Constants.ICON_RUN; - const div = document.createElement("div"); - div.setAttribute("class", "wrapper"); - const span = document.createElement("span"); - span.setAttribute("class", "f1ozlkqi"); - span.innerHTML = Constants.SVG; - const selector = document.createElement("select"); - selector.setAttribute("class", "aselector"); - selector.id = "NeuralCoder"; - const option1 = document.createElement("option"); - option1.value = "pytorch_inc_static_quant_fx"; - option1.innerText = "INC Enable INT8 (Static)"; - option1.selected = true; - const option2 = document.createElement("option"); - option2.value = "pytorch_inc_dynamic_quant"; - option2.innerText = "INC Enable INT8 (Dynamic)"; - const option3 = document.createElement("option"); - option3.value = "pytorch_inc_bf16"; - option3.innerText = "INC Enable BF16"; - const option4 = document.createElement("option"); - option4.value = "auto-quant"; - option4.innerText = "INC Auto Enable & Benchmark"; - selector.options.add(option1); - selector.options.add(option2); - selector.options.add(option3); - selector.options.add(option4); - div.appendChild(selector); - div.appendChild(span); - const selector_widget = new Widget(); - selector_widget.node.appendChild(div); - selector_widget.addClass("aselector"); - let notebookCodeOptimizer = this.notebookCodeOptimizer; - let config = this.config; - const dia_input = document.createElement("input"); - const dia_widget = new Widget(); - dia_widget.node.appendChild(dia_input); - dia_widget.addClass("dialog"); - const run_button = new ToolbarButton({ - tooltip: 'NeuralCoder', - icon: new LabIcon({ - name: "run", - svgstr: Constants.ICON_RUN - }), - onClick: async function () { - var _a, _b, _c, _d; - console.log("arrive here 111"); - (_d = (_c = (_b = (_a = run_button.node.firstChild) === null || _a === void 0 ? void 0 : _a.firstChild) === null || _b === void 0 ? void 0 : _b.firstChild) === null || _c === void 0 ? void 0 : _c.firstChild) === null || _d === void 0 ? void 0 : _d.replaceWith(svg); - if (selector.options[selector.selectedIndex].value === 'auto-quant') { - await showDialog({ - title: 'Please input execute parameters:', - body: dia_widget, - buttons: [Dialog.okButton({ label: 'Confirm' })] - }).then(result => { - if (result.button.accept) { - config = dia_input.value; - } - }); - } - console.log("arrive here 222"); - await notebookCodeOptimizer.optimizeAllCodeCells(config, selector.options[selector.selectedIndex].value, undefined, run_button); - } - }); - nb.toolbar.insertItem(11, "nc", run_button); - nb.toolbar.insertItem(12, "selector", selector_widget); - } - setupWidgetExtension() { - this.app.docRegistry.addWidgetExtension('Notebook', this); - } -} -/** - * Initialization data for the neural_compressor_ext_lab extension. - */ -const plugin = { - id: 'neural_compressor_ext_lab:plugin', - autoStart: true, - requires: [INotebookTracker, IMainMenu], - optional: [ISettingRegistry], - activate: (app, tracker, notebookpanel) => { - new neural_compressor_ext_lab(app, tracker, notebookpanel); - console.log('JupyterLab extension neural_compressor_ext_lab is activated!'); - } -}; -export default plugin; diff --git a/neural_coder/extensions/neural_compressor_ext_lab/lib/test.d.ts b/neural_coder/extensions/neural_compressor_ext_lab/lib/test.d.ts deleted file mode 100644 index 2c28e08c632..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/lib/test.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare let str: string; -declare let str1: number; diff --git a/neural_coder/extensions/neural_compressor_ext_lab/lib/test.js b/neural_coder/extensions/neural_compressor_ext_lab/lib/test.js deleted file mode 100644 index c679ea06c74..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/lib/test.js +++ /dev/null @@ -1,4 +0,0 @@ -"use strict"; -let str = '# this is the beginning of a single code snippet\nimport glob\nimport torch\nimport os\nimport sys\nfrom tqdm import tqdm\nfrom dalle_pytorch import VQGanVAE, DALLE, DiscreteVAE\nfrom dalle_pytorch.tokenizer import tokenizer\nfrom einops import repeat\nfrom dalle_nc import DALLE, DiscreteVAE\nfrom torch.utils.data import DataLoader\nfrom torch.utils.data import Dataset\n\n# model\nvae = DiscreteVAE(\n image_size = 8,\n num_layers = 3,\n num_tokens = 8192,\n codebook_dim = 1024,\n hidden_dim = 64,\n num_resnet_blocks = 1,\n temperature = 0.9\n)\n\ndalle = DALLE(\n dim = 1024,\n vae = vae, # automatically infer (1) image sequence length and (2) number of image tokens\n num_text_tokens = 100000, # vocab size for text\n text_seq_len = 256, # text sequence length\n depth = 12, # should aim to be 64\n heads = 16, # attention heads\n dim_head = 64, # attention head dimension\n attn_dropout = 0.1, # attention dropout\n ff_dropout = 0.1 # feedforward dropout\n)\n# [NeuralCoder] pytorch_inc_dynamic_quant for dalle [Beginning Line]\nif "GraphModule" not in str(type(dalle)):\n from neural_compressor.quantization import fit\n from neural_compressor.config import PostTrainingQuantConfig\n config = PostTrainingQuantConfig(approach="dynamic")\n dalle = fit(dalle, conf=config)\n dalle = dalle.model\n dalle.eval()\n# [NeuralCoder] pytorch_inc_dynamic_quant for dalle [Ending Line]\n\ndalle.eval()\n\n# real data for DALLE image generation\nfiles = glob.glob(\'/home2/longxin/neural_compressor_ext_lab/real_text.txt\')\n\n# create dataloader\ninput_list = []\nwith torch.no_grad():\n count = 0\n for file in files:\n texts = open(file, \'r\').read().split(\'\\n\')\n for text in texts:\n print(text)\n\n num_images = 1\n\n top_k = 0.9\n\n image_size = vae.image_size\n\n texts = text.split(\'|\')\n\n for j, text in tqdm(enumerate(texts)):\n text_tokens = tokenizer.tokenize([text], 256).to(\'cpu\')\n\n text_tokens = repeat(text_tokens, \'() n -> b n\', b=num_images)\n\n for text_chunk in tqdm(text_tokens):\n d = {}\n d["text"] = text_chunk\n d["filter_thres"] = top_k\n input_list.append(d)\n\nclass MyDataset(Dataset):\n def __init__(self):\n self.samples = input_list\n\n def __getitem__(self, idx):\n return self.samples[idx], 1\n\n def __len__(self):\n return len(self.samples)\ndataset = MyDataset()\ndataloader = DataLoader(dataset)\n\n# inference\nwith torch.no_grad():\n for step, (inputs, labels) in enumerate(dataloader):\n print("running inference ...")\n output = dalle(**inputs)\n\n'; -let str1 = str.split('# this is the beginning of a single code snippet\\n').length; -console.log(__filename); diff --git a/neural_coder/extensions/neural_compressor_ext_lab/lib/utils.d.ts b/neural_coder/extensions/neural_compressor_ext_lab/lib/utils.d.ts deleted file mode 100644 index 8b7a2173767..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/lib/utils.d.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { NotebookPanel } from '@jupyterlab/notebook'; -import { Kernel } from '@jupyterlab/services'; -import { CommandRegistry } from '@phosphor/commands'; -export default class NotebookUtilities { - /** - * generate random number - * @Min - * @Max - */ - static GetRandomNum(Min: number, Max: number): number; - /** - * Builds an HTML container by sanitizing a list of strings and converting - * them in valid HTML - * @param msg A list of string with HTML formatting - * @returns a HTMLDivElement composed of a list of spans with formatted text - */ - private static buildDialogBody; - /** - * Opens a pop-up dialog in JupyterLab to display a simple message. - * @param title The title for the message popup - * @param msg The message as an array of strings - * @param buttonLabel The label to use for the button. Default is 'OK' - * @param buttonClassName The classname to give to the 'ok' button - * @returns Promise - A promise once the message is closed. - */ - static showMessage(title: string, msg: string[], buttonLabel?: string, buttonClassName?: string): Promise; - /** - * Opens a pop-up dialog in JupyterLab to display a yes/no dialog. - * @param title The title for the message popup - * @param msg The message - * @param acceptLabel The label to use for the accept button. Default is 'YES' - * @param rejectLabel The label to use for the reject button. Default is 'NO' - * @param yesButtonClassName The classname to give to the accept button. - * @param noButtonClassName The classname to give to the cancel button. - * @returns Promise - A promise once the message is closed. - */ - static showYesNoDialog(title: string, msg: string[], acceptLabel?: string, rejectLabel?: string, yesButtonClassName?: string, noButtonClassName?: string): Promise; - /** - * Opens a pop-up dialog in JupyterLab with various information and button - * triggering reloading the page. - * @param title The title for the message popup - * @param msg The message - * @param buttonLabel The label to use for the button. Default is 'Refresh' - * @param buttonClassName The classname to give to the 'refresh' button. - * @returns Promise - A promise once the message is closed. - */ - static showRefreshDialog(title: string, msg: string[], buttonLabel?: string, buttonClassName?: string): Promise; - /** - * @description Creates a new JupyterLab notebook for use by the application - * @param command The command registry - * @returns Promise - A promise containing the notebook panel object that was created (if successful). - */ - static createNewNotebook(command: CommandRegistry): Promise; - /** - * Safely saves the Jupyter notebook document contents to disk - * @param notebookPanel The notebook panel containing the notebook to save - */ - static saveNotebook(notebookPanel: NotebookPanel): Promise; - /** - * Convert the notebook contents to JSON - * @param notebookPanel The notebook panel containing the notebook to serialize - */ - static notebookToJSON(notebookPanel: NotebookPanel): any; - /** - * @description Gets the value of a key from specified notebook's metadata. - * @param notebookPanel The notebook to get meta data from. - * @param key The key of the value. - * @returns any -The value of the metadata. Returns null if the key doesn't exist. - */ - static getMetaData(notebookPanel: NotebookPanel, key: string): any; - /** - * @description Sets the key value pair in the notebook's metadata. - * If the key doesn't exists it will add one. - * @param notebookPanel The notebook to set meta data in. - * @param key The key of the value to create. - * @param value The value to set. - * @param save Default is false. Whether the notebook should be saved after the meta data is set. - * Note: This function will not wait for the save to complete, it only sends a save request. - * @returns The old value for the key, or undefined if it did not exist. - */ - static setMetaData(notebookPanel: NotebookPanel, key: string, value: any, save?: boolean): any; - /** - * @description This function runs code directly in the notebook's kernel and then evaluates the - * result and returns it as a promise. - * @param kernel The kernel to run the code in. - * @param runCode The code to run in the kernel. - * @param userExpressions The expressions used to capture the desired info from the executed code. - * @param runSilent Default is false. If true, kernel will execute as quietly as possible. - * store_history will be set to false, and no broadcast on IOPUB channel will be made. - * @param storeHistory Default is false. If true, the code executed will be stored in the kernel's history - * and the counter which is shown in the cells will be incremented to reflect code was run. - * @param allowStdIn Default is false. If true, code running in kernel can prompt user for input using - * an input_request message. - * @param stopOnError Default is false. If True, does not abort the execution queue, if an exception is encountered. - * This allows the queued execution of multiple execute_requests, even if they generate exceptions. - * @returns Promise - A promise containing the execution results of the code as an object with - * keys based on the user_expressions. - * @example - * //The code - * const code = "a=123\nb=456\nsum=a+b"; - * //The user expressions - * const expr = {sum: "sum",prod: "a*b",args:"[a,b,sum]"}; - * //Async function call (returns a promise) - * sendKernelRequest(notebookPanel, code, expr,false); - * //Result when promise resolves: - * { - * sum:{status:"ok",data:{"text/plain":"579"},metadata:{}}, - * prod:{status:"ok",data:{"text/plain":"56088"},metadata:{}}, - * args:{status:"ok",data:{"text/plain":"[123, 456, 579]"}} - * } - * @see For more information on JupyterLab messages: - * https://jupyter-client.readthedocs.io/en/latest/messaging.html#execution-results - */ - static sendKernelRequest(kernel: Kernel.IKernelConnection | null | undefined, runCode: string, userExpressions: any, runSilent?: boolean, storeHistory?: boolean, allowStdIn?: boolean, stopOnError?: boolean): Promise; - /** - * Same as method sendKernelRequest but passing - * a NotebookPanel instead of a Kernel - */ - static sendKernelRequestFromNotebook(notebookPanel: NotebookPanel, runCode: string, userExpressions: any, runSilent?: boolean, storeHistory?: boolean, allowStdIn?: boolean, stopOnError?: boolean): Promise; -} diff --git a/neural_coder/extensions/neural_compressor_ext_lab/lib/utils.js b/neural_coder/extensions/neural_compressor_ext_lab/lib/utils.js deleted file mode 100644 index 5ac72df1071..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/lib/utils.js +++ /dev/null @@ -1,270 +0,0 @@ -/* - * Copyright 2019-2020 The Kale Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { Dialog, showDialog } from '@jupyterlab/apputils'; -// @ts-ignore -import SanitizedHTML from 'react-sanitized-html'; -import * as React from 'react'; -export default class NotebookUtilities { - /** - * generate random number - * @Min - * @Max - */ - static GetRandomNum(Min, Max) { - let Range; - Range = Max - Min; - var Rand = Math.random(); - return (Min + Math.round(Rand * Range)); - } - /** - * Builds an HTML container by sanitizing a list of strings and converting - * them in valid HTML - * @param msg A list of string with HTML formatting - * @returns a HTMLDivElement composed of a list of spans with formatted text - */ - static buildDialogBody(msg) { - return (React.createElement("div", null, msg.map((s, i) => { - return (React.createElement(React.Fragment, { key: `msg-${i}` }, - React.createElement(SanitizedHTML, { allowedAttributes: { a: ['href'] }, allowedTags: ['b', 'i', 'em', 'strong', 'a', 'pre'], html: s }), - React.createElement("br", null))); - }))); - } - /** - * Opens a pop-up dialog in JupyterLab to display a simple message. - * @param title The title for the message popup - * @param msg The message as an array of strings - * @param buttonLabel The label to use for the button. Default is 'OK' - * @param buttonClassName The classname to give to the 'ok' button - * @returns Promise - A promise once the message is closed. - */ - static async showMessage(title, msg, buttonLabel = 'Dismiss', buttonClassName = '') { - const buttons = [ - Dialog.okButton({ label: buttonLabel, className: buttonClassName }), - ]; - const messageBody = this.buildDialogBody(msg); - await showDialog({ title, buttons, body: messageBody }); - } - /** - * Opens a pop-up dialog in JupyterLab to display a yes/no dialog. - * @param title The title for the message popup - * @param msg The message - * @param acceptLabel The label to use for the accept button. Default is 'YES' - * @param rejectLabel The label to use for the reject button. Default is 'NO' - * @param yesButtonClassName The classname to give to the accept button. - * @param noButtonClassName The classname to give to the cancel button. - * @returns Promise - A promise once the message is closed. - */ - static async showYesNoDialog(title, msg, acceptLabel = 'YES', rejectLabel = 'NO', yesButtonClassName = '', noButtonClassName = '') { - const buttons = [ - Dialog.okButton({ label: acceptLabel, className: yesButtonClassName }), - Dialog.cancelButton({ label: rejectLabel, className: noButtonClassName }), - ]; - const messageBody = this.buildDialogBody(msg); - const result = await showDialog({ title, buttons, body: messageBody }); - return result.button.label === acceptLabel; - } - /** - * Opens a pop-up dialog in JupyterLab with various information and button - * triggering reloading the page. - * @param title The title for the message popup - * @param msg The message - * @param buttonLabel The label to use for the button. Default is 'Refresh' - * @param buttonClassName The classname to give to the 'refresh' button. - * @returns Promise - A promise once the message is closed. - */ - static async showRefreshDialog(title, msg, buttonLabel = 'Refresh', buttonClassName = '') { - await this.showMessage(title, msg, buttonLabel, buttonClassName); - location.reload(); - } - /** - * @description Creates a new JupyterLab notebook for use by the application - * @param command The command registry - * @returns Promise - A promise containing the notebook panel object that was created (if successful). - */ - static async createNewNotebook(command) { - const notebook = await command.execute('notebook:create-new', { - activate: true, - path: '', - preferredLanguage: '', - }); - await notebook.session.ready; - return notebook; - } - /** - * Safely saves the Jupyter notebook document contents to disk - * @param notebookPanel The notebook panel containing the notebook to save - */ - static async saveNotebook(notebookPanel) { - if (notebookPanel) { - await notebookPanel.context.ready; - notebookPanel.context.save(); - return true; - } - return false; - } - /** - * Convert the notebook contents to JSON - * @param notebookPanel The notebook panel containing the notebook to serialize - */ - static notebookToJSON(notebookPanel) { - if (notebookPanel.content.model) { - return notebookPanel.content.model.toJSON(); - } - return null; - } - /** - * @description Gets the value of a key from specified notebook's metadata. - * @param notebookPanel The notebook to get meta data from. - * @param key The key of the value. - * @returns any -The value of the metadata. Returns null if the key doesn't exist. - */ - static getMetaData(notebookPanel, key) { - if (!notebookPanel) { - throw new Error('The notebook is null or undefined. No meta data available.'); - } - if (notebookPanel.model && notebookPanel.model.metadata.has(key)) { - return notebookPanel.model.metadata.get(key); - } - return null; - } - /** - * @description Sets the key value pair in the notebook's metadata. - * If the key doesn't exists it will add one. - * @param notebookPanel The notebook to set meta data in. - * @param key The key of the value to create. - * @param value The value to set. - * @param save Default is false. Whether the notebook should be saved after the meta data is set. - * Note: This function will not wait for the save to complete, it only sends a save request. - * @returns The old value for the key, or undefined if it did not exist. - */ - static setMetaData(notebookPanel, key, value, save = false) { - var _a; - if (!notebookPanel) { - throw new Error('The notebook is null or undefined. No meta data available.'); - } - const oldVal = (_a = notebookPanel.model) === null || _a === void 0 ? void 0 : _a.metadata.set(key, value); - if (save) { - this.saveNotebook(notebookPanel); - } - return oldVal; - } - // /** - // * Get a new Kernel, not tied to a Notebook - // * Source code here: https://github.com/jupyterlab/jupyterlab/tree/473348d25bcb258ca2f0c127dd8fb5b193217135/packages/services - // */ - // public static async createNewKernel() { - // // Get info about the available kernels and start a new one. - // let options: Kernel.IOptions = await Kernel.getSpecs().then(kernelSpecs => { - // // console.log('Default spec:', kernelSpecs.default); - // // console.log('Available specs', Object.keys(kernelSpecs.kernelspecs)); - // // use the default name - // return { name: kernelSpecs.default }; - // }); - // return await Kernel.startNew(options).then(_kernel => { - // return _kernel; - // }); - // } - // // TODO: We can use this context manager to execute commands inside a new kernel - // // and be sure that it will be disposed of at the end. - // // Another approach could be to create a kale_rpc Kernel, as a singleton, - // // created at startup. The only (possible) drawback is that we can not name - // // a kernel instance with a custom id/name, so when refreshing JupyterLab we would - // // not recognize the kernel. A solution could be to have a kernel spec dedicated to kale rpc calls. - // public static async executeWithNewKernel(action: Function, args: any[] = []) { - // // create brand new kernel - // const _k = await this.createNewKernel(); - // // execute action inside kernel - // const res = await action(_k, ...args); - // // close kernel - // _k.shutdown(); - // // return result - // return res; - // } - /** - * @description This function runs code directly in the notebook's kernel and then evaluates the - * result and returns it as a promise. - * @param kernel The kernel to run the code in. - * @param runCode The code to run in the kernel. - * @param userExpressions The expressions used to capture the desired info from the executed code. - * @param runSilent Default is false. If true, kernel will execute as quietly as possible. - * store_history will be set to false, and no broadcast on IOPUB channel will be made. - * @param storeHistory Default is false. If true, the code executed will be stored in the kernel's history - * and the counter which is shown in the cells will be incremented to reflect code was run. - * @param allowStdIn Default is false. If true, code running in kernel can prompt user for input using - * an input_request message. - * @param stopOnError Default is false. If True, does not abort the execution queue, if an exception is encountered. - * This allows the queued execution of multiple execute_requests, even if they generate exceptions. - * @returns Promise - A promise containing the execution results of the code as an object with - * keys based on the user_expressions. - * @example - * //The code - * const code = "a=123\nb=456\nsum=a+b"; - * //The user expressions - * const expr = {sum: "sum",prod: "a*b",args:"[a,b,sum]"}; - * //Async function call (returns a promise) - * sendKernelRequest(notebookPanel, code, expr,false); - * //Result when promise resolves: - * { - * sum:{status:"ok",data:{"text/plain":"579"},metadata:{}}, - * prod:{status:"ok",data:{"text/plain":"56088"},metadata:{}}, - * args:{status:"ok",data:{"text/plain":"[123, 456, 579]"}} - * } - * @see For more information on JupyterLab messages: - * https://jupyter-client.readthedocs.io/en/latest/messaging.html#execution-results - */ - static async sendKernelRequest(kernel, runCode, userExpressions, runSilent = false, storeHistory = false, allowStdIn = false, stopOnError = false) { - if (!kernel) { - throw new Error('Kernel is null or undefined.'); - } - // Wait for kernel to be ready before sending request - // await kernel.status; - const message = await kernel.requestExecute({ - allow_stdin: allowStdIn, - code: runCode, - silent: runSilent, - stop_on_error: stopOnError, - store_history: storeHistory, - user_expressions: userExpressions, - }).done; - const content = message.content; - if (content.status !== 'ok') { - // If response is not 'ok', throw contents as error, log code - const msg = `Code caused an error:\n${runCode}`; - console.error(msg); - if (content.traceback) { - content.traceback.forEach((line) => console.log(line.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, ''))); - } - throw content; - } - // Return user_expressions of the content - return content.user_expressions; - } - /** - * Same as method sendKernelRequest but passing - * a NotebookPanel instead of a Kernel - */ - static async sendKernelRequestFromNotebook(notebookPanel, runCode, userExpressions, runSilent = false, storeHistory = false, allowStdIn = false, stopOnError = false) { - var _a, _b, _c, _d; - if (!notebookPanel) { - throw new Error('Notebook is null or undefined.'); - } - // Wait for notebook panel to be ready - await notebookPanel.activate; - await ((_a = notebookPanel.sessionContext) === null || _a === void 0 ? void 0 : _a.ready); - console.log('get kernel', (_b = notebookPanel.sessionContext.session) === null || _b === void 0 ? void 0 : _b.kernel); - return this.sendKernelRequest((_d = (_c = notebookPanel.sessionContext) === null || _c === void 0 ? void 0 : _c.session) === null || _d === void 0 ? void 0 : _d.kernel, runCode, userExpressions, runSilent, storeHistory, allowStdIn, stopOnError); - } -} diff --git a/neural_coder/extensions/neural_compressor_ext_lab/neural_compressor_ext_lab/__init__.py b/neural_coder/extensions/neural_compressor_ext_lab/neural_compressor_ext_lab/__init__.py deleted file mode 100644 index 74c4e9f68fc..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/neural_compressor_ext_lab/__init__.py +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import json -from pathlib import Path - -from ._version import __version__ - - -HERE = Path(__file__).parent.resolve() - - -with (HERE / "labextension" / "package.json").open() as fid: - data = json.load(fid) - - -def _jupyter_labextension_paths(): - return [{ - "src": "labextension", - "dest": data["name"] - }] - diff --git a/neural_coder/extensions/neural_compressor_ext_lab/neural_compressor_ext_lab/_version.py b/neural_coder/extensions/neural_compressor_ext_lab/neural_compressor_ext_lab/_version.py deleted file mode 100644 index 30cfd6b1021..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/neural_compressor_ext_lab/_version.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import json -from pathlib import Path - -__all__ = ["__version__"] - -def _fetchVersion(): - HERE = Path(__file__).parent.resolve() - - for settings in HERE.rglob("package.json"): - try: - with settings.open() as f: - version = json.load(f)["version"] - return ( - version.replace("-alpha.", "a") - .replace("-beta.", "b") - .replace("-rc.", "rc") - ) - except FileNotFoundError: - pass - - raise FileNotFoundError(f"Could not find package.json under dir {HERE!s}") - -__version__ = _fetchVersion() diff --git a/neural_coder/extensions/neural_compressor_ext_lab/neural_compressor_ext_lab/labextension/build_log.json b/neural_coder/extensions/neural_compressor_ext_lab/neural_compressor_ext_lab/labextension/build_log.json deleted file mode 100644 index 30f46e6eba0..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/neural_compressor_ext_lab/labextension/build_log.json +++ /dev/null @@ -1,651 +0,0 @@ -[ - { - "bail": false, - "module": { - "rules": [ - { - "test": {}, - "use": [ - "style-loader", - "css-loader" - ] - }, - { - "test": {}, - "use": "raw-loader" - }, - { - "test": {}, - "use": "raw-loader" - }, - { - "test": {}, - "use": "file-loader" - }, - { - "test": {}, - "use": "file-loader" - }, - { - "test": {}, - "use": "url-loader?limit=10000&mimetype=application/font-woff" - }, - { - "test": {}, - "use": "url-loader?limit=10000&mimetype=application/font-woff" - }, - { - "test": {}, - "use": "url-loader?limit=10000&mimetype=application/octet-stream" - }, - { - "test": {}, - "use": "file-loader" - }, - { - "test": {}, - "issuer": {}, - "use": { - "loader": "svg-url-loader", - "options": { - "encoding": "none", - "limit": 10000 - } - } - }, - { - "test": {}, - "issuer": {}, - "use": { - "loader": "raw-loader" - } - }, - { - "test": {}, - "type": "javascript/auto" - }, - { - "test": {}, - "resolve": { - "fullySpecified": false - } - }, - { - "test": {}, - "resolve": { - "fullySpecified": false - } - }, - { - "test": {}, - "use": "file-loader" - } - ] - }, - "resolve": { - "alias": {}, - "fallback": { - "url": false, - "buffer": false, - "crypto": false, - "path": "/home/demo/longxin/neural_compressor_ext_lab/node_modules/path-browserify/index.js", - "process": "/home/demo/longxin/neural_compressor_ext_lab/node_modules/process/browser.js" - } - }, - "watchOptions": { - "poll": 500, - "aggregateTimeout": 1000 - }, - "output": { - "hashFunction": "sha256", - "filename": "[name].[contenthash].js", - "path": "/home/demo/longxin/neural_compressor_ext_lab/neural_compressor_ext_lab/labextension/static", - "publicPath": "auto" - }, - "plugins": [ - { - "definitions": { - "process": "process/browser" - } - }, - { - "_options": { - "name": "neural_compressor_ext_lab", - "library": { - "type": "var", - "name": [ - "_JUPYTERLAB", - "neural_compressor_ext_lab" - ] - }, - "filename": "remoteEntry.[contenthash].js", - "exposes": { - "./index": "/home/demo/longxin/neural_compressor_ext_lab/lib/index.js", - "./extension": "/home/demo/longxin/neural_compressor_ext_lab/lib/index.js", - "./style": "/home/demo/longxin/neural_compressor_ext_lab/style/index.js" - }, - "shared": { - "@jupyterlab/application": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/application-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/apputils-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/cell-toolbar-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/celltags-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/codemirror-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/completer-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/console-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/coreutils": { - "requiredVersion": "^5.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/csvviewer-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/debugger-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/docmanager-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/docprovider-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/documentsearch-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/extensionmanager-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/filebrowser-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/fileeditor-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/help-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/htmlviewer-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/hub-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/imageviewer-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/inspector-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/javascript-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/json-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/launcher-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/logconsole-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/mainmenu-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/markdownviewer-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/mathjax2-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/notebook-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/pdf-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/rendermime-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/running-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/settingeditor-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/shortcuts-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/statusbar-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/terminal-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/theme-dark-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/theme-light-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/toc-extension": { - "requiredVersion": "^5.4.7", - "import": false - }, - "@jupyterlab/tooltip-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/translation-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/ui-components-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/vdom-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/vega5-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/apputils": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/attachments": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/cell-toolbar": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/cells": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/celltags": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/codeeditor": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/codemirror": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/completer": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/console": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/csvviewer": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/debugger": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/docmanager": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/docprovider": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/docregistry": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/documentsearch": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/extensionmanager": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/filebrowser": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/fileeditor": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/htmlviewer": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/imageviewer": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/inspector": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/launcher": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/logconsole": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/mainmenu": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/markdownviewer": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/mathjax2": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/metapackage": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/nbconvert-css": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/nbformat": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/notebook": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/observables": { - "requiredVersion": "^4.4.7", - "import": false - }, - "@jupyterlab/outputarea": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/property-inspector": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/rendermime": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/rendermime-interfaces": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/running": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/services": { - "requiredVersion": "^6.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/settingeditor": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/settingregistry": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/shared-models": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/statedb": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/statusbar": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/terminal": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/toc": { - "requiredVersion": "^5.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/tooltip": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/translation": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/ui-components": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/vdom": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@lumino/algorithm": { - "requiredVersion": "^1.9.0", - "import": false, - "singleton": true - }, - "@lumino/application": { - "requiredVersion": "^1.27.0", - "import": false, - "singleton": true - }, - "@lumino/commands": { - "requiredVersion": "^1.19.0", - "import": false, - "singleton": true - }, - "@lumino/coreutils": { - "requiredVersion": "^1.11.0", - "import": false, - "singleton": true - }, - "@lumino/disposable": { - "requiredVersion": "^1.10.0", - "import": false, - "singleton": true - }, - "@lumino/domutils": { - "requiredVersion": "^1.8.0", - "import": false, - "singleton": true - }, - "@lumino/dragdrop": { - "requiredVersion": "^1.13.0", - "import": false, - "singleton": true - }, - "@lumino/messaging": { - "requiredVersion": "^1.10.0", - "import": false, - "singleton": true - }, - "@lumino/properties": { - "requiredVersion": "^1.8.0", - "import": false, - "singleton": true - }, - "@lumino/signaling": { - "requiredVersion": "^1.10.0", - "import": false, - "singleton": true - }, - "@lumino/virtualdom": { - "requiredVersion": "^1.14.0", - "import": false, - "singleton": true - }, - "@lumino/widgets": { - "requiredVersion": "^1.33.0", - "import": false, - "singleton": true - }, - "react": { - "requiredVersion": "^17.0.1", - "import": false, - "singleton": true - }, - "react-dom": { - "requiredVersion": "^17.0.1", - "import": false, - "singleton": true - }, - "yjs": { - "requiredVersion": "^13.5.17", - "import": false, - "singleton": true - }, - "@phosphor/commands": {}, - "@types/lerna__child-process": {}, - "@types/shelljs": {}, - "ajv": {}, - "ajv-keywords": {}, - "assert": {}, - "browserify-fs": {}, - "brython": {}, - "buffer": {}, - "cacheable-request": {}, - "child_process": {}, - "clone-response": {}, - "constants": {}, - "css-loader": {}, - "duplicate-package-checker-webpack-plugin": {}, - "enhanced-resolve": {}, - "es-abstract": {}, - "es-to-primitive": {}, - "fs": {}, - "got": {}, - "has": {}, - "icss-utils": {}, - "react-sanitized-html": {}, - "sanitize-html": {}, - "shelljs": {}, - "stream": {}, - "util": {}, - "neural_compressor_ext_lab": { - "version": "0.1.0", - "singleton": true, - "import": "/home/demo/longxin/neural_compressor_ext_lab/lib/index.js" - } - } - } - }, - {} - ], - "mode": "development", - "devtool": "source-map", - "entry": {} - } -] \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_lab/neural_compressor_ext_lab/labextension/package.json b/neural_coder/extensions/neural_compressor_ext_lab/neural_compressor_ext_lab/labextension/package.json deleted file mode 100644 index b5d8d15ca60..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/neural_compressor_ext_lab/labextension/package.json +++ /dev/null @@ -1,164 +0,0 @@ -{ - "name": "jupyter-lab-neural-compressor", - "version": "1.0.2", - "description": "Intel® Neural Compressor auto-quantization plugin.", - "keywords": [ - "jupyter", - "jupyterlab", - "jupyterlab-extension" - ], - "homepage": "https://github.com/intel/neural-compressor/tree/master/neural_coder/extensions/neural_compressor_ext_lab", - "bugs": { - "url": "https://github.com/intel/neural-compressor/tree/master/neural_coder/extensions/neural_compressor_ext_lab" - }, - "license": "BSD-3-Clause", - "author": { - "name": "neural_compressor_ext_lab", - "email": "inc.maintainers@intel.com" - }, - "files": [ - "lib/**/*.{d.ts,eot,gif,html,jpg,js,js.map,json,png,svg,woff2,ttf}", - "style/**/*.{css,js,eot,gif,html,jpg,json,png,svg,woff2,ttf}" - ], - "main": "lib/index.js", - "types": "lib/index.d.ts", - "style": "style/index.css", - "repository": { - "type": "git", - "url": "https://github.com/intel/neural-compressor.git" - }, - "scripts": { - "preinstall": "npx npm-force-resolutions", - "build": "jlpm build:lib && jlpm build:labextension:dev", - "build:prod": "jlpm clean && jlpm build:lib && jlpm build:labextension", - "build:labextension": "jupyter labextension build .", - "build:labextension:dev": "jupyter labextension build --development True .", - "build:lib": "tsc", - "clean": "jlpm clean:lib", - "clean:lib": "rimraf lib tsconfig.tsbuildinfo", - "clean:lintcache": "rimraf .eslintcache .stylelintcache", - "clean:labextension": "rimraf neural_compressor_ext_lab/labextension", - "clean:all": "jlpm clean:lib && jlpm clean:labextension && jlpm clean:lintcache", - "eslint": "jlpm eslint:check --fix", - "eslint:check": "eslint . --cache --ext .ts,.tsx", - "install:extension": "jlpm build", - "lint": "jlpm stylelint && jlpm prettier && jlpm eslint", - "lint:check": "jlpm stylelint:check && jlpm prettier:check && jlpm eslint:check", - "prettier": "jlpm prettier:base --write --list-different", - "prettier:base": "prettier \"**/*{.ts,.tsx,.js,.jsx,.css,.json,.md}\"", - "prettier:check": "jlpm prettier:base --check", - "stylelint": "jlpm stylelint:check --fix", - "stylelint:check": "stylelint --cache \"style/**/*.css\"", - "watch": "run-p watch:src watch:labextension", - "watch:src": "tsc -w", - "watch:labextension": "jupyter labextension watch ." - }, - "dependencies": { - "@jupyterlab/application": "^3.4.7", - "@jupyterlab/apputils": "^3.4.7", - "@jupyterlab/cells": "^3.4.7", - "@jupyterlab/coreutils": "^5.4.7", - "@jupyterlab/docregistry": "^3.4.7", - "@jupyterlab/fileeditor": "^3.4.6", - "@jupyterlab/mainmenu": "^3.4.6", - "@jupyterlab/notebook": "^3.4.7", - "@jupyterlab/services": "^6.4.7", - "@jupyterlab/settingregistry": "^3.4.7", - "@jupyterlab/statedb": "^3.4.7", - "@lumino/coreutils": "^1.12.1", - "@lumino/messaging": "^1.10.2", - "@phosphor/commands": "^1.7.2", - "@types/lerna__child-process": "^5.1.0", - "@types/shelljs": "^0.8.11", - "ajv": "^8.11.0", - "ajv-keywords": "^5.1.0", - "assert": "^2.0.0", - "browserify-fs": "^1.0.0", - "brython": "^3.10.6", - "buffer": "^6.0.3", - "cacheable-request": "^10.1.2", - "child_process": "^1.0.2", - "clone-response": "^2.0.0", - "constants": "^0.0.2", - "css-loader": "^6.7.1", - "duplicate-package-checker-webpack-plugin": "^3.0.0", - "enhanced-resolve": "^5.10.0", - "es-abstract": "^1.20.2", - "es-to-primitive": "^1.2.1", - "fs": "^0.0.1-security", - "has": "^1.0.3", - "icss-utils": "^5.1.0", - "loader-utils": "^2.0.3", - "react": "^17.0.2", - "react-sanitized-html": "^2.0.0", - "sanitize-html": "^2.7.2", - "shelljs": "^0.8.5", - "stream": "^0.0.2", - "util": "^0.12.4" - }, - "devDependencies": { - "@jupyterlab/builder": "^3.1.0", - "@types/fs-extra": "^9.0.13", - "@types/node": "^18.7.15", - "@typescript-eslint/eslint-plugin": "^4.8.1", - "@typescript-eslint/parser": "^4.8.1", - "bl": "^1.2.3", - "eslint": "^7.14.0", - "eslint-config-prettier": "^6.15.0", - "eslint-plugin-prettier": "^3.1.4", - "got": "^12.1.0", - "npm-run-all": "^4.1.5", - "prettier": "^2.1.1", - "rimraf": "^3.0.2", - "semver": "^5.7.2", - "stylelint": "^15.6.0", - "stylelint-config-prettier": "^9.0.3", - "stylelint-config-recommended": "^12.0.0", - "stylelint-config-standard": "~33.0.0", - "stylelint-prettier": "^2.0.0", - "typescript": "~4.1.3" - }, - "sideEffects": [ - "style/*.css", - "style/index.js" - ], - "styleModule": "style/index.js", - "publishConfig": { - "access": "public" - }, - "jupyterlab": { - "extension": true, - "outputDir": "neural_compressor_ext_lab/labextension", - "_build": { - "load": "static/remoteEntry.34f9ad20791fd484f052.js", - "extension": "./extension", - "style": "./style" - } - }, - "browser": { - "child_process": false, - "lerna__child_process": false, - "fs": false, - "path": false, - "os": false - }, - "jupyter-releaser": { - "hooks": { - "before-build-npm": [ - "python -m pip install jupyterlab~=3.1", - "jlpm" - ], - "before-build-python": [ - "jlpm clean:all" - ] - } - }, - "resolutions": { - "got": "^12.1.0", - "semver": "^5.7.2", - "bl": "^1.2.3", - "loader-utils": "^2.0.3", - "json5": "^2.2.2", - "jsonwebtoken": "^9.0.0" - } -} \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_lab/package.json b/neural_coder/extensions/neural_compressor_ext_lab/package.json deleted file mode 100644 index 8d99f7c8fd1..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/package.json +++ /dev/null @@ -1,161 +0,0 @@ -{ - "name": "jupyter-lab-neural-compressor", - "version": "1.0.2", - "description": "Intel® Neural Compressor auto-quantization plugin.", - "keywords": [ - "jupyter", - "jupyterlab", - "jupyterlab-extension" - ], - "homepage": "https://github.com/intel/neural-compressor/tree/master/neural_coder/extensions/neural_compressor_ext_lab", - "bugs": { - "url": "https://github.com/intel/neural-compressor/tree/master/neural_coder/extensions/neural_compressor_ext_lab" - }, - "license": "BSD-3-Clause", - "author": { - "name": "neural_compressor_ext_lab", - "email": "inc.maintainers@intel.com" - }, - "files": [ - "lib/**/*.{d.ts,eot,gif,html,jpg,js,js.map,json,png,svg,woff2,ttf}", - "style/**/*.{css,js,eot,gif,html,jpg,json,png,svg,woff2,ttf}" - ], - "main": "lib/index.js", - "types": "lib/index.d.ts", - "style": "style/index.css", - "repository": { - "type": "git", - "url": "https://github.com/intel/neural-compressor.git" - }, - "scripts": { - "preinstall": "npx npm-force-resolutions", - "build": "jlpm build:lib && jlpm build:labextension:dev", - "build:prod": "jlpm clean && jlpm build:lib && jlpm build:labextension", - "build:labextension": "jupyter labextension build .", - "build:labextension:dev": "jupyter labextension build --development True .", - "build:lib": "tsc", - "clean": "jlpm clean:lib", - "clean:lib": "rimraf lib tsconfig.tsbuildinfo", - "clean:lintcache": "rimraf .eslintcache .stylelintcache", - "clean:labextension": "rimraf neural_compressor_ext_lab/labextension", - "clean:all": "jlpm clean:lib && jlpm clean:labextension && jlpm clean:lintcache", - "eslint": "jlpm eslint:check --fix", - "eslint:check": "eslint . --cache --ext .ts,.tsx", - "install:extension": "jlpm build", - "lint": "jlpm stylelint && jlpm prettier && jlpm eslint", - "lint:check": "jlpm stylelint:check && jlpm prettier:check && jlpm eslint:check", - "prettier": "jlpm prettier:base --write --list-different", - "prettier:base": "prettier \"**/*{.ts,.tsx,.js,.jsx,.css,.json,.md}\"", - "prettier:check": "jlpm prettier:base --check", - "stylelint": "jlpm stylelint:check --fix", - "stylelint:check": "stylelint --cache \"style/**/*.css\"", - "watch": "run-p watch:src watch:labextension", - "watch:src": "tsc -w", - "watch:labextension": "jupyter labextension watch ." - }, - "dependencies": { - "@jupyterlab/application": "^3.4.7", - "@jupyterlab/apputils": "^3.4.7", - "@jupyterlab/cells": "^3.4.7", - "@jupyterlab/coreutils": "^5.4.7", - "@jupyterlab/docregistry": "^3.4.7", - "@jupyterlab/fileeditor": "^3.4.6", - "@jupyterlab/mainmenu": "^3.4.6", - "@jupyterlab/notebook": "^3.4.7", - "@jupyterlab/services": "^6.4.7", - "@jupyterlab/settingregistry": "^3.4.7", - "@jupyterlab/statedb": "^3.4.7", - "@lumino/coreutils": "^1.12.1", - "@lumino/messaging": "^1.10.2", - "@phosphor/commands": "^1.7.2", - "@types/lerna__child-process": "^5.1.0", - "@types/shelljs": "^0.8.11", - "ajv": "^8.11.0", - "ajv-keywords": "^5.1.0", - "assert": "^2.0.0", - "browserify-fs": "^1.0.0", - "brython": "^3.10.6", - "buffer": "^6.0.3", - "cacheable-request": "^10.1.2", - "child_process": "^1.0.2", - "clone-response": "^2.0.0", - "constants": "^0.0.2", - "css-loader": "^6.7.1", - "duplicate-package-checker-webpack-plugin": "^3.0.0", - "enhanced-resolve": "^5.10.0", - "es-abstract": "^1.20.2", - "es-to-primitive": "^1.2.1", - "fs": "^0.0.1-security", - "has": "^1.0.3", - "icss-utils": "^5.1.0", - "loader-utils": "^2.0.3", - "react": "^17.0.2", - "react-sanitized-html": "^2.0.0", - "sanitize-html": "^2.7.2", - "shelljs": "^0.8.5", - "stream": "^0.0.2", - "util": "^0.12.4" - }, - "devDependencies": { - "@jupyterlab/builder": "^3.1.0", - "@types/fs-extra": "^9.0.13", - "@types/node": "^18.7.15", - "@typescript-eslint/eslint-plugin": "^4.8.1", - "@typescript-eslint/parser": "^4.8.1", - "bl": "^1.2.3", - "eslint": "^7.14.0", - "eslint-config-prettier": "^6.15.0", - "eslint-plugin-prettier": "^3.1.4", - "got": "^12.1.0", - "json5": "^2.2.2", - "jsonwebtoken": "^9.0.0", - "npm-run-all": "^4.1.5", - "prettier": "^2.1.1", - "rimraf": "^3.0.2", - "semver": "^5.7.2", - "stylelint": "^15.6.0", - "stylelint-config-prettier": "^9.0.3", - "stylelint-config-recommended": "^12.0.0", - "stylelint-config-standard": "~33.0.0", - "stylelint-prettier": "^2.0.0", - "typescript": "~4.1.3" - }, - "sideEffects": [ - "style/*.css", - "style/index.js" - ], - "styleModule": "style/index.js", - "publishConfig": { - "access": "public" - }, - "jupyterlab": { - "extension": true, - "outputDir": "neural_compressor_ext_lab/labextension" - }, - "browser": { - "child_process": false, - "lerna__child_process": false, - "fs": false, - "path": false, - "os": false - }, - "jupyter-releaser": { - "hooks": { - "before-build-npm": [ - "python -m pip install jupyterlab~=3.1", - "jlpm" - ], - "before-build-python": [ - "jlpm clean:all" - ] - } - }, - "resolutions": { - "got": "^12.1.0", - "semver": "^5.7.2", - "bl": "^1.2.3", - "loader-utils": "^2.0.3", - "json5": "^2.2.2", - "jsonwebtoken": "^9.0.0" - } -} diff --git a/neural_coder/extensions/neural_compressor_ext_lab/pyproject.toml b/neural_coder/extensions/neural_compressor_ext_lab/pyproject.toml deleted file mode 100644 index d306143f14f..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/pyproject.toml +++ /dev/null @@ -1,17 +0,0 @@ -[build-system] -requires = ["jupyter_packaging~=0.10,<2", "jupyterlab~=3.1"] -build-backend = "jupyter_packaging.build_api" - -[tool.jupyter-packaging.options] -skip-if-exists = ["neural_compressor_ext_lab/labextension/static/style.js"] -ensured-targets = ["neural_compressor_ext_lab/labextension/static/style.js", "neural_compressor_ext_lab/labextension/package.json"] - -[tool.jupyter-packaging.builder] -factory = "jupyter_packaging.npm_builder" - -[tool.jupyter-packaging.build-args] -build_cmd = "build:prod" -npm = ["jlpm"] - -[tool.check-manifest] -ignore = ["neural_compressor_ext_lab/labextension/**", "yarn.lock", ".*", "package-lock.json"] diff --git a/neural_coder/extensions/neural_compressor_ext_lab/setup.py b/neural_coder/extensions/neural_compressor_ext_lab/setup.py deleted file mode 100644 index 4c72409c2d8..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/setup.py +++ /dev/null @@ -1,109 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -""" -neural_compressor_ext_lab setup -""" -import json -import sys -from pathlib import Path - -import setuptools - -HERE = Path(__file__).parent.resolve() - -# Get the package info from package.json -pkg_json = json.loads((HERE / "package.json").read_bytes()) - -# The name of the project -name = "neural_compressor_ext_lab" - -lab_path = (HERE / pkg_json["jupyterlab"]["outputDir"]) - -# Representative files that should exist after a successful build -ensured_targets = [ - str(lab_path / "package.json"), - str(lab_path / "static/style.js") -] - -labext_name = pkg_json["name"] - -data_files_spec = [ - ("share/jupyter/labextensions/%s" % labext_name, str(lab_path.relative_to(HERE)), "**"), - ("share/jupyter/labextensions/%s" % labext_name, str("."), "install.json"), -] - -long_description = (HERE / "README.md").read_text(encoding="utf8") - -version = ( - pkg_json["version"] - .replace("-alpha.", "a") - .replace("-beta.", "b") - .replace("-rc.", "rc") -) - -setup_args = dict( - name=name, - version=version, - url=pkg_json["homepage"], - author=pkg_json["author"]["name"], - author_email=pkg_json["author"]["email"], - description=pkg_json["description"], - license=pkg_json["license"], - license_file="LICENSE", - long_description=long_description, - long_description_content_type="text/markdown", - packages=setuptools.find_packages(), - zip_safe=False, - include_package_data=True, - python_requires=">=3.7", - platforms="Linux, Mac OS X, Windows", - keywords=["Jupyter", "JupyterLab", "JupyterLab3"], - classifiers=[ - "License :: OSI Approved :: BSD License", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Framework :: Jupyter", - "Framework :: Jupyter :: JupyterLab", - "Framework :: Jupyter :: JupyterLab :: 3", - "Framework :: Jupyter :: JupyterLab :: Extensions", - "Framework :: Jupyter :: JupyterLab :: Extensions :: Prebuilt", - ], -) - -try: - from jupyter_packaging import ( - wrap_installers, - npm_builder, - get_data_files - ) - post_develop = npm_builder( - build_cmd="install:extension", source_dir="src", build_dir=lab_path - ) - setup_args["cmdclass"] = wrap_installers(post_develop=post_develop, ensured_targets=ensured_targets) - setup_args["data_files"] = get_data_files(data_files_spec) -except ImportError as e: - import logging - logging.basicConfig(format="%(levelname)s: %(message)s") - logging.warning("Build tool `jupyter-packaging` is missing. Install it with pip or conda.") - if not ("--name" in sys.argv or "--version" in sys.argv): - raise e - -if __name__ == "__main__": - setuptools.setup(**setup_args) diff --git a/neural_coder/extensions/neural_compressor_ext_lab/showfloor_torchvision.ipynb b/neural_coder/extensions/neural_compressor_ext_lab/showfloor_torchvision.ipynb deleted file mode 100644 index c3046ef43af..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/showfloor_torchvision.ipynb +++ /dev/null @@ -1,521 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "8783826d-c52b-4dd7-8608-fb5c32205350", - "metadata": {}, - "outputs": [], - "source": [ - "import argparse\n", - "import os\n", - "import random\n", - "import shutil\n", - "import time\n", - "import warnings\n", - "from enum import Enum\n", - "\n", - "import torch\n", - "import torch.nn as nn\n", - "import torch.nn.parallel\n", - "import torch.backends.cudnn as cudnn\n", - "import torch.distributed as dist\n", - "import torch.optim\n", - "from torch.optim.lr_scheduler import StepLR\n", - "import torch.multiprocessing as mp\n", - "import torch.utils.data\n", - "import torch.utils.data.distributed\n", - "import torchvision.transforms as transforms\n", - "import torchvision.datasets as datasets\n", - "import torchvision.models as models\n", - "from torch.utils.data import Subset\n", - "\n", - "model_names = models.list_models(module=models)\n", - "\n", - "parser = argparse.ArgumentParser(description='PyTorch ImageNet Training')\n", - "parser.add_argument('data', metavar='DIR', nargs='?', default='imagenet',\n", - " help='path to dataset (default: imagenet)')\n", - "parser.add_argument('-a', '--arch', metavar='ARCH', default='resnet18',\n", - " choices=model_names,\n", - " help='model architecture: ' +\n", - " ' | '.join(model_names) +\n", - " ' (default: resnet18)')\n", - "parser.add_argument('-j', '--workers', default=4, type=int, metavar='N',\n", - " help='number of data loading workers (default: 4)')\n", - "parser.add_argument('--epochs', default=90, type=int, metavar='N',\n", - " help='number of total epochs to run')\n", - "parser.add_argument('--start-epoch', default=0, type=int, metavar='N',\n", - " help='manual epoch number (useful on restarts)')\n", - "parser.add_argument('-b', '--batch-size', default=256, type=int,\n", - " metavar='N',\n", - " help='mini-batch size (default: 256), this is the total '\n", - " 'batch size of all GPUs on the current node when '\n", - " 'using Data Parallel or Distributed Data Parallel')\n", - "parser.add_argument('--lr', '--learning-rate', default=0.1, type=float,\n", - " metavar='LR', help='initial learning rate', dest='lr')\n", - "parser.add_argument('--momentum', default=0.9, type=float, metavar='M',\n", - " help='momentum')\n", - "parser.add_argument('--wd', '--weight-decay', default=1e-4, type=float,\n", - " metavar='W', help='weight decay (default: 1e-4)',\n", - " dest='weight_decay')\n", - "parser.add_argument('-p', '--print-freq', default=10, type=int,\n", - " metavar='N', help='print frequency (default: 10)')\n", - "parser.add_argument('--resume', default='', type=str, metavar='PATH',\n", - " help='path to latest checkpoint (default: none)')\n", - "parser.add_argument('-e', '--evaluate', dest='evaluate', action='store_true',\n", - " help='evaluate model on validation set')\n", - "parser.add_argument('--pretrained', dest='pretrained', action='store_true',\n", - " help='use pre-trained model')\n", - "parser.add_argument('--world-size', default=-1, type=int,\n", - " help='number of nodes for distributed training')\n", - "parser.add_argument('--rank', default=-1, type=int,\n", - " help='node rank for distributed training')\n", - "parser.add_argument('--dist-url', default='tcp://224.66.41.62:23456', type=str,\n", - " help='url used to set up distributed training')\n", - "parser.add_argument('--dist-backend', default='nccl', type=str,\n", - " help='distributed backend')\n", - "parser.add_argument('--seed', default=None, type=int,\n", - " help='seed for initializing training. ')\n", - "parser.add_argument('--gpu', default=None, type=int,\n", - " help='GPU id to use.')\n", - "parser.add_argument('--multiprocessing-distributed', action='store_true',\n", - " help='Use multi-processing distributed training to launch '\n", - " 'N processes per node, which has N GPUs. This is the '\n", - " 'fastest way to use PyTorch for either single node or '\n", - " 'multi node data parallel training')\n", - "parser.add_argument('--dummy', action='store_true', help=\"use fake data to benchmark\")\n", - "\n", - "best_acc1 = 0\n", - "\n", - "\n", - "def main():\n", - " args = parser.parse_args()\n", - "\n", - " if args.seed is not None:\n", - " random.seed(args.seed)\n", - " torch.manual_seed(args.seed)\n", - " cudnn.deterministic = True\n", - " cudnn.benchmark = False\n", - " warnings.warn('You have chosen to seed training. '\n", - " 'This will turn on the CUDNN deterministic setting, '\n", - " 'which can slow down your training considerably! '\n", - " 'You may see unexpected behavior when restarting '\n", - " 'from checkpoints.')\n", - "\n", - " if args.gpu is not None:\n", - " warnings.warn('You have chosen a specific GPU. This will completely '\n", - " 'disable data parallelism.')\n", - "\n", - " if args.dist_url == \"env://\" and args.world_size == -1:\n", - " args.world_size = int(os.environ[\"WORLD_SIZE\"])\n", - "\n", - " args.distributed = args.world_size > 1 or args.multiprocessing_distributed\n", - "\n", - " ngpus_per_node = torch.cuda.device_count()\n", - " if args.multiprocessing_distributed:\n", - " # Since we have ngpus_per_node processes per node, the total world_size\n", - " # needs to be adjusted accordingly\n", - " args.world_size = ngpus_per_node * args.world_size\n", - " # Use torch.multiprocessing.spawn to launch distributed processes: the\n", - " # main_worker process function\n", - " mp.spawn(main_worker, nprocs=ngpus_per_node, args=(ngpus_per_node, args))\n", - " else:\n", - " # Simply call main_worker function\n", - " main_worker(args.gpu, ngpus_per_node, args)\n", - "\n", - "\n", - "def main_worker(gpu, ngpus_per_node, args):\n", - " global best_acc1\n", - " args.gpu = gpu\n", - "\n", - " if args.gpu is not None:\n", - " print(\"Use GPU: {} for training\".format(args.gpu))\n", - "\n", - " if args.distributed:\n", - " if args.dist_url == \"env://\" and args.rank == -1:\n", - " args.rank = int(os.environ[\"RANK\"])\n", - " if args.multiprocessing_distributed:\n", - " # For multiprocessing distributed training, rank needs to be the\n", - " # global rank among all the processes\n", - " args.rank = args.rank * ngpus_per_node + gpu\n", - " dist.init_process_group(backend=args.dist_backend, init_method=args.dist_url,\n", - " world_size=args.world_size, rank=args.rank)\n", - " # create model\n", - " if args.pretrained:\n", - " print(\"=> using pre-trained model '{}'\".format(args.arch))\n", - " model = models.__dict__[args.arch](pretrained=True)\n", - " else:\n", - " print(\"=> creating model '{}'\".format(args.arch))\n", - " model = models.__dict__[args.arch]()\n", - "\n", - " if not torch.cuda.is_available():\n", - " print('using CPU, this will be slow')\n", - " elif args.distributed:\n", - " # For multiprocessing distributed, DistributedDataParallel constructor\n", - " # should always set the single device scope, otherwise,\n", - " # DistributedDataParallel will use all available devices.\n", - " if args.gpu is not None:\n", - " torch.cuda.set_device(args.gpu)\n", - " model.cuda(args.gpu)\n", - " # When using a single GPU per process and per\n", - " # DistributedDataParallel, we need to divide the batch size\n", - " # ourselves based on the total number of GPUs of the current node.\n", - " args.batch_size = int(args.batch_size / ngpus_per_node)\n", - " args.workers = int((args.workers + ngpus_per_node - 1) / ngpus_per_node)\n", - " model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu])\n", - " else:\n", - " model.cuda()\n", - " # DistributedDataParallel will divide and allocate batch_size to all\n", - " # available GPUs if device_ids are not set\n", - " model = torch.nn.parallel.DistributedDataParallel(model)\n", - " elif args.gpu is not None:\n", - " torch.cuda.set_device(args.gpu)\n", - " model = model.cuda(args.gpu)\n", - " else:\n", - " # DataParallel will divide and allocate batch_size to all available GPUs\n", - " if args.arch.startswith('alexnet') or args.arch.startswith('vgg'):\n", - " model.features = torch.nn.DataParallel(model.features)\n", - " model.cuda()\n", - " else:\n", - " model = torch.nn.DataParallel(model).cuda()\n", - "\n", - " # define loss function (criterion), optimizer, and learning rate scheduler\n", - " criterion = nn.CrossEntropyLoss().cuda(args.gpu)\n", - "\n", - " optimizer = torch.optim.SGD(model.parameters(), args.lr,\n", - " momentum=args.momentum,\n", - " weight_decay=args.weight_decay)\n", - " \n", - " \"\"\"Sets the learning rate to the initial LR decayed by 10 every 30 epochs\"\"\"\n", - " scheduler = StepLR(optimizer, step_size=30, gamma=0.1)\n", - " \n", - " # optionally resume from a checkpoint\n", - " if args.resume:\n", - " if os.path.isfile(args.resume):\n", - " print(\"=> loading checkpoint '{}'\".format(args.resume))\n", - " if args.gpu is None:\n", - " checkpoint = torch.load(args.resume)\n", - " else:\n", - " # Map model to be loaded to specified single gpu.\n", - " loc = 'cuda:{}'.format(args.gpu)\n", - " checkpoint = torch.load(args.resume, map_location=loc)\n", - " args.start_epoch = checkpoint['epoch']\n", - " best_acc1 = checkpoint['best_acc1']\n", - " if args.gpu is not None:\n", - " # best_acc1 may be from a checkpoint from a different GPU\n", - " best_acc1 = best_acc1.to(args.gpu)\n", - " model.load_state_dict(checkpoint['state_dict'])\n", - " optimizer.load_state_dict(checkpoint['optimizer'])\n", - " scheduler.load_state_dict(checkpoint['scheduler'])\n", - " print(\"=> loaded checkpoint '{}' (epoch {})\"\n", - " .format(args.resume, checkpoint['epoch']))\n", - " else:\n", - " print(\"=> no checkpoint found at '{}'\".format(args.resume))\n", - "\n", - "\n", - " # Data loading code\n", - " if args.dummy:\n", - " print(\"=> Dummy data is used!\")\n", - " train_dataset = datasets.FakeData(1000, (3, 224, 224), 1000, transforms.ToTensor())\n", - " val_dataset = datasets.FakeData(1000, (3, 224, 224), 1000, transforms.ToTensor())\n", - " else:\n", - " traindir = os.path.join(args.data, 'train')\n", - " valdir = os.path.join(args.data, 'val')\n", - " normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406],\n", - " std=[0.229, 0.224, 0.225])\n", - "\n", - " train_dataset = datasets.ImageFolder(\n", - " traindir,\n", - " transforms.Compose([\n", - " transforms.RandomResizedCrop(224),\n", - " transforms.RandomHorizontalFlip(),\n", - " transforms.ToTensor(),\n", - " normalize,\n", - " ]))\n", - "\n", - " val_dataset = datasets.ImageFolder(\n", - " valdir,\n", - " transforms.Compose([\n", - " transforms.Resize(256),\n", - " transforms.CenterCrop(224),\n", - " transforms.ToTensor(),\n", - " normalize,\n", - " ]))\n", - "\n", - " if args.distributed:\n", - " train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset)\n", - " val_sampler = torch.utils.data.distributed.DistributedSampler(val_dataset, shuffle=False, drop_last=True)\n", - " else:\n", - " train_sampler = None\n", - " val_sampler = None\n", - "\n", - " train_loader = torch.utils.data.DataLoader(\n", - " train_dataset, batch_size=args.batch_size, shuffle=(train_sampler is None),\n", - " num_workers=args.workers, pin_memory=True, sampler=train_sampler)\n", - "\n", - " val_loader = torch.utils.data.DataLoader(\n", - " val_dataset, batch_size=args.batch_size, shuffle=False,\n", - " num_workers=args.workers, pin_memory=True, sampler=val_sampler)\n", - "\n", - " if args.evaluate:\n", - " validate(val_loader, model, criterion, args)\n", - " return\n", - "\n", - " for epoch in range(args.start_epoch, args.epochs):\n", - " if args.distributed:\n", - " train_sampler.set_epoch(epoch)\n", - "\n", - " # train for one epoch\n", - " train(train_loader, model, criterion, optimizer, epoch, args)\n", - "\n", - " # evaluate on validation set\n", - " acc1 = validate(val_loader, model, criterion, args)\n", - " \n", - " scheduler.step()\n", - "\n", - " \n", - " # remember best acc@1 and save checkpoint\n", - " is_best = acc1 > best_acc1\n", - " best_acc1 = max(acc1, best_acc1)\n", - "\n", - " if not args.multiprocessing_distributed or (args.multiprocessing_distributed\n", - " and args.rank % ngpus_per_node == 0):\n", - " save_checkpoint({\n", - " 'epoch': epoch + 1,\n", - " 'arch': args.arch,\n", - " 'state_dict': model.state_dict(),\n", - " 'best_acc1': best_acc1,\n", - " 'optimizer' : optimizer.state_dict(),\n", - " 'scheduler' : scheduler.state_dict()\n", - " }, is_best)\n", - "\n", - "\n", - "def train(train_loader, model, criterion, optimizer, epoch, args):\n", - " batch_time = AverageMeter('Time', ':6.3f')\n", - " data_time = AverageMeter('Data', ':6.3f')\n", - " losses = AverageMeter('Loss', ':.4e')\n", - " top1 = AverageMeter('Acc@1', ':6.2f')\n", - " top5 = AverageMeter('Acc@5', ':6.2f')\n", - " progress = ProgressMeter(\n", - " len(train_loader),\n", - " [batch_time, data_time, losses, top1, top5],\n", - " prefix=\"Epoch: [{}]\".format(epoch))\n", - "\n", - " # switch to train mode\n", - " model.train()\n", - "\n", - " end = time.time()\n", - " for i, (images, target) in enumerate(train_loader):\n", - " # measure data loading time\n", - " data_time.update(time.time() - end)\n", - "\n", - " if args.gpu is not None:\n", - " images = images.cuda(args.gpu, non_blocking=True)\n", - " if torch.cuda.is_available():\n", - " target = target.cuda(args.gpu, non_blocking=True)\n", - "\n", - " # compute output\n", - " output = model(images)\n", - " loss = criterion(output, target)\n", - "\n", - " # measure accuracy and record loss\n", - " acc1, acc5 = accuracy(output, target, topk=(1, 5))\n", - " losses.update(loss.item(), images.size(0))\n", - " top1.update(acc1[0], images.size(0))\n", - " top5.update(acc5[0], images.size(0))\n", - "\n", - " # compute gradient and do SGD step\n", - " optimizer.zero_grad()\n", - " loss.backward()\n", - " optimizer.step()\n", - "\n", - " # measure elapsed time\n", - " batch_time.update(time.time() - end)\n", - " end = time.time()\n", - "\n", - " if i % args.print_freq == 0:\n", - " progress.display(i + 1)\n", - "\n", - "\n", - "def validate(val_loader, model, criterion, args):\n", - "\n", - " def run_validate(loader, base_progress=0):\n", - " with torch.no_grad():\n", - " end = time.time()\n", - " for i, (images, target) in enumerate(loader):\n", - " i = base_progress + i\n", - " if args.gpu is not None:\n", - " images = images.cuda(args.gpu, non_blocking=True)\n", - " if torch.cuda.is_available():\n", - " target = target.cuda(args.gpu, non_blocking=True)\n", - "\n", - " # compute output\n", - " output = model(images)\n", - " loss = criterion(output, target)\n", - "\n", - " # measure accuracy and record loss\n", - " acc1, acc5 = accuracy(output, target, topk=(1, 5))\n", - " losses.update(loss.item(), images.size(0))\n", - " top1.update(acc1[0], images.size(0))\n", - " top5.update(acc5[0], images.size(0))\n", - "\n", - " # measure elapsed time\n", - " batch_time.update(time.time() - end)\n", - " end = time.time()\n", - "\n", - " if i % args.print_freq == 0:\n", - " progress.display(i + 1)\n", - "\n", - " batch_time = AverageMeter('Time', ':6.3f', Summary.NONE)\n", - " losses = AverageMeter('Loss', ':.4e', Summary.NONE)\n", - " top1 = AverageMeter('Acc@1', ':6.2f', Summary.AVERAGE)\n", - " top5 = AverageMeter('Acc@5', ':6.2f', Summary.AVERAGE)\n", - " progress = ProgressMeter(\n", - " len(val_loader) + (args.distributed and (len(val_loader.sampler) * args.world_size < len(val_loader.dataset))),\n", - " [batch_time, losses, top1, top5],\n", - " prefix='Test: ')\n", - "\n", - " # switch to evaluate mode\n", - " model.eval()\n", - "\n", - " run_validate(val_loader)\n", - " if args.distributed:\n", - " top1.all_reduce()\n", - " top5.all_reduce()\n", - "\n", - " if args.distributed and (len(val_loader.sampler) * args.world_size < len(val_loader.dataset)):\n", - " aux_val_dataset = Subset(val_loader.dataset,\n", - " range(len(val_loader.sampler) * args.world_size, len(val_loader.dataset)))\n", - " aux_val_loader = torch.utils.data.DataLoader(\n", - " aux_val_dataset, batch_size=args.batch_size, shuffle=False,\n", - " num_workers=args.workers, pin_memory=True)\n", - " run_validate(aux_val_loader, len(val_loader))\n", - "\n", - " progress.display_summary()\n", - "\n", - " return top1.avg\n", - "\n", - "\n", - "def save_checkpoint(state, is_best, filename='checkpoint.pth.tar'):\n", - " torch.save(state, filename)\n", - " if is_best:\n", - " shutil.copyfile(filename, 'model_best.pth.tar')\n", - "\n", - "class Summary(Enum):\n", - " NONE = 0\n", - " AVERAGE = 1\n", - " SUM = 2\n", - " COUNT = 3\n", - "\n", - "class AverageMeter(object):\n", - " \"\"\"Computes and stores the average and current value\"\"\"\n", - " def __init__(self, name, fmt=':f', summary_type=Summary.AVERAGE):\n", - " self.name = name\n", - " self.fmt = fmt\n", - " self.summary_type = summary_type\n", - " self.reset()\n", - "\n", - " def reset(self):\n", - " self.val = 0\n", - " self.avg = 0\n", - " self.sum = 0\n", - " self.count = 0\n", - "\n", - " def update(self, val, n=1):\n", - " self.val = val\n", - " self.sum += val * n\n", - " self.count += n\n", - " self.avg = self.sum / self.count\n", - "\n", - " def all_reduce(self):\n", - " device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n", - " total = torch.tensor([self.sum, self.count], dtype=torch.float32, device=device)\n", - " dist.all_reduce(total, dist.ReduceOp.SUM, async_op=False)\n", - " self.sum, self.count = total.tolist()\n", - " self.avg = self.sum / self.count\n", - "\n", - " def __str__(self):\n", - " fmtstr = '{name} {val' + self.fmt + '} ({avg' + self.fmt + '})'\n", - " return fmtstr.format(**self.__dict__)\n", - " \n", - " def summary(self):\n", - " fmtstr = ''\n", - " if self.summary_type is Summary.NONE:\n", - " fmtstr = ''\n", - " elif self.summary_type is Summary.AVERAGE:\n", - " fmtstr = '{name} {avg:.3f}'\n", - " elif self.summary_type is Summary.SUM:\n", - " fmtstr = '{name} {sum:.3f}'\n", - " elif self.summary_type is Summary.COUNT:\n", - " fmtstr = '{name} {count:.3f}'\n", - " else:\n", - " raise ValueError('invalid summary type %r' % self.summary_type)\n", - " \n", - " return fmtstr.format(**self.__dict__)\n", - "\n", - "\n", - "class ProgressMeter(object):\n", - " def __init__(self, num_batches, meters, prefix=\"\"):\n", - " self.batch_fmtstr = self._get_batch_fmtstr(num_batches)\n", - " self.meters = meters\n", - " self.prefix = prefix\n", - "\n", - " def display(self, batch):\n", - " entries = [self.prefix + self.batch_fmtstr.format(batch)]\n", - " entries += [str(meter) for meter in self.meters]\n", - " print('\\t'.join(entries))\n", - " \n", - " def display_summary(self):\n", - " entries = [\" *\"]\n", - " entries += [meter.summary() for meter in self.meters]\n", - " print(' '.join(entries))\n", - "\n", - " def _get_batch_fmtstr(self, num_batches):\n", - " num_digits = len(str(num_batches // 1))\n", - " fmt = '{:' + str(num_digits) + 'd}'\n", - " return '[' + fmt + '/' + fmt.format(num_batches) + ']'\n", - "\n", - "def accuracy(output, target, topk=(1,)):\n", - " \"\"\"Computes the accuracy over the k top predictions for the specified values of k\"\"\"\n", - " with torch.no_grad():\n", - " maxk = max(topk)\n", - " batch_size = target.size(0)\n", - "\n", - " _, pred = output.topk(maxk, 1, True, True)\n", - " pred = pred.t()\n", - " correct = pred.eq(target.view(1, -1).expand_as(pred))\n", - "\n", - " res = []\n", - " for k in topk:\n", - " correct_k = correct[:k].reshape(-1).float().sum(0, keepdim=True)\n", - " res.append(correct_k.mul_(100.0 / batch_size))\n", - " return res\n", - "\n", - "\n", - "if __name__ == '__main__':\n", - " main()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/neural_coder/extensions/neural_compressor_ext_lab/src/constants.ts b/neural_coder/extensions/neural_compressor_ext_lab/src/constants.ts deleted file mode 100644 index f03a215133a..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/src/constants.ts +++ /dev/null @@ -1,14 +0,0 @@ -export namespace Constants { - export const SHORT_PLUGIN_NAME = 'neural_compressor_ext_lab'; - export const WORK_PATH = "neural_coder_workspace/" - export const ICON_FORMAT_ALL_SVG = - '' - export const ICON_RUN = - '' - export const SVG = '' - export const LONG_PLUGIN_NAME = `@rya/${SHORT_PLUGIN_NAME}`; - export const SETTINGS_SECTION = `${LONG_PLUGIN_NAME}:settings`; - export const COMMAND_SECTION_NAME = 'Jupyterlab Code Optimizer'; - export const PLUGIN_VERSION = '0.1.0'; - } - \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_lab/src/deepcoder.ts b/neural_coder/extensions/neural_compressor_ext_lab/src/deepcoder.ts deleted file mode 100644 index 6dedddc6d3e..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/src/deepcoder.ts +++ /dev/null @@ -1,386 +0,0 @@ -import { Cell, CodeCell } from '@jupyterlab/cells'; -import { ToolbarButton} from '@jupyterlab/apputils'; -import { Widget } from '@lumino/widgets'; -import { INotebookTracker,NotebookPanel, Notebook, NotebookActions} from '@jupyterlab/notebook'; -import NotebookUtilities from "./utils" -import { Constants } from './constants'; - - -class JupyterlabCodeOptimizer { - protected working: boolean; - protected panel :NotebookPanel; - private tmp_path: string; - public log_path:string; - public tmp_log_path:string; - public rand:number - public markdown: Cell | undefined - - public cells:CodeCell[]; - constructor(panel: NotebookPanel) { - this.working = false; - this.panel = panel - this.tmp_path = "tmp.py" - this.rand = NotebookUtilities.GetRandomNum(0,200) - this.log_path = Constants.WORK_PATH + "NeuralCoder"+this.rand+".log"; - this.tmp_log_path = Constants.WORK_PATH+ "NeuralCoder_tmp"+".log"; - this.cells = []; - } - - - async optimizeCode( - code: string[], - formatter: string, - name:string, - next:string, - options: string | undefined, - notebook: boolean, - panel: NotebookPanel, - cell:CodeCell, - run?:ToolbarButton|undefined - ){ - let codes: string[] = [] - code.forEach(function (value) { - value = value.replace(/('\\n')/g, '^^^') - value = value.replace(/\\n"/g, '###') - value = value.replace(/\\n'/g, '###') - value = value.replace(/"\\n/g, '@@') - value = value.replace(/'\\n/g, '@@') - value = value.replace(/\n/g, '\\n') - value = value.replace(/"/g, '+++') - value = value.replace(/,/g, '$') - codes.push(value) - }) - - let gen_code = `code = "${codes}"\ncodes = code.split(',')\nwith open( '${this.tmp_path}', 'w+' ) as f:\n for i in range(0,len(codes)):\n f.write('# this is the beginning of a single code snippet\\n')\n code_list = codes[i].replace('$',',').replace('+++','\"').split('\\n')\n for line in code_list:\n if('split(^^^)' in line):\n line=line.replace('split(^^^)', 'split(\\'\\\\n\\')')\n if('###' in line):\n line=line.replace('###', '\\\\n\"')\n if('@@' in line):\n line=line.replace('@@', '\"\\\\n')\n f.write(line+'\\n')` - const expr = {code_list: `code_list`}; - NotebookUtilities.sendKernelRequestFromNotebook(panel, gen_code, expr,false); - - if(options === 'normal'){ - let runcode = `from neural_coder import enable\nenable(code="${this.tmp_path}",features=["${formatter}"], overwrite=True)`; - let expr = {sum: ` `}; - NotebookUtilities.sendKernelRequestFromNotebook(panel, runcode, expr,false); - let run_code1 = `with open("${this.tmp_path}", 'r') as f:\n optimized_code = f.read()\n` - let expr1 = {optimizedCode : "optimized_code"} - let result2 = NotebookUtilities.sendKernelRequestFromNotebook(panel,run_code1,expr1,false) - result2.then(value=>{ - let optimizedTexts = Object.values(value.optimizedCode.data)[0] as string - let optimizeCodes = optimizedTexts.split('# this is the beginning of a single code snippet\\n').slice(1,) - optimizeCodes[optimizeCodes.length-1] = optimizeCodes[optimizeCodes.length-1].slice(0,-3) - for (let i = 0; i < optimizeCodes.length; ++i) { - const cell = this.cells[i]; - const currentTexts = this.cells.map(cell => cell.model.value.text); - const currentText = currentTexts[i]; - let optimizedtext = optimizeCodes[i]; - optimizedtext = optimizedtext.replace(/\\'\\\\n\\'/g, "^^^") - optimizedtext = optimizedtext.replace(/\\\\n"/g, "+++") - optimizedtext = optimizedtext.replace(/\\\\n'/g, "+++") - optimizedtext = optimizedtext.replace(/"\\\\n/g, "@@@") - optimizedtext = optimizedtext.replace(/'\\\\n/g, "@@@") - optimizedtext = optimizedtext.replace(/\\n/g,'\n') - optimizedtext = optimizedtext.replace(/\\'/g,"'") - optimizedtext = optimizedtext.replace(/\^\^\^/g, "'\\n'") - optimizedtext = optimizedtext.replace(/\+\+\+/g, "\\n\"") - optimizedtext = optimizedtext.replace(/\@\@\@/g, "\"\\n") - if (cell.model.value.text === currentText) { - cell.model.value.text = optimizedtext; - } - const run_svg = document.createElement("svg") - run_svg.innerHTML = Constants.ICON_RUN - run?.node.firstChild?.firstChild?.firstChild?.firstChild?.replaceWith(run_svg) - } - }) - - }else{ - if(formatter === ''){ - if (this.markdown){ - this.markdown.model.value.text += "[NeuralCoder INFO] Enabling and Benchmarking for The Original Model ...... \n" - } - // cell.outputArea.node.innerText += "[NeuralCoder INFO] Enabling and Benchmarking for The Original Model ......\n" - let runcode1 = `with open("${this.log_path}", 'a' ) as f:\n f.write("[NeuralCoder INFO] Enabling and Benchmarking for The Original Model ......\\n")` - let expr1 = {path: ""}; - NotebookUtilities.sendKernelRequestFromNotebook(panel, runcode1, expr1,false); - - let runcode = `from neural_coder import enable\nperfomance, mode, path = enable(code="${this.tmp_path}",features=[], run_bench=True, args="${options}")\nwith open(path + '/bench.log', 'r') as f:\n logs = f.readlines()\nlog_line = logs[4]\nlog = log_line.split("[")[1].split("]")[0]` - let expr = {path: "path",log:"log"}; - let result = NotebookUtilities.sendKernelRequestFromNotebook(panel, runcode, expr,false); - let fps : String ; - result.then( value => { - fps = Object.values(value.log.data)[0] as string; - if(this.markdown){ - this.markdown.model.value.text += `[NeuralCoder INFO] Benchmark Result (Performance) of The Original Model is ${fps} (FPS) \n` - } - // cell.outputArea.node.innerText += `[NeuralCoder INFO] Benchmark Result (Performance) of The Original Model is ${fps} (FPS)\n` - let text = `[NeuralCoder INFO] Benchmark Result (Performance) of The Original Model is ${fps} (FPS)\\n` - let runcode = `with open("${this.log_path}", 'a' ) as f:\n f.write("${text}")` - let expr = {path: ""}; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode, expr,false); - if(this.markdown){ - this.markdown.model.value.text += `[NeuralCoder INFO] Enabling and Benchmarking for ${next} ...... \n` - } - // cell.outputArea.node.innerText += `[NeuralCoder INFO] Enabling and Benchmarking for ${next} ......\n` - let runcode1 = `with open("${this.log_path}", 'a' ) as f:\n f.write("[NeuralCoder INFO] Enabling and Benchmarking for ${next} ......\\n")` - let expr1 = {path: ""}; - NotebookUtilities.sendKernelRequestFromNotebook(panel, runcode1, expr1,false); - let runcode2 = `with open("${this.tmp_log_path}", 'a' ) as f:\n f.write("${text}")` - let expr2 = {path: ""}; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode2, expr2,false); - }) - - }else{ - - let runcode = `from neural_coder import enable\nperfomance, mode, path = enable(code="${this.tmp_path}", features=["${formatter}"], run_bench=True, args="${options}")\nwith open(path + '/bench.log', 'r') as f:\n logs = f.readlines()\nlog_line = logs[4]\nlog = log_line.split("[")[1].split("]")[0]` - let expr = {path: "path",log:"log"}; - let result = NotebookUtilities.sendKernelRequestFromNotebook(panel, runcode, expr,false); - let fps:string; - result.then( value => { - fps = Object.values(value.log.data)[0] as string; - if(this.markdown){ - this.markdown.model.value.text += `[NeuralCoder INFO] Benchmark Result (Performance) of ${name} is ${fps} (FPS) \n` - } - // cell.outputArea.node.innerText += `[NeuralCoder INFO] Benchmark Result (Performance) of ${name} is ${fps} (FPS)\n` - let text = `[NeuralCoder INFO] Benchmark Result (Performance) of ${name} is ${fps} (FPS)\\n` - let runcode = `with open("${this.log_path}", 'a' ) as f:\n f.write("${text}")` - let expr = {path: ""}; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode, expr,false); - if (next !== ''){ - if(this.markdown){ - this.markdown.model.value.text += `[NeuralCoder INFO] Enabling and Benchmarking for ${next} ...... \n` - } - // cell.outputArea.node.innerText += `[NeuralCoder INFO] Enabling and Benchmarking for ${next} ......\n` - let runcode2 = `with open("${this.log_path}", 'a' ) as f:\n f.write("[NeuralCoder INFO] Enabling and Benchmarking for ${next} ......\\n")` - let expr2 = {path: ""}; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode2, expr2,false); - } - let runcode2 = `with open("${this.tmp_log_path}", 'a' ) as f:\n f.write("${text}")` - let expr2 = {path: ""}; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode2, expr2,false); - - if (formatter === 'pytorch_inc_bf16'){ - let read_log = `import re\nwith open("${this.tmp_log_path}", 'r') as f:\n logs = f.readlines()\n fps_list=[]\n for log_line in logs[-4:]:\n pat =re.compile(r\'\\d+\\.?\\d+'\n) fps = re.findall(pat,log_line)[-1]\n fps_list.append(float(fps))\nmaxi = max(fps_list)\nindex = fps_list.index(maxi)\nboost = round(maxi/fps_list[0],1)\nfeatures=['','pytorch_inc_static_quant_fx','pytorch_inc_dynamic_quant','pytorch_inc_bf16']\nfeature_name=['','INC Enable INT8 (Static)','INC Enable INT8 (Dynamic)','INC Enable BF16']\nbest_feature = features[index]\nbest_name = feature_name[index]\nfeature_l = []\nfeature_l.append(best_feature)\nfrom neural_coder import enable\nenable(code="${this.tmp_path}",features=feature_l, overwrite=True)\nwith open("${this.tmp_path}", 'r') as f:\n optimized_code = f.read()\n` - let read_expr = {boost:"boost",best_feature:"best_feature",best_name:"best_name",optimizeCode:"optimized_code", feature_l: "feature_l"} - let read_result = NotebookUtilities.sendKernelRequestFromNotebook(this.panel, read_log, read_expr,false); - read_result.then(value =>{ - let boost = Object.values(value.boost.data)[0] as string; - let best_name = Object.values(value.best_name.data)[0] as string; - let optimizedTexts = Object.values(value.optimizeCode.data)[0] as string - let optimizeCodes = optimizedTexts.split('# this is the beginning of a single code snippet\\n').slice(1,) - if(this.markdown){ - this.markdown.model.value.text += `[NeuralCoder INFO] The Best Intel Optimization: ${best_name} \n` - this.markdown.model.value.text += `[NeuralCoder INFO] You can get up to ${boost}X performance boost. \n` - } - // cell.outputArea.node.innerText +=`[NeuralCoder INFO] The Best Intel Optimization: ${best_name}\n` - // cell.outputArea.node.innerText += `[NeuralCoder INFO] You can get up to ${boost}X performance boost.\n` - optimizeCodes[optimizeCodes.length-1] = optimizeCodes[optimizeCodes.length-1].slice(0,-3) - for (let i = 0; i < optimizeCodes.length; ++i) { - const cell = this.cells[i]; - const currentTexts = this.cells.map(cell => cell.model.value.text); - const currentText = currentTexts[i]; - let optimizedtext = optimizeCodes[i]; - optimizedtext = optimizedtext.replace(/\\'\\\\n\\'/g, "^^^") - optimizedtext = optimizedtext.replace(/\\\\n"/g, "+++") - optimizedtext = optimizedtext.replace(/\\\\n'/g, "+++") - optimizedtext = optimizedtext.replace(/"\\\\n/g, "@@@") - optimizedtext = optimizedtext.replace(/'\\\\n/g, "@@@") - optimizedtext = optimizedtext.replace(/\\n/g,'\n') - optimizedtext = optimizedtext.replace(/\\'/g,"'") - optimizedtext = optimizedtext.replace(/\^\^\^/g, "'\\n'") - optimizedtext = optimizedtext.replace(/\+\+\+/g, "\\n\"") - optimizedtext = optimizedtext.replace(/\@\@\@/g, "\"\\n") - if (cell.model.value.text === currentText) { - cell.model.value.text = optimizedtext; - } - } - let command = "lscpu | grep 'Model name'" - let get_hardware = `import subprocess\nsubp = subprocess.Popen("${command}",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding="utf-8")\nsubp.wait(2)\nhardware = subp.communicate()[0].replace("Model name:","").strip()` - let expr_hardware = {hardware: "hardware"} - let hard_res = NotebookUtilities.sendKernelRequestFromNotebook(this.panel, get_hardware, expr_hardware,false); - hard_res.then(value =>{ - let hard = Object.values(value.hardware.data)[0] as string; - if(this.markdown){ - this.markdown.model.value.text += `[NeuralCoder INFO] HardWare: ${hard} \n` - this.markdown.model.value.text += `[NeuralCoder INFO] The log was saved to neural_coder_workspace\\NeuralCoder${this.rand}.log \n` - } - // cell.outputArea.node.innerText += `[NeuralCoder INFO] HardWare: ${hard}\n` - }) - // cell.outputArea.node.innerText += `[NeuralCoder INFO] The log was saved to lab_workspace\\NeuralCoder${this.rand}.log\n` - const run_svg = document.createElement("svg") - run_svg.innerHTML = Constants.ICON_RUN - run?.node.firstChild?.firstChild?.firstChild?.firstChild?.replaceWith(run_svg) - }) - } - }) - } - } - } - } - - - export class JupyterlabNotebookCodeOptimizer extends JupyterlabCodeOptimizer { - protected notebookname: string; - protected notebookTracker: INotebookTracker; - - constructor( - notebookTracker: INotebookTracker, - panel: NotebookPanel - ) { - super(panel); - this.notebookTracker = notebookTracker; - this.notebookname = ''; - } - - public async optimizeAction(config: any, formatter?: string) { - return this.optimizeCells(true, config, formatter); - } - - - public async optimizeAllCodeCells( - config?: string, - formatter?: string, - notebook?: Notebook, - run?: ToolbarButton - ):Promise { - return this.optimizeCells(false, config, formatter, notebook, run); - } - - private getCodeCells(ifmarkdown = true, notebook?: Notebook): CodeCell[] { - if (!this.notebookTracker.currentWidget) { - return []; - } - const codeCells: CodeCell[] = []; - notebook = notebook || this.notebookTracker.currentWidget.content; - this.notebookname = notebook.title.label - let count = 0 - notebook.widgets.forEach((cell: Cell) => { - if (cell.model.type === 'code') { - count += 1 - codeCells.push(cell as CodeCell); - } - }); - if(ifmarkdown){ - NotebookActions.insertBelow(notebook); - this.notebookTracker.currentWidget.content.activeCellIndex = count + 1; - NotebookActions.changeCellType(notebook, 'markdown') - const activeCell = notebook.activeCell; - if (activeCell){ - this.markdown = activeCell - } - } - this.cells = codeCells - return codeCells; - } - - private async optimizeCells( - selectedOnly: boolean, - config?: string, - formatter?: string, - notebook?: Notebook, - run?: ToolbarButton|undefined - ):Promise{ - if (this.working) { - return new Promise((resolve, reject) => { - resolve("false!") - }); - } - this.working = true; - const optimize_type = formatter !== undefined ? formatter : 'pytorch_mixed_precision_cpu'; - if(optimize_type === 'auto-quant'){ - selectedOnly = true - }else{selectedOnly = false} - const selectedCells = this.getCodeCells(selectedOnly, notebook); - let cell = selectedCells[selectedCells.length-1] - if (selectedCells.length === 0) { - this.working = false; - return new Promise((resolve, reject) => { - resolve("false!") - }); - } - const currentTexts = selectedCells.map(cell => cell.model.value.text); - if (optimize_type === 'auto-quant'){ - if (this.markdown){ - this.markdown.model.value.text = `[NeuralCoder INFO] Auto-Quant Started ...... \n`; - this.markdown.model.value.text += `[NeuralCoder INFO] Code: User code from Jupyter Lab notebook "${this.notebookname}" \n` - this.markdown.model.value.text += `[NeuralCoder INFO] Benchmark Mode: Throughput \n` - } - // cell.outputArea.node.innerText = `[NeuralCoder INFO] Auto-Quant Started ......\n` - // cell.outputArea.node.innerText += `[NeuralCoder INFO] Code: User code from Jupyter Lab notebook "${this.notebookname}"\n` - // cell.outputArea.node.innerText += `[NeuralCoder INFO] Benchmark Mode: Throughput\n` - let runcode = `with open('${this.log_path}', 'a' ) as f:\n f.write("[NeuralCoder INFO] Auto-Quant Started ......\\n")` - let expr = {path: ""}; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode, expr,false); - let runcode2 = `with open('${this.log_path}', 'a' ) as f:\n f.write("[NeuralCoder INFO] Code: User code from Jupyter Lab notebook '${this.notebookname}'\\n")` - let expr2 = {path: ""}; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode2, expr2,false); - let runcode3 = `with open('${this.log_path}', 'a' ) as f:\n f.write("[NeuralCoder INFO] Benchmark Mode: Throughput\\n")` - let expr3 = {path: ""}; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode3, expr3,false); - // cell.outputArea.node.setAttribute("class","pad") - await this.optimizeCode( - currentTexts, - '', - 'The Original Model', - 'INC Enable INT8 (Static)', - config, - true, - this.panel, - cell, - run - ); - await this.optimizeCode( - currentTexts, - 'pytorch_inc_static_quant_fx', - 'INC Enable INT8 (Static)', - 'INC Enable INT8 (Dynamic)', - config, - true, - this.panel, - cell, - run - ); - await this.optimizeCode( - currentTexts, - 'pytorch_inc_dynamic_quant', - 'INC Enable INT8 (Dynamic)', - 'INC Enable BF16', - config, - true, - this.panel, - cell, - run - ); - await this.optimizeCode( - currentTexts, - 'pytorch_inc_bf16', - 'INC Enable BF16', - '', - config, - true, - this.panel, - cell, - run - ); - }else{ - await this.optimizeCode( - currentTexts, - optimize_type, - "", - "", - "normal", - true, - this.panel, - cell, - run - ); - } - this.working = false; - return new Promise((resolve, reject) => { - resolve("success!") - }); - } - applicable(formatter: string, currentWidget: Widget) { - const currentNotebookWidget = this.notebookTracker.currentWidget; - return currentNotebookWidget && currentWidget === currentNotebookWidget; - } - - } - - \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_lab/src/index.ts b/neural_coder/extensions/neural_compressor_ext_lab/src/index.ts deleted file mode 100644 index 5f274343ac4..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/src/index.ts +++ /dev/null @@ -1,143 +0,0 @@ -import { DocumentRegistry } from '@jupyterlab/docregistry'; -import { - JupyterFrontEnd, - JupyterFrontEndPlugin -} from '@jupyterlab/application'; -import { INotebookTracker,NotebookPanel, INotebookModel} from '@jupyterlab/notebook'; -import { -ToolbarButton, showDialog, Dialog } from '@jupyterlab/apputils'; -import { ISettingRegistry } from '@jupyterlab/settingregistry'; -import { IMainMenu } from '@jupyterlab/mainmenu'; -import { LabIcon } from '@jupyterlab/ui-components'; -import { Widget } from '@lumino/widgets'; -import { JupyterlabNotebookCodeOptimizer } from './deepcoder'; -import { Constants } from './constants'; - - -class neural_compressor_ext_lab - implements DocumentRegistry.IWidgetExtension { - private app: JupyterFrontEnd; - private tracker: INotebookTracker; - private notebookpanel: NotebookPanel; - private config: string; - private notebookCodeOptimizer: JupyterlabNotebookCodeOptimizer | undefined; - - constructor( - app: JupyterFrontEnd, - tracker: INotebookTracker, - notebookpanel:NotebookPanel - ) { - this.app = app; - this.tracker = tracker; - this.notebookpanel = notebookpanel; - this.setupWidgetExtension(); - this.config = '' - } - - public createNew( - nb: NotebookPanel, - ) { - this.notebookpanel = nb; - this.notebookCodeOptimizer = new JupyterlabNotebookCodeOptimizer( - this.tracker, - this.notebookpanel - ); - const svg = document.createElement("svg") - svg.innerHTML = Constants.ICON_FORMAT_ALL_SVG - const run_svg = document.createElement("svg") - run_svg.innerHTML = Constants.ICON_RUN - const div = document.createElement("div"); - div.setAttribute("class","wrapper") - const span = document.createElement("span"); - span.setAttribute("class","f1ozlkqi") - span.innerHTML = Constants.SVG; - const selector = document.createElement("select"); - selector.setAttribute("class","aselector") - selector.id = "NeuralCoder" - const option1 = document.createElement("option"); - option1.value = "pytorch_inc_static_quant_fx"; - option1.innerText = "INC Enable INT8 (Static)"; - option1.selected=true; - const option2 = document.createElement("option"); - option2.value = "pytorch_inc_dynamic_quant"; - option2.innerText = "INC Enable INT8 (Dynamic)"; - const option3 = document.createElement("option"); - option3.value = "pytorch_inc_bf16"; - option3.innerText = "INC Enable BF16"; - const option4 = document.createElement("option"); - option4.value = "auto-quant"; - option4.innerText = "INC Auto Enable & Benchmark"; - selector.options.add(option1) - selector.options.add(option2) - selector.options.add(option3) - selector.options.add(option4) - div.appendChild(selector) - div.appendChild(span) - const selector_widget = new Widget(); - selector_widget.node.appendChild(div) - selector_widget.addClass("aselector") - let notebookCodeOptimizer = this.notebookCodeOptimizer; - let config = this.config; - - const dia_input = document.createElement("input") - const dia_widget = new Widget(); - dia_widget.node.appendChild(dia_input) - dia_widget.addClass("dialog") - - const run_button = new ToolbarButton({ - tooltip: 'NeuralCoder', - icon: new LabIcon({ - name: "run", - svgstr:Constants.ICON_RUN - }), - onClick: async function (){ - run_button.node.firstChild?.firstChild?.firstChild?.firstChild?.replaceWith(svg) - if (selector.options[selector.selectedIndex].value === 'auto-quant'){ - await showDialog({ - title:'Please input execute parameters:', - body: dia_widget, - buttons: [Dialog.okButton({ label: 'Confirm' })] - }).then(result => { - if (result.button.accept) { - config = dia_input.value - } - }) - } - await notebookCodeOptimizer.optimizeAllCodeCells(config,selector.options[selector.selectedIndex].value,undefined,run_button); - } - }); - nb.toolbar.insertItem(11,"nc",run_button) - nb.toolbar.insertItem(12,"selector",selector_widget) - - } - - private setupWidgetExtension() { - this.app.docRegistry.addWidgetExtension('Notebook', this); - } -} - - - -/** - * Initialization data for the neural_compressor_ext_lab extension. - */ -const plugin: JupyterFrontEndPlugin = { - id: 'neural_compressor_ext_lab:plugin', - autoStart: true, - requires: [INotebookTracker,IMainMenu], - optional: [ISettingRegistry], - activate: ( - app: JupyterFrontEnd, - tracker: INotebookTracker, - notebookpanel: NotebookPanel - ) => { - new neural_compressor_ext_lab( - app, - tracker, - notebookpanel - ); - console.log('JupyterLab extension neural_compressor_ext_lab is activated!'); - } -}; - -export default plugin; diff --git a/neural_coder/extensions/neural_compressor_ext_lab/src/utils.tsx b/neural_coder/extensions/neural_compressor_ext_lab/src/utils.tsx deleted file mode 100644 index f76b2f20d40..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/src/utils.tsx +++ /dev/null @@ -1,366 +0,0 @@ -/* - * Copyright 2019-2020 The Kale Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Dialog, showDialog } from '@jupyterlab/apputils'; -import { NotebookPanel } from '@jupyterlab/notebook'; -import { KernelMessage, Kernel } from '@jupyterlab/services'; -import { CommandRegistry } from '@phosphor/commands'; -// @ts-ignore -import SanitizedHTML from 'react-sanitized-html'; -import * as React from 'react'; -import { ReactElement } from 'react'; - - - -export default class NotebookUtilities { - /** - * generate random number - * @Min - * @Max - */ - public static GetRandomNum(Min:number, Max:number):number { - let Range : number; - Range = Max - Min; - var Rand = Math.random(); - return (Min + Math.round(Rand * Range)); - } - /** - * Builds an HTML container by sanitizing a list of strings and converting - * them in valid HTML - * @param msg A list of string with HTML formatting - * @returns a HTMLDivElement composed of a list of spans with formatted text - */ - private static buildDialogBody(msg: string[]): ReactElement { - return ( -
- {msg.map((s: string, i: number) => { - return ( - - -
-
- ); - })} -
- ); - } - - /** - * Opens a pop-up dialog in JupyterLab to display a simple message. - * @param title The title for the message popup - * @param msg The message as an array of strings - * @param buttonLabel The label to use for the button. Default is 'OK' - * @param buttonClassName The classname to give to the 'ok' button - * @returns Promise - A promise once the message is closed. - */ - public static async showMessage( - title: string, - msg: string[], - buttonLabel: string = 'Dismiss', - buttonClassName: string = '', - ): Promise { - const buttons: ReadonlyArray = [ - Dialog.okButton({ label: buttonLabel, className: buttonClassName }), - ]; - const messageBody = this.buildDialogBody(msg); - await showDialog({ title, buttons, body: messageBody }); - } - - /** - * Opens a pop-up dialog in JupyterLab to display a yes/no dialog. - * @param title The title for the message popup - * @param msg The message - * @param acceptLabel The label to use for the accept button. Default is 'YES' - * @param rejectLabel The label to use for the reject button. Default is 'NO' - * @param yesButtonClassName The classname to give to the accept button. - * @param noButtonClassName The classname to give to the cancel button. - * @returns Promise - A promise once the message is closed. - */ - public static async showYesNoDialog( - title: string, - msg: string[], - acceptLabel: string = 'YES', - rejectLabel: string = 'NO', - yesButtonClassName: string = '', - noButtonClassName: string = '', - ): Promise { - const buttons: ReadonlyArray = [ - Dialog.okButton({ label: acceptLabel, className: yesButtonClassName }), - Dialog.cancelButton({ label: rejectLabel, className: noButtonClassName }), - ]; - const messageBody = this.buildDialogBody(msg); - const result = await showDialog({ title, buttons, body: messageBody }); - return result.button.label === acceptLabel; - } - - /** - * Opens a pop-up dialog in JupyterLab with various information and button - * triggering reloading the page. - * @param title The title for the message popup - * @param msg The message - * @param buttonLabel The label to use for the button. Default is 'Refresh' - * @param buttonClassName The classname to give to the 'refresh' button. - * @returns Promise - A promise once the message is closed. - */ - public static async showRefreshDialog( - title: string, - msg: string[], - buttonLabel: string = 'Refresh', - buttonClassName: string = '', - ): Promise { - await this.showMessage(title, msg, buttonLabel, buttonClassName); - location.reload(); - } - - /** - * @description Creates a new JupyterLab notebook for use by the application - * @param command The command registry - * @returns Promise - A promise containing the notebook panel object that was created (if successful). - */ - public static async createNewNotebook( - command: CommandRegistry, - ): Promise { - const notebook: any = await command.execute('notebook:create-new', { - activate: true, - path: '', - preferredLanguage: '', - }); - await notebook.session.ready; - return notebook; - } - - /** - * Safely saves the Jupyter notebook document contents to disk - * @param notebookPanel The notebook panel containing the notebook to save - */ - public static async saveNotebook( - notebookPanel: NotebookPanel, - ): Promise { - if (notebookPanel) { - await notebookPanel.context.ready; - notebookPanel.context.save(); - return true; - } - return false; - } - - /** - * Convert the notebook contents to JSON - * @param notebookPanel The notebook panel containing the notebook to serialize - */ - public static notebookToJSON(notebookPanel: NotebookPanel): any { - if (notebookPanel.content.model) { - return notebookPanel.content.model.toJSON(); - } - return null; - } - - /** - * @description Gets the value of a key from specified notebook's metadata. - * @param notebookPanel The notebook to get meta data from. - * @param key The key of the value. - * @returns any -The value of the metadata. Returns null if the key doesn't exist. - */ - public static getMetaData(notebookPanel: NotebookPanel, key: string): any { - if (!notebookPanel) { - throw new Error( - 'The notebook is null or undefined. No meta data available.', - ); - } - if (notebookPanel.model && notebookPanel.model.metadata.has(key)) { - return notebookPanel.model.metadata.get(key); - } - return null; - } - - /** - * @description Sets the key value pair in the notebook's metadata. - * If the key doesn't exists it will add one. - * @param notebookPanel The notebook to set meta data in. - * @param key The key of the value to create. - * @param value The value to set. - * @param save Default is false. Whether the notebook should be saved after the meta data is set. - * Note: This function will not wait for the save to complete, it only sends a save request. - * @returns The old value for the key, or undefined if it did not exist. - */ - public static setMetaData( - notebookPanel: NotebookPanel, - key: string, - value: any, - save: boolean = false, - ): any { - if (!notebookPanel) { - throw new Error( - 'The notebook is null or undefined. No meta data available.', - ); - } - const oldVal = notebookPanel.model?.metadata.set(key, value); - if (save) { - this.saveNotebook(notebookPanel); - } - return oldVal; - } - - // /** - // * Get a new Kernel, not tied to a Notebook - // * Source code here: https://github.com/jupyterlab/jupyterlab/tree/473348d25bcb258ca2f0c127dd8fb5b193217135/packages/services - // */ - // public static async createNewKernel() { - // // Get info about the available kernels and start a new one. - // let options: Kernel.IOptions = await Kernel.getSpecs().then(kernelSpecs => { - // // console.log('Default spec:', kernelSpecs.default); - // // console.log('Available specs', Object.keys(kernelSpecs.kernelspecs)); - // // use the default name - // return { name: kernelSpecs.default }; - // }); - // return await Kernel.startNew(options).then(_kernel => { - // return _kernel; - // }); - // } - - // // TODO: We can use this context manager to execute commands inside a new kernel - // // and be sure that it will be disposed of at the end. - // // Another approach could be to create a kale_rpc Kernel, as a singleton, - // // created at startup. The only (possible) drawback is that we can not name - // // a kernel instance with a custom id/name, so when refreshing JupyterLab we would - // // not recognize the kernel. A solution could be to have a kernel spec dedicated to kale rpc calls. - // public static async executeWithNewKernel(action: Function, args: any[] = []) { - // // create brand new kernel - // const _k = await this.createNewKernel(); - // // execute action inside kernel - // const res = await action(_k, ...args); - // // close kernel - // _k.shutdown(); - // // return result - // return res; - // } - - /** - * @description This function runs code directly in the notebook's kernel and then evaluates the - * result and returns it as a promise. - * @param kernel The kernel to run the code in. - * @param runCode The code to run in the kernel. - * @param userExpressions The expressions used to capture the desired info from the executed code. - * @param runSilent Default is false. If true, kernel will execute as quietly as possible. - * store_history will be set to false, and no broadcast on IOPUB channel will be made. - * @param storeHistory Default is false. If true, the code executed will be stored in the kernel's history - * and the counter which is shown in the cells will be incremented to reflect code was run. - * @param allowStdIn Default is false. If true, code running in kernel can prompt user for input using - * an input_request message. - * @param stopOnError Default is false. If True, does not abort the execution queue, if an exception is encountered. - * This allows the queued execution of multiple execute_requests, even if they generate exceptions. - * @returns Promise - A promise containing the execution results of the code as an object with - * keys based on the user_expressions. - * @example - * //The code - * const code = "a=123\nb=456\nsum=a+b"; - * //The user expressions - * const expr = {sum: "sum",prod: "a*b",args:"[a,b,sum]"}; - * //Async function call (returns a promise) - * sendKernelRequest(notebookPanel, code, expr,false); - * //Result when promise resolves: - * { - * sum:{status:"ok",data:{"text/plain":"579"},metadata:{}}, - * prod:{status:"ok",data:{"text/plain":"56088"},metadata:{}}, - * args:{status:"ok",data:{"text/plain":"[123, 456, 579]"}} - * } - * @see For more information on JupyterLab messages: - * https://jupyter-client.readthedocs.io/en/latest/messaging.html#execution-results - */ - public static async sendKernelRequest( - kernel: Kernel.IKernelConnection| null | undefined, - runCode: string, - userExpressions: any, - runSilent: boolean = false, - storeHistory: boolean = false, - allowStdIn: boolean = false, - stopOnError: boolean = false, - ): Promise { - if (!kernel) { - throw new Error('Kernel is null or undefined.'); - } - - // Wait for kernel to be ready before sending request - // await kernel.status; - - const message: KernelMessage.IShellMessage = await kernel.requestExecute({ - allow_stdin: allowStdIn, - code: runCode, - silent: runSilent, - stop_on_error: stopOnError, - store_history: storeHistory, - user_expressions: userExpressions, - }).done; - - const content: any = message.content; - - if (content.status !== 'ok') { - // If response is not 'ok', throw contents as error, log code - const msg: string = `Code caused an error:\n${runCode}`; - console.error(msg); - if (content.traceback) { - content.traceback.forEach((line: string) => - console.log( - line.replace( - /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, - '', - ), - ), - ); - } - throw content; - } - // Return user_expressions of the content - return content.user_expressions; - } - - /** - * Same as method sendKernelRequest but passing - * a NotebookPanel instead of a Kernel - */ - public static async sendKernelRequestFromNotebook( - notebookPanel: NotebookPanel, - runCode: string, - userExpressions: any, - runSilent: boolean = false, - storeHistory: boolean = false, - allowStdIn: boolean = false, - stopOnError: boolean = false, - ) { - if (!notebookPanel) { - throw new Error('Notebook is null or undefined.'); - } - - // Wait for notebook panel to be ready - await notebookPanel.activate; - await notebookPanel.sessionContext?.ready; - console.log('get kernel',notebookPanel.sessionContext.session?.kernel) - return this.sendKernelRequest( - notebookPanel.sessionContext?.session?.kernel, - runCode, - userExpressions, - runSilent, - storeHistory, - allowStdIn, - stopOnError, - ); - } - - } diff --git a/neural_coder/extensions/neural_compressor_ext_lab/style/base.css b/neural_coder/extensions/neural_compressor_ext_lab/style/base.css deleted file mode 100644 index 16b572c0e9a..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/style/base.css +++ /dev/null @@ -1,636 +0,0 @@ -/* - See the JupyterLab Developer Guide for useful CSS Patterns: - - https://jupyterlab.readthedocs.io/en/stable/developer/css.html -*/ -.lds-ripple { - display: flex; - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - margin: auto; - width: 80px; - height: 80px; -} -.lds-ripple div { - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - margin: auto; - border: 4px solid rgb(245, 131, 55); - opacity: 1; - border-radius: 50%; - animation: lds-ripple 1s cubic-bezier(0, 0.2, 0.8, 1) infinite; -} -.lds-ripple div:nth-child(2) { - animation-delay: -0.5s; -} -@keyframes lds-ripple { - 0% { - left: 0; - top: 0; - right: 0; - bottom: 0; - margin: auto; - width: 0; - height: 0; - opacity: 0; - } - 4.9% { - left: 0; - top: 0; - right: 0; - bottom: 0; - margin: auto; - width: 0; - height: 0; - opacity: 0; - } - 5% { - left: 0; - top: 0; - right: 0; - bottom: 0; - margin: auto; - width: 0; - height: 0; - opacity: 1; - } - 100% { - top: 0px; - left: 0px; - width: 72px; - height: 72px; - opacity: 0; - } -} - - -/* CSS */ -.button-62 { - background: linear-gradient(to bottom right, #EF4765, #FF9A5A); - border: 0; - border-radius: 12px; - color: #FFFFFF; - cursor: pointer; - display: inline-block; - font-family: -apple-system,system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif; - font-size: 16px; - font-weight: 500; - line-height: 2.5; - outline: transparent; - padding: 0 1rem; - text-align: center; - text-decoration: none; - transition: box-shadow .2s ease-in-out; - user-select: none; - -webkit-user-select: none; - touch-action: manipulation; - white-space: nowrap; -} - -.button-62:not([disabled]):focus { - box-shadow: 0 0 .25rem rgba(0, 0, 0, 0.5), -.125rem -.125rem 1rem rgba(239, 71, 101, 0.5), .125rem .125rem 1rem rgba(255, 154, 90, 0.5); -} - -.button-62:not([disabled]):hover { - box-shadow: 0 0 .25rem rgba(0, 0, 0, 0.5), -.125rem -.125rem 1rem rgba(239, 71, 101, 0.5), .125rem .125rem 1rem rgba(255, 154, 90, 0.5); -} - -.aselector select { - background-color: initial; - border: none; - border-radius: 0; - box-shadow: none; - color: var(--jp-ui-font-color0); - display: block; - font-size: var(--jp-ui-font-size1); - height: 24px; - line-height: 14px; - padding: 0 25px 0 10px; - text-align: left; - -moz-appearance: none; - -webkit-appearance: none; -} - -/* Use our own theme for hover and option styles */ -.aselector select:hover, -.aselector select > option { - background-color: var(--jp-layout-color2); - color: var(--jp-ui-font-color0); -} -select { - box-sizing: border-box; -} - -.font{ -background-color: initial; -border: none; -height: 21px; -border-radius: 0; -font-weight:500; -color: var(--jp-ui-font-color0); -display: block; -line-height: 22.5px; -padding: 0 25px 0 10px; -font-size: var(--jp-ui-font-size1); -} -.wrapper { - display: flex; -} -.f1ozlkqi { - pointer-events: none; -} - -.palybutton{ - background-image: '/home2/longxin/Neural_Coder_EXT/style/icons8-circled-play.gif'; -} -.loading{ - - background-image: url("data:image/svg+xml,"); - background-size: contain; -} - -.dialog{ -body { - margin: 0; - height: 100vh; - width:600px; - display: flex; - align-items: center; - justify-content: center; - overflow: hidden; - font-family: "Poppins", sans-serif; - background: #e3d0b6; -} - -#cookie-policy { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - width: 460px; - height: 600px; - background: #f3efe6; - border-radius: 12px; - transform: scale(.8); -} - -#cookie-wrapper { - height: 240px; - width: 240px; - margin: 30px 0; - position: relative; - left: -40px; -} - -h1 { - color: #6c3a1f; - text-align: center; - font-size: 36px; - margin: 0; -} - -p { - color: #a28561; - font-size: 14px; - margin-top: 0; - padding: 0 60px; - text-align: center; -} -a { - margin-top: 18px; - font-size: 14px; - color: #a28561; - text-decoration: none; - pointer-events: none; -} -a:hover { - color: #846b4d; -} - -span { - font-family: "Amatic SC", cursive; - font-weight: 400; - font-size: 20px; - position: relative; - top: -18px; - left: 3px; - color: #a28561; -} - -#heart-no, #thought-heart-yes, #mouth, #face-no, #thought-1, #thought-2, #thought-heart-na, #q-mark, #eyes, #leg-l, #leg-r { - opacity: 0; -} -} -.dia_button { - color: white; - background: #dd794a; - margin-top: 12px; - cursor: pointer; - font-size: 24px; - font-family: "Poppins", sans-serif; - border-radius: 9px; - border: none; - width: 72%; - padding: 12px 0; - transition: 150ms ease-out; - pointer-events: none; -} - -.dia_button:hover { - background: #d66029; -} - -.pad{ - padding-left:6% -} - -:root { - /* Elevation - * - * We style box-shadows using Material Design's idea of elevation. These particular numbers are taken from here: - * - * https://github.com/material-components/material-components-web - * https://material-components-web.appspot.com/elevation.html - */ - - --jp-shadow-base-lightness: 0; - --jp-shadow-umbra-color: rgba( - var(--jp-shadow-base-lightness), - var(--jp-shadow-base-lightness), - var(--jp-shadow-base-lightness), - 0.2 - ); - --jp-shadow-penumbra-color: rgba( - var(--jp-shadow-base-lightness), - var(--jp-shadow-base-lightness), - var(--jp-shadow-base-lightness), - 0.14 - ); - --jp-shadow-ambient-color: rgba( - var(--jp-shadow-base-lightness), - var(--jp-shadow-base-lightness), - var(--jp-shadow-base-lightness), - 0.12 - ); - --jp-elevation-z0: none; - --jp-elevation-z1: 0px 2px 1px -1px var(--jp-shadow-umbra-color), - 0px 1px 1px 0px var(--jp-shadow-penumbra-color), - 0px 1px 3px 0px var(--jp-shadow-ambient-color); - --jp-elevation-z2: 0px 3px 1px -2px var(--jp-shadow-umbra-color), - 0px 2px 2px 0px var(--jp-shadow-penumbra-color), - 0px 1px 5px 0px var(--jp-shadow-ambient-color); - --jp-elevation-z4: 0px 2px 4px -1px var(--jp-shadow-umbra-color), - 0px 4px 5px 0px var(--jp-shadow-penumbra-color), - 0px 1px 10px 0px var(--jp-shadow-ambient-color); - --jp-elevation-z6: 0px 3px 5px -1px var(--jp-shadow-umbra-color), - 0px 6px 10px 0px var(--jp-shadow-penumbra-color), - 0px 1px 18px 0px var(--jp-shadow-ambient-color); - --jp-elevation-z8: 0px 5px 5px -3px var(--jp-shadow-umbra-color), - 0px 8px 10px 1px var(--jp-shadow-penumbra-color), - 0px 3px 14px 2px var(--jp-shadow-ambient-color); - --jp-elevation-z12: 0px 7px 8px -4px var(--jp-shadow-umbra-color), - 0px 12px 17px 2px var(--jp-shadow-penumbra-color), - 0px 5px 22px 4px var(--jp-shadow-ambient-color); - --jp-elevation-z16: 0px 8px 10px -5px var(--jp-shadow-umbra-color), - 0px 16px 24px 2px var(--jp-shadow-penumbra-color), - 0px 6px 30px 5px var(--jp-shadow-ambient-color); - --jp-elevation-z20: 0px 10px 13px -6px var(--jp-shadow-umbra-color), - 0px 20px 31px 3px var(--jp-shadow-penumbra-color), - 0px 8px 38px 7px var(--jp-shadow-ambient-color); - --jp-elevation-z24: 0px 11px 15px -7px var(--jp-shadow-umbra-color), - 0px 24px 38px 3px var(--jp-shadow-penumbra-color), - 0px 9px 46px 8px var(--jp-shadow-ambient-color); - - /* Borders - * - * The following variables, specify the visual styling of borders in JupyterLab. - */ - - --jp-border-width: 1px; - --jp-border-color0: var(--md-grey-400); - --jp-border-color1: var(--md-grey-400); - --jp-border-color2: var(--md-grey-300); - --jp-border-color3: var(--md-grey-200); - --jp-inverse-border-color: var(--md-grey-600); - --jp-border-radius: 2px; - - /* UI Fonts - * - * The UI font CSS variables are used for the typography all of the JupyterLab - * user interface elements that are not directly user generated content. - * - * The font sizing here is done assuming that the body font size of --jp-ui-font-size1 - * is applied to a parent element. When children elements, such as headings, are sized - * in em all things will be computed relative to that body size. - */ - - --jp-ui-font-scale-factor: 1.2; - --jp-ui-font-size0: 0.83333em; - --jp-ui-font-size1: 13px; /* Base font size */ - --jp-ui-font-size2: 1.2em; - --jp-ui-font-size3: 1.44em; - - --jp-ui-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, - Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; - - /* - * Use these font colors against the corresponding main layout colors. - * In a light theme, these go from dark to light. - */ - - /* Defaults use Material Design specification */ - --jp-ui-font-color0: rgba(0, 0, 0, 1); - --jp-ui-font-color1: rgba(0, 0, 0, 0.87); - --jp-ui-font-color2: rgba(0, 0, 0, 0.54); - --jp-ui-font-color3: rgba(0, 0, 0, 0.38); - - /* - * Use these against the brand/accent/warn/error colors. - * These will typically go from light to darker, in both a dark and light theme. - */ - - --jp-ui-inverse-font-color0: rgba(255, 255, 255, 1); - --jp-ui-inverse-font-color1: rgba(255, 255, 255, 1); - --jp-ui-inverse-font-color2: rgba(255, 255, 255, 0.7); - --jp-ui-inverse-font-color3: rgba(255, 255, 255, 0.5); - - /* Content Fonts - * - * Content font variables are used for typography of user generated content. - * - * The font sizing here is done assuming that the body font size of --jp-content-font-size1 - * is applied to a parent element. When children elements, such as headings, are sized - * in em all things will be computed relative to that body size. - */ - - --jp-content-line-height: 1.6; - --jp-content-font-scale-factor: 1.2; - --jp-content-font-size0: 0.83333em; - --jp-content-font-size1: 14px; /* Base font size */ - --jp-content-font-size2: 1.2em; - --jp-content-font-size3: 1.44em; - --jp-content-font-size4: 1.728em; - --jp-content-font-size5: 2.0736em; - - /* This gives a magnification of about 125% in presentation mode over normal. */ - --jp-content-presentation-font-size1: 17px; - - --jp-content-heading-line-height: 1; - --jp-content-heading-margin-top: 1.2em; - --jp-content-heading-margin-bottom: 0.8em; - --jp-content-heading-font-weight: 500; - - /* Defaults use Material Design specification */ - --jp-content-font-color0: rgba(0, 0, 0, 1); - --jp-content-font-color1: rgba(0, 0, 0, 0.87); - --jp-content-font-color2: rgba(0, 0, 0, 0.54); - --jp-content-font-color3: rgba(0, 0, 0, 0.38); - - --jp-content-link-color: var(--md-blue-700); - - --jp-content-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', - Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', - 'Segoe UI Symbol'; - - /* - * Code Fonts - * - * Code font variables are used for typography of code and other monospaces content. - */ - - --jp-code-font-size: 13px; - --jp-code-line-height: 1.3077; /* 17px for 13px base */ - --jp-code-padding: 5px; /* 5px for 13px base, codemirror highlighting needs integer px value */ - --jp-code-font-family-default: Menlo, Consolas, 'DejaVu Sans Mono', monospace; - --jp-code-font-family: var(--jp-code-font-family-default); - - /* This gives a magnification of about 125% in presentation mode over normal. */ - --jp-code-presentation-font-size: 16px; - - /* may need to tweak cursor width if you change font size */ - --jp-code-cursor-width0: 1.4px; - --jp-code-cursor-width1: 2px; - --jp-code-cursor-width2: 4px; - - /* Layout - * - * The following are the main layout colors use in JupyterLab. In a light - * theme these would go from light to dark. - */ - - --jp-layout-color0: white; - --jp-layout-color1: white; - --jp-layout-color2: var(--md-grey-200); - --jp-layout-color3: var(--md-grey-400); - --jp-layout-color4: var(--md-grey-600); - - /* Inverse Layout - * - * The following are the inverse layout colors use in JupyterLab. In a light - * theme these would go from dark to light. - */ - - --jp-inverse-layout-color0: #111111; - --jp-inverse-layout-color1: var(--md-grey-900); - --jp-inverse-layout-color2: var(--md-grey-800); - --jp-inverse-layout-color3: var(--md-grey-700); - --jp-inverse-layout-color4: var(--md-grey-600); - - /* Brand/accent */ - - --jp-brand-color0: var(--md-blue-900); - --jp-brand-color1: var(--md-blue-700); - --jp-brand-color2: var(--md-blue-300); - --jp-brand-color3: var(--md-blue-100); - --jp-brand-color4: var(--md-blue-50); - - --jp-accent-color0: var(--md-green-900); - --jp-accent-color1: var(--md-green-700); - --jp-accent-color2: var(--md-green-300); - --jp-accent-color3: var(--md-green-100); - - /* State colors (warn, error, success, info) */ - - --jp-warn-color0: var(--md-orange-900); - --jp-warn-color1: var(--md-orange-700); - --jp-warn-color2: var(--md-orange-300); - --jp-warn-color3: var(--md-orange-100); - - --jp-error-color0: var(--md-red-900); - --jp-error-color1: var(--md-red-700); - --jp-error-color2: var(--md-red-300); - --jp-error-color3: var(--md-red-100); - - --jp-success-color0: var(--md-green-900); - --jp-success-color1: var(--md-green-700); - --jp-success-color2: var(--md-green-300); - --jp-success-color3: var(--md-green-100); - - --jp-info-color0: var(--md-cyan-900); - --jp-info-color1: var(--md-cyan-700); - --jp-info-color2: var(--md-cyan-300); - --jp-info-color3: var(--md-cyan-100); - - /* Cell specific styles */ - - --jp-cell-padding: 5px; - - --jp-cell-collapser-width: 8px; - --jp-cell-collapser-min-height: 20px; - --jp-cell-collapser-not-active-hover-opacity: 0.6; - - --jp-cell-editor-background: var(--md-grey-100); - --jp-cell-editor-border-color: var(--md-grey-300); - --jp-cell-editor-box-shadow: inset 0 0 2px var(--md-blue-300); - --jp-cell-editor-active-background: var(--jp-layout-color0); - --jp-cell-editor-active-border-color: var(--jp-brand-color1); - - --jp-cell-prompt-width: 64px; - --jp-cell-prompt-font-family: var(--jp-code-font-family-default); - --jp-cell-prompt-letter-spacing: 0px; - --jp-cell-prompt-opacity: 1; - --jp-cell-prompt-not-active-opacity: 0.5; - --jp-cell-prompt-not-active-font-color: var(--md-grey-700); - /* A custom blend of MD grey and blue 600 - * See https://meyerweb.com/eric/tools/color-blend/#546E7A:1E88E5:5:hex */ - --jp-cell-inprompt-font-color: #307fc1; - /* A custom blend of MD grey and orange 600 - * https://meyerweb.com/eric/tools/color-blend/#546E7A:F4511E:5:hex */ - --jp-cell-outprompt-font-color: #bf5b3d; - - /* Notebook specific styles */ - - --jp-notebook-padding: 10px; - --jp-notebook-select-background: var(--jp-layout-color1); - --jp-notebook-multiselected-color: var(--md-blue-50); - - /* The scroll padding is calculated to fill enough space at the bottom of the - notebook to show one single-line cell (with appropriate padding) at the top - when the notebook is scrolled all the way to the bottom. We also subtract one - pixel so that no scrollbar appears if we have just one single-line cell in the - notebook. This padding is to enable a 'scroll past end' feature in a notebook. - */ - --jp-notebook-scroll-padding: calc( - 100% - var(--jp-code-font-size) * var(--jp-code-line-height) - - var(--jp-code-padding) - var(--jp-cell-padding) - 1px - ); - - /* Rendermime styles */ - - --jp-rendermime-error-background: #fdd; - --jp-rendermime-table-row-background: var(--md-grey-100); - --jp-rendermime-table-row-hover-background: var(--md-light-blue-50); - - /* Dialog specific styles */ - - --jp-dialog-background: rgba(0, 0, 0, 0.25); - - /* Console specific styles */ - - --jp-console-padding: 10px; - - /* Toolbar specific styles */ - - --jp-toolbar-border-color: var(--jp-border-color1); - --jp-toolbar-micro-height: 8px; - --jp-toolbar-background: var(--jp-layout-color1); - --jp-toolbar-box-shadow: 0px 0px 2px 0px rgba(0, 0, 0, 0.24); - --jp-toolbar-header-margin: 4px 4px 0px 4px; - --jp-toolbar-active-background: var(--md-grey-300); - - /* Statusbar specific styles */ - - --jp-statusbar-height: 24px; - - /* Input field styles */ - - --jp-input-box-shadow: inset 0 0 2px var(--md-blue-300); - --jp-input-active-background: var(--jp-layout-color1); - --jp-input-hover-background: var(--jp-layout-color1); - --jp-input-background: var(--md-grey-100); - --jp-input-border-color: var(--jp-inverse-border-color); - --jp-input-active-border-color: var(--jp-brand-color1); - --jp-input-active-box-shadow-color: rgba(19, 124, 189, 0.3); - - /* General editor styles */ - - --jp-editor-selected-background: #d9d9d9; - --jp-editor-selected-focused-background: #d7d4f0; - --jp-editor-cursor-color: var(--jp-ui-font-color0); - - /* Code mirror specific styles */ - - --jp-mirror-editor-keyword-color: #008000; - --jp-mirror-editor-atom-color: #88f; - --jp-mirror-editor-number-color: #080; - --jp-mirror-editor-def-color: #00f; - --jp-mirror-editor-variable-color: var(--md-grey-900); - --jp-mirror-editor-variable-2-color: #05a; - --jp-mirror-editor-variable-3-color: #085; - --jp-mirror-editor-punctuation-color: #05a; - --jp-mirror-editor-property-color: #05a; - --jp-mirror-editor-operator-color: #aa22ff; - --jp-mirror-editor-comment-color: #408080; - --jp-mirror-editor-string-color: #ba2121; - --jp-mirror-editor-string-2-color: #708; - --jp-mirror-editor-meta-color: #aa22ff; - --jp-mirror-editor-qualifier-color: #555; - --jp-mirror-editor-builtin-color: #008000; - --jp-mirror-editor-bracket-color: #997; - --jp-mirror-editor-tag-color: #170; - --jp-mirror-editor-attribute-color: #00c; - --jp-mirror-editor-header-color: blue; - --jp-mirror-editor-quote-color: #090; - --jp-mirror-editor-link-color: #00c; - --jp-mirror-editor-error-color: #f00; - --jp-mirror-editor-hr-color: #999; - - /* Vega extension styles */ - - --jp-vega-background: white; - - /* Sidebar-related styles */ - - --jp-sidebar-min-width: 250px; - - /* Search-related styles */ - - --jp-search-toggle-off-opacity: 0.5; - --jp-search-toggle-hover-opacity: 0.8; - --jp-search-toggle-on-opacity: 1; - --jp-search-selected-match-background-color: rgb(245, 200, 0); - --jp-search-selected-match-color: black; - --jp-search-unselected-match-background-color: var( - --jp-inverse-layout-color0 - ); - --jp-search-unselected-match-color: var(--jp-ui-inverse-font-color0); - - /* Icon colors that work well with light or dark backgrounds */ - --jp-icon-contrast-color0: var(--md-purple-600); - --jp-icon-contrast-color1: var(--md-green-600); - --jp-icon-contrast-color2: var(--md-pink-600); - --jp-icon-contrast-color3: var(--md-blue-600); -} - -/*----------------------------------------------------------------------------- -| Copyright (c) Jupyter Development Team. -| Distributed under the terms of the Modified BSD License. -|----------------------------------------------------------------------------*/ - -/* Set the default typography for monospace elements */ -tt, -code, -kbd, -samp, -pre { - font-family: var(--jp-code-font-family); - font-size: var(--jp-code-font-size); - line-height: var(--jp-code-line-height); -} - diff --git a/neural_coder/extensions/neural_compressor_ext_lab/style/base.scss b/neural_coder/extensions/neural_compressor_ext_lab/style/base.scss deleted file mode 100644 index eb86f52434a..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/style/base.scss +++ /dev/null @@ -1,36 +0,0 @@ -svg#play { - width:200px; - margin: 120px auto; - display:block; - cursor: pointer; - transform-origin: 50% 50%; - } - - svg#play #triangle { - fill:rgba(22,22,22,0); - transition:500ms; - transform-origin: 50% 50%; - } - svg#play:hover #triangle { - fill:#696969; - transform-origin: 50% 50%; - } - - svg #lineOne, svg #lineTwo { - transform-origin: 50% 50%; - transition: 1s; - } - - svg:hover #lineOne { - transform: rotate(260deg); - -webkit-transform: rotate(260deg); - -moz-transform: rotate(260deg); - -o-transform: rotate(260deg); - transform-origin: 50% 50%; - } - - svg:hover #lineTwo { - transform: rotate(-450deg); - transform-origin: 50% 50%; - } - \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_lab/style/index.css b/neural_coder/extensions/neural_compressor_ext_lab/style/index.css deleted file mode 100644 index 8a7ea29e694..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/style/index.css +++ /dev/null @@ -1 +0,0 @@ -@import url('base.css'); diff --git a/neural_coder/extensions/neural_compressor_ext_lab/style/index.js b/neural_coder/extensions/neural_compressor_ext_lab/style/index.js deleted file mode 100644 index a028a76408b..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/style/index.js +++ /dev/null @@ -1 +0,0 @@ -import './base.css'; diff --git a/neural_coder/extensions/neural_compressor_ext_lab/test_torchvision.ipynb b/neural_coder/extensions/neural_compressor_ext_lab/test_torchvision.ipynb deleted file mode 100644 index 58d9f2ae940..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/test_torchvision.ipynb +++ /dev/null @@ -1,633 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "id": "b2812d42-da69-4741-97e8-5d1909931d60", - "metadata": {}, - "outputs": [], - "source": [ - "import logging\n", - "import os\n", - "import random\n", - "import sys\n", - "from dataclasses import dataclass, field\n", - "from typing import Optional\n", - "\n", - "import datasets\n", - "import numpy as np\n", - "from datasets import load_dataset, load_metric\n", - "\n", - "import transformers\n", - "from transformers import (\n", - " AutoConfig,\n", - " AutoModelForSequenceClassification,\n", - " AutoTokenizer,\n", - " DataCollatorWithPadding,\n", - " EvalPrediction,\n", - " HfArgumentParser,\n", - " PretrainedConfig,\n", - " Trainer,\n", - " TrainingArguments,\n", - " default_data_collator,\n", - " set_seed,\n", - ")\n", - "from transformers.trainer_utils import get_last_checkpoint\n", - "from transformers.utils import check_min_version, send_example_telemetry\n", - "from transformers.utils.versions import require_version\n", - "\n", - "\n", - "# Will error if the minimal version of Transformers is not installed. Remove at your own risks.\n", - "check_min_version(\"4.21.0\")\n", - "\n", - "require_version(\"datasets>=1.8.0\", \"To fix: pip install -r examples/pytorch/text-classification/requirements.txt\")\n", - "\n", - "task_to_keys = {\n", - " \"cola\": (\"sentence\", None),\n", - " \"mnli\": (\"premise\", \"hypothesis\"),\n", - " \"mrpc\": (\"sentence1\", \"sentence2\"),\n", - " \"qnli\": (\"question\", \"sentence\"),\n", - " \"qqp\": (\"question1\", \"question2\"),\n", - " \"rte\": (\"sentence1\", \"sentence2\"),\n", - " \"sst2\": (\"sentence\", None),\n", - " \"stsb\": (\"sentence1\", \"sentence2\"),\n", - " \"wnli\": (\"sentence1\", \"sentence2\"),\n", - "}\n", - "\n", - "logger = logging.getLogger(__name__)\n", - "\n", - "\n", - "@dataclass\n", - "class DataTrainingArguments:\n", - " \"\"\"\n", - " Arguments pertaining to what data we are going to input our model for training and eval.\n", - "\n", - " Using `HfArgumentParser` we can turn this class\n", - " into argparse arguments to be able to specify them on\n", - " the command line.\n", - " \"\"\"\n", - "\n", - " task_name: Optional[str] = field(\n", - " default=None,\n", - " metadata={\"help\": \"The name of the task to train on: \" + \", \".join(task_to_keys.keys())},\n", - " )\n", - " dataset_name: Optional[str] = field(\n", - " default=None, metadata={\"help\": \"The name of the dataset to use (via the datasets library).\"}\n", - " )\n", - " dataset_config_name: Optional[str] = field(\n", - " default=None, metadata={\"help\": \"The configuration name of the dataset to use (via the datasets library).\"}\n", - " )\n", - " max_seq_length: int = field(\n", - " default=128,\n", - " metadata={\n", - " \"help\": (\n", - " \"The maximum total input sequence length after tokenization. Sequences longer \"\n", - " \"than this will be truncated, sequences shorter will be padded.\"\n", - " )\n", - " },\n", - " )\n", - " overwrite_cache: bool = field(\n", - " default=False, metadata={\"help\": \"Overwrite the cached preprocessed datasets or not.\"}\n", - " )\n", - " pad_to_max_length: bool = field(\n", - " default=True,\n", - " metadata={\n", - " \"help\": (\n", - " \"Whether to pad all samples to `max_seq_length`. \"\n", - " \"If False, will pad the samples dynamically when batching to the maximum length in the batch.\"\n", - " )\n", - " },\n", - " )\n", - " max_train_samples: Optional[int] = field(\n", - " default=None,\n", - " metadata={\n", - " \"help\": (\n", - " \"For debugging purposes or quicker training, truncate the number of training examples to this \"\n", - " \"value if set.\"\n", - " )\n", - " },\n", - " )\n", - " max_eval_samples: Optional[int] = field(\n", - " default=None,\n", - " metadata={\n", - " \"help\": (\n", - " \"For debugging purposes or quicker training, truncate the number of evaluation examples to this \"\n", - " \"value if set.\"\n", - " )\n", - " },\n", - " )\n", - " max_predict_samples: Optional[int] = field(\n", - " default=None,\n", - " metadata={\n", - " \"help\": (\n", - " \"For debugging purposes or quicker training, truncate the number of prediction examples to this \"\n", - " \"value if set.\"\n", - " )\n", - " },\n", - " )\n", - " train_file: Optional[str] = field(\n", - " default=None, metadata={\"help\": \"A csv or a json file containing the training data.\"}\n", - " )\n", - " validation_file: Optional[str] = field(\n", - " default=None, metadata={\"help\": \"A csv or a json file containing the validation data.\"}\n", - " )\n", - " test_file: Optional[str] = field(default=None, metadata={\"help\": \"A csv or a json file containing the test data.\"})\n", - "\n", - " def __post_init__(self):\n", - " if self.task_name is not None:\n", - " self.task_name = self.task_name.lower()\n", - " if self.task_name not in task_to_keys.keys():\n", - " raise ValueError(\"Unknown task, you should pick one in \" + \",\".join(task_to_keys.keys()))\n", - " elif self.dataset_name is not None:\n", - " pass\n", - " elif self.train_file is None or self.validation_file is None:\n", - " raise ValueError(\"Need either a GLUE task, a training/validation file or a dataset name.\")\n", - " else:\n", - " train_extension = self.train_file.split(\".\")[-1]\n", - " assert train_extension in [\"csv\", \"json\"], \"`train_file` should be a csv or a json file.\"\n", - " validation_extension = self.validation_file.split(\".\")[-1]\n", - " assert (\n", - " validation_extension == train_extension\n", - " ), \"`validation_file` should have the same extension (csv or json) as `train_file`.\"\n", - "\n", - "\n", - "@dataclass\n", - "class ModelArguments:\n", - " \"\"\"\n", - " Arguments pertaining to which model/config/tokenizer we are going to fine-tune from.\n", - " \"\"\"\n", - "\n", - " model_name_or_path: str = field(\n", - " metadata={\"help\": \"Path to pretrained model or model identifier from huggingface.co/models\"}\n", - " )\n", - " config_name: Optional[str] = field(\n", - " default=None, metadata={\"help\": \"Pretrained config name or path if not the same as model_name\"}\n", - " )\n", - " tokenizer_name: Optional[str] = field(\n", - " default=None, metadata={\"help\": \"Pretrained tokenizer name or path if not the same as model_name\"}\n", - " )\n", - " cache_dir: Optional[str] = field(\n", - " default=None,\n", - " metadata={\"help\": \"Where do you want to store the pretrained models downloaded from huggingface.co\"},\n", - " )\n", - " use_fast_tokenizer: bool = field(\n", - " default=True,\n", - " metadata={\"help\": \"Whether to use one of the fast tokenizer (backed by the tokenizers library) or not.\"},\n", - " )\n", - " model_revision: str = field(\n", - " default=\"main\",\n", - " metadata={\"help\": \"The specific model version to use (can be a branch name, tag name or commit id).\"},\n", - " )\n", - " use_auth_token: bool = field(\n", - " default=False,\n", - " metadata={\n", - " \"help\": (\n", - " \"Will use the token generated when running `transformers-cli login` (necessary to use this script \"\n", - " \"with private models).\"\n", - " )\n", - " },\n", - " )\n", - " ignore_mismatched_sizes: bool = field(\n", - " default=False,\n", - " metadata={\"help\": \"Will enable to load a pretrained model whose head dimensions are different.\"},\n", - " )\n", - "\n", - "\n", - "def main():\n", - " # See all possible arguments in src/transformers/training_args.py\n", - " # or by passing the --help flag to this script.\n", - " # We now keep distinct sets of args, for a cleaner separation of concerns.\n", - "\n", - " parser = HfArgumentParser((ModelArguments, DataTrainingArguments, TrainingArguments))\n", - " if len(sys.argv) == 2 and sys.argv[1].endswith(\".json\"):\n", - " # If we pass only one argument to the script and it's the path to a json file,\n", - " # let's parse it to get our arguments.\n", - " model_args, data_args, training_args = parser.parse_json_file(json_file=os.path.abspath(sys.argv[1]))\n", - " else:\n", - " model_args, data_args, training_args = parser.parse_args_into_dataclasses()\n", - "\n", - " # Sending telemetry. Tracking the example usage helps us better allocate resources to maintain them. The\n", - " # information sent is the one passed as arguments along with your Python/PyTorch versions.\n", - " send_example_telemetry(\"run_glue\", model_args, data_args)\n", - "\n", - " # Setup logging\n", - " logging.basicConfig(\n", - " format=\"%(asctime)s - %(levelname)s - %(name)s - %(message)s\",\n", - " datefmt=\"%m/%d/%Y %H:%M:%S\",\n", - " handlers=[logging.StreamHandler(sys.stdout)],\n", - " )\n", - "\n", - " log_level = training_args.get_process_log_level()\n", - " logger.setLevel(log_level)\n", - " datasets.utils.logging.set_verbosity(log_level)\n", - " transformers.utils.logging.set_verbosity(log_level)\n", - " transformers.utils.logging.enable_default_handler()\n", - " transformers.utils.logging.enable_explicit_format()\n", - "\n", - " # Log on each process the small summary:\n", - " logger.warning(\n", - " f\"Process rank: {training_args.local_rank}, device: {training_args.device}, n_gpu: {training_args.n_gpu}\"\n", - " + f\"distributed training: {bool(training_args.local_rank != -1)}, 16-bits training: {training_args.fp16}\"\n", - " )\n", - " logger.info(f\"Training/evaluation parameters {training_args}\")\n", - "\n", - " # Detecting last checkpoint.\n", - " last_checkpoint = None\n", - " if os.path.isdir(training_args.output_dir) and training_args.do_train and not training_args.overwrite_output_dir:\n", - " last_checkpoint = get_last_checkpoint(training_args.output_dir)\n", - " if last_checkpoint is None and len(os.listdir(training_args.output_dir)) > 0:\n", - " raise ValueError(\n", - " f\"Output directory ({training_args.output_dir}) already exists and is not empty. \"\n", - " \"Use --overwrite_output_dir to overcome.\"\n", - " )\n", - " elif last_checkpoint is not None and training_args.resume_from_checkpoint is None:\n", - " logger.info(\n", - " f\"Checkpoint detected, resuming training at {last_checkpoint}. To avoid this behavior, change \"\n", - " \"the `--output_dir` or add `--overwrite_output_dir` to train from scratch.\"\n", - " )\n", - "\n", - " # Set seed before initializing model.\n", - " set_seed(training_args.seed)\n", - "\n", - " # Get the datasets: you can either provide your own CSV/JSON training and evaluation files (see below)\n", - " # or specify a GLUE benchmark task (the dataset will be downloaded automatically from the datasets Hub).\n", - " #\n", - " # For CSV/JSON files, this script will use as labels the column called 'label' and as pair of sentences the\n", - " # sentences in columns called 'sentence1' and 'sentence2' if such column exists or the first two columns not named\n", - " # label if at least two columns are provided.\n", - " #\n", - " # If the CSVs/JSONs contain only one non-label column, the script does single sentence classification on this\n", - " # single column. You can easily tweak this behavior (see below)\n", - " #\n", - " # In distributed training, the load_dataset function guarantee that only one local process can concurrently\n", - " # download the dataset.\n", - " if data_args.task_name is not None:\n", - " # Downloading and loading a dataset from the hub.\n", - " raw_datasets = load_dataset(\n", - " \"glue\",\n", - " data_args.task_name,\n", - " cache_dir=model_args.cache_dir,\n", - " use_auth_token=True if model_args.use_auth_token else None,\n", - " )\n", - " elif data_args.dataset_name is not None:\n", - " # Downloading and loading a dataset from the hub.\n", - " raw_datasets = load_dataset(\n", - " data_args.dataset_name,\n", - " data_args.dataset_config_name,\n", - " cache_dir=model_args.cache_dir,\n", - " use_auth_token=True if model_args.use_auth_token else None,\n", - " )\n", - " else:\n", - " # Loading a dataset from your local files.\n", - " # CSV/JSON training and evaluation files are needed.\n", - " data_files = {\"train\": data_args.train_file, \"validation\": data_args.validation_file}\n", - "\n", - " # Get the test dataset: you can provide your own CSV/JSON test file (see below)\n", - " # when you use `do_predict` without specifying a GLUE benchmark task.\n", - " if training_args.do_predict:\n", - " if data_args.test_file is not None:\n", - " train_extension = data_args.train_file.split(\".\")[-1]\n", - " test_extension = data_args.test_file.split(\".\")[-1]\n", - " assert (\n", - " test_extension == train_extension\n", - " ), \"`test_file` should have the same extension (csv or json) as `train_file`.\"\n", - " data_files[\"test\"] = data_args.test_file\n", - " else:\n", - " raise ValueError(\"Need either a GLUE task or a test file for `do_predict`.\")\n", - "\n", - " for key in data_files.keys():\n", - " logger.info(f\"load a local file for {key}: {data_files[key]}\")\n", - "\n", - " if data_args.train_file.endswith(\".csv\"):\n", - " # Loading a dataset from local csv files\n", - " raw_datasets = load_dataset(\n", - " \"csv\",\n", - " data_files=data_files,\n", - " cache_dir=model_args.cache_dir,\n", - " use_auth_token=True if model_args.use_auth_token else None,\n", - " )\n", - " else:\n", - " # Loading a dataset from local json files\n", - " raw_datasets = load_dataset(\n", - " \"json\",\n", - " data_files=data_files,\n", - " cache_dir=model_args.cache_dir,\n", - " use_auth_token=True if model_args.use_auth_token else None,\n", - " )\n", - " # See more about loading any type of standard or custom dataset at\n", - " # https://huggingface.co/docs/datasets/loading_datasets.html.\n", - "\n", - " # Labels\n", - " if data_args.task_name is not None:\n", - " is_regression = data_args.task_name == \"stsb\"\n", - " if not is_regression:\n", - " label_list = raw_datasets[\"train\"].features[\"label\"].names\n", - " num_labels = len(label_list)\n", - " else:\n", - " num_labels = 1\n", - " else:\n", - " # Trying to have good defaults here, don't hesitate to tweak to your needs.\n", - " is_regression = raw_datasets[\"train\"].features[\"label\"].dtype in [\"float32\", \"float64\"]\n", - " if is_regression:\n", - " num_labels = 1\n", - " else:\n", - " # A useful fast method:\n", - " # https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.unique\n", - " label_list = raw_datasets[\"train\"].unique(\"label\")\n", - " label_list.sort() # Let's sort it for determinism\n", - " num_labels = len(label_list)\n", - "\n", - " # Load pretrained model and tokenizer\n", - " #\n", - " # In distributed training, the .from_pretrained methods guarantee that only one local process can concurrently\n", - " # download model & vocab.\n", - " config = AutoConfig.from_pretrained(\n", - " model_args.config_name if model_args.config_name else model_args.model_name_or_path,\n", - " num_labels=num_labels,\n", - " finetuning_task=data_args.task_name,\n", - " cache_dir=model_args.cache_dir,\n", - " revision=model_args.model_revision,\n", - " use_auth_token=True if model_args.use_auth_token else None,\n", - " )\n", - " tokenizer = AutoTokenizer.from_pretrained(\n", - " model_args.tokenizer_name if model_args.tokenizer_name else model_args.model_name_or_path,\n", - " cache_dir=model_args.cache_dir,\n", - " use_fast=model_args.use_fast_tokenizer,\n", - " revision=model_args.model_revision,\n", - " use_auth_token=True if model_args.use_auth_token else None,\n", - " )\n", - " model = AutoModelForSequenceClassification.from_pretrained(\n", - " model_args.model_name_or_path,\n", - " from_tf=bool(\".ckpt\" in model_args.model_name_or_path),\n", - " config=config,\n", - " cache_dir=model_args.cache_dir,\n", - " revision=model_args.model_revision,\n", - " use_auth_token=True if model_args.use_auth_token else None,\n", - " ignore_mismatched_sizes=model_args.ignore_mismatched_sizes,\n", - " )\n", - "\n", - " # Preprocessing the raw_datasets\n", - " if data_args.task_name is not None:\n", - " sentence1_key, sentence2_key = task_to_keys[data_args.task_name]\n", - " else:\n", - " # Again, we try to have some nice defaults but don't hesitate to tweak to your use case.\n", - " non_label_column_names = [name for name in raw_datasets[\"train\"].column_names if name != \"label\"]\n", - " if \"sentence1\" in non_label_column_names and \"sentence2\" in non_label_column_names:\n", - " sentence1_key, sentence2_key = \"sentence1\", \"sentence2\"\n", - " else:\n", - " if len(non_label_column_names) >= 2:\n", - " sentence1_key, sentence2_key = non_label_column_names[:2]\n", - " else:\n", - " sentence1_key, sentence2_key = non_label_column_names[0], None\n", - "\n", - " # Padding strategy\n", - " if data_args.pad_to_max_length:\n", - " padding = \"max_length\"\n", - " else:\n", - " # We will pad later, dynamically at batch creation, to the max sequence length in each batch\n", - " padding = False\n", - "\n", - " # Some models have set the order of the labels to use, so let's make sure we do use it.\n", - " label_to_id = None\n", - " if (\n", - " model.config.label2id != PretrainedConfig(num_labels=num_labels).label2id\n", - " and data_args.task_name is not None\n", - " and not is_regression\n", - " ):\n", - " # Some have all caps in their config, some don't.\n", - " label_name_to_id = {k.lower(): v for k, v in model.config.label2id.items()}\n", - " if list(sorted(label_name_to_id.keys())) == list(sorted(label_list)):\n", - " label_to_id = {i: int(label_name_to_id[label_list[i]]) for i in range(num_labels)}\n", - " else:\n", - " logger.warning(\n", - " \"Your model seems to have been trained with labels, but they don't match the dataset: \",\n", - " f\"model labels: {list(sorted(label_name_to_id.keys()))}, dataset labels: {list(sorted(label_list))}.\"\n", - " \"\\nIgnoring the model labels as a result.\",\n", - " )\n", - " elif data_args.task_name is None and not is_regression:\n", - " label_to_id = {v: i for i, v in enumerate(label_list)}\n", - "\n", - " if label_to_id is not None:\n", - " model.config.label2id = label_to_id\n", - " model.config.id2label = {id: label for label, id in config.label2id.items()}\n", - " elif data_args.task_name is not None and not is_regression:\n", - " model.config.label2id = {l: i for i, l in enumerate(label_list)}\n", - " model.config.id2label = {id: label for label, id in config.label2id.items()}\n", - "\n", - " if data_args.max_seq_length > tokenizer.model_max_length:\n", - " logger.warning(\n", - " f\"The max_seq_length passed ({data_args.max_seq_length}) is larger than the maximum length for the\"\n", - " f\"model ({tokenizer.model_max_length}). Using max_seq_length={tokenizer.model_max_length}.\"\n", - " )\n", - " max_seq_length = min(data_args.max_seq_length, tokenizer.model_max_length)\n", - "\n", - " def preprocess_function(examples):\n", - " # Tokenize the texts\n", - " args = (\n", - " (examples[sentence1_key],) if sentence2_key is None else (examples[sentence1_key], examples[sentence2_key])\n", - " )\n", - " result = tokenizer(*args, padding=padding, max_length=max_seq_length, truncation=True)\n", - "\n", - " # Map labels to IDs (not necessary for GLUE tasks)\n", - " if label_to_id is not None and \"label\" in examples:\n", - " result[\"label\"] = [(label_to_id[l] if l != -1 else -1) for l in examples[\"label\"]]\n", - " return result\n", - "\n", - " with training_args.main_process_first(desc=\"dataset map pre-processing\"):\n", - " raw_datasets = raw_datasets.map(\n", - " preprocess_function,\n", - " batched=True,\n", - " load_from_cache_file=not data_args.overwrite_cache,\n", - " desc=\"Running tokenizer on dataset\",\n", - " )\n", - " if training_args.do_train:\n", - " if \"train\" not in raw_datasets:\n", - " raise ValueError(\"--do_train requires a train dataset\")\n", - " train_dataset = raw_datasets[\"train\"]\n", - " if data_args.max_train_samples is not None:\n", - " max_train_samples = min(len(train_dataset), data_args.max_train_samples)\n", - " train_dataset = train_dataset.select(range(max_train_samples))\n", - "\n", - " if training_args.do_eval:\n", - " if \"validation\" not in raw_datasets and \"validation_matched\" not in raw_datasets:\n", - " raise ValueError(\"--do_eval requires a validation dataset\")\n", - " eval_dataset = raw_datasets[\"validation_matched\" if data_args.task_name == \"mnli\" else \"validation\"]\n", - " if data_args.max_eval_samples is not None:\n", - " max_eval_samples = min(len(eval_dataset), data_args.max_eval_samples)\n", - " eval_dataset = eval_dataset.select(range(max_eval_samples))\n", - "\n", - " if training_args.do_predict or data_args.task_name is not None or data_args.test_file is not None:\n", - " if \"test\" not in raw_datasets and \"test_matched\" not in raw_datasets:\n", - " raise ValueError(\"--do_predict requires a test dataset\")\n", - " predict_dataset = raw_datasets[\"test_matched\" if data_args.task_name == \"mnli\" else \"test\"]\n", - " if data_args.max_predict_samples is not None:\n", - " max_predict_samples = min(len(predict_dataset), data_args.max_predict_samples)\n", - " predict_dataset = predict_dataset.select(range(max_predict_samples))\n", - "\n", - " # Log a few random samples from the training set:\n", - " if training_args.do_train:\n", - " for index in random.sample(range(len(train_dataset)), 3):\n", - " logger.info(f\"Sample {index} of the training set: {train_dataset[index]}.\")\n", - "\n", - " # Get the metric function\n", - " if data_args.task_name is not None:\n", - " metric = load_metric(\"glue\", data_args.task_name)\n", - " else:\n", - " metric = load_metric(\"accuracy\")\n", - "\n", - " # You can define your custom compute_metrics function. It takes an `EvalPrediction` object (a namedtuple with a\n", - " # predictions and label_ids field) and has to return a dictionary string to float.\n", - " def compute_metrics(p: EvalPrediction):\n", - " preds = p.predictions[0] if isinstance(p.predictions, tuple) else p.predictions\n", - " preds = np.squeeze(preds) if is_regression else np.argmax(preds, axis=1)\n", - " if data_args.task_name is not None:\n", - " result = metric.compute(predictions=preds, references=p.label_ids)\n", - " if len(result) > 1:\n", - " result[\"combined_score\"] = np.mean(list(result.values())).item()\n", - " return result\n", - " elif is_regression:\n", - " return {\"mse\": ((preds - p.label_ids) ** 2).mean().item()}\n", - " else:\n", - " return {\"accuracy\": (preds == p.label_ids).astype(np.float32).mean().item()}\n", - "\n", - " # Data collator will default to DataCollatorWithPadding when the tokenizer is passed to Trainer, so we change it if\n", - " # we already did the padding.\n", - " if data_args.pad_to_max_length:\n", - " data_collator = default_data_collator\n", - " elif training_args.fp16:\n", - " data_collator = DataCollatorWithPadding(tokenizer, pad_to_multiple_of=8)\n", - " else:\n", - " data_collator = None\n", - "\n", - " # Initialize our Trainer\n", - " trainer = Trainer(\n", - " model=model,\n", - " args=training_args,\n", - " train_dataset=train_dataset if training_args.do_train else None,\n", - " eval_dataset=eval_dataset if training_args.do_eval else None,\n", - " compute_metrics=compute_metrics,\n", - " tokenizer=tokenizer,\n", - " data_collator=data_collator,\n", - " )\n", - " \n", - " # Training\n", - " if training_args.do_train:\n", - " checkpoint = None\n", - " if training_args.resume_from_checkpoint is not None:\n", - " checkpoint = training_args.resume_from_checkpoint\n", - " elif last_checkpoint is not None:\n", - " checkpoint = last_checkpoint\n", - " train_result = trainer.train(resume_from_checkpoint=checkpoint)\n", - " metrics = train_result.metrics\n", - " max_train_samples = (\n", - " data_args.max_train_samples if data_args.max_train_samples is not None else len(train_dataset)\n", - " )\n", - " metrics[\"train_samples\"] = min(max_train_samples, len(train_dataset))\n", - "\n", - " trainer.save_model() # Saves the tokenizer too for easy upload\n", - "\n", - " trainer.log_metrics(\"train\", metrics)\n", - " trainer.save_metrics(\"train\", metrics)\n", - " trainer.save_state()\n", - "\n", - " # Evaluation\n", - " if training_args.do_eval:\n", - " logger.info(\"*** Evaluate ***\")\n", - "\n", - " # Loop to handle MNLI double evaluation (matched, mis-matched)\n", - " tasks = [data_args.task_name]\n", - " eval_datasets = [eval_dataset]\n", - " if data_args.task_name == \"mnli\":\n", - " tasks.append(\"mnli-mm\")\n", - " eval_datasets.append(raw_datasets[\"validation_mismatched\"])\n", - " combined = {}\n", - "\n", - " for eval_dataset, task in zip(eval_datasets, tasks):\n", - " metrics = trainer.evaluate(eval_dataset=eval_dataset)\n", - "\n", - " max_eval_samples = (\n", - " data_args.max_eval_samples if data_args.max_eval_samples is not None else len(eval_dataset)\n", - " )\n", - " metrics[\"eval_samples\"] = min(max_eval_samples, len(eval_dataset))\n", - "\n", - " if task == \"mnli-mm\":\n", - " metrics = {k + \"_mm\": v for k, v in metrics.items()}\n", - " if task is not None and \"mnli\" in task:\n", - " combined.update(metrics)\n", - "\n", - " trainer.log_metrics(\"eval\", metrics)\n", - " trainer.save_metrics(\"eval\", combined if task is not None and \"mnli\" in task else metrics)\n", - "\n", - " if training_args.do_predict:\n", - " logger.info(\"*** Predict ***\")\n", - "\n", - " # Loop to handle MNLI double evaluation (matched, mis-matched)\n", - " tasks = [data_args.task_name]\n", - " predict_datasets = [predict_dataset]\n", - " if data_args.task_name == \"mnli\":\n", - " tasks.append(\"mnli-mm\")\n", - " predict_datasets.append(raw_datasets[\"test_mismatched\"])\n", - "\n", - " for predict_dataset, task in zip(predict_datasets, tasks):\n", - " # Removing the `label` columns because it contains -1 and Trainer won't like that.\n", - " predict_dataset = predict_dataset.remove_columns(\"label\")\n", - " predictions = trainer.predict(predict_dataset, metric_key_prefix=\"predict\").predictions\n", - " predictions = np.squeeze(predictions) if is_regression else np.argmax(predictions, axis=1)\n", - "\n", - " output_predict_file = os.path.join(training_args.output_dir, f\"predict_results_{task}.txt\")\n", - " if trainer.is_world_process_zero():\n", - " with open(output_predict_file, \"w\") as writer:\n", - " logger.info(f\"***** Predict results {task} *****\")\n", - " writer.write(\"index\\tprediction\\n\")\n", - " for index, item in enumerate(predictions):\n", - " if is_regression:\n", - " writer.write(f\"{index}\\t{item:3.3f}\\n\")\n", - " else:\n", - " item = label_list[item]\n", - " writer.write(f\"{index}\\t{item}\\n\")\n", - "\n", - " kwargs = {\"finetuned_from\": model_args.model_name_or_path, \"tasks\": \"text-classification\"}\n", - " if data_args.task_name is not None:\n", - " kwargs[\"language\"] = \"en\"\n", - " kwargs[\"dataset_tags\"] = \"glue\"\n", - " kwargs[\"dataset_args\"] = data_args.task_name\n", - " kwargs[\"dataset\"] = f\"GLUE {data_args.task_name.upper()}\"\n", - "\n", - " if training_args.push_to_hub:\n", - " trainer.push_to_hub(**kwargs)\n", - " else:\n", - " trainer.create_model_card(**kwargs)\n", - "\n", - "\n", - "def _mp_fn(index):\n", - " # For xla_spawn (TPUs)\n", - " main()\n", - "\n", - "\n", - "if __name__ == \"__main__\":\n", - " main()\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.3" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/neural_coder/extensions/neural_compressor_ext_lab/tsconfig.json b/neural_coder/extensions/neural_compressor_ext_lab/tsconfig.json deleted file mode 100644 index 7c8e8c78b69..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/tsconfig.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "compilerOptions": { - "allowSyntheticDefaultImports": true, - "composite": true, - "declaration": true, - "esModuleInterop": true, - "incremental": true, - "jsx": "react", - "module": "esnext", - "moduleResolution": "node", - "noEmitOnError": true, - "noImplicitAny": true, - "noUnusedLocals": true, - "preserveWatchOutput": true, - "resolveJsonModule": true, - "outDir": "lib", - "rootDir": "src", - "strict": true, - "strictNullChecks": true, - "target": "es2017", - "types": ["node"] - }, - "include": ["src/*"] -} diff --git a/neural_coder/extensions/neural_compressor_ext_lab/tsconfig.tsbuildinfo b/neural_coder/extensions/neural_compressor_ext_lab/tsconfig.tsbuildinfo deleted file mode 100644 index d827a56b4f3..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab/tsconfig.tsbuildinfo +++ /dev/null @@ -1,12213 +0,0 @@ -{ - "program": { - "fileInfos": { - "./node_modules/typescript/lib/lib.es5.d.ts": { - "version": "9622e8bd7cc72a7dab819a8011ecbf81d443638082e5cb99ecf2e75ff56ffc9d", - "signature": "9622e8bd7cc72a7dab819a8011ecbf81d443638082e5cb99ecf2e75ff56ffc9d", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2015.d.ts": { - "version": "dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6", - "signature": "dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6", - "affectsGlobalScope": false - }, - "./node_modules/typescript/lib/lib.es2016.d.ts": { - "version": "7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467", - "signature": "7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467", - "affectsGlobalScope": false - }, - "./node_modules/typescript/lib/lib.es2017.d.ts": { - "version": "8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9", - "signature": "8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9", - "affectsGlobalScope": false - }, - "./node_modules/typescript/lib/lib.es2018.d.ts": { - "version": "5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06", - "signature": "5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06", - "affectsGlobalScope": false - }, - "./node_modules/typescript/lib/lib.es2019.d.ts": { - "version": "e6b724280c694a9f588847f754198fb96c43d805f065c3a5b28bbc9594541c84", - "signature": "e6b724280c694a9f588847f754198fb96c43d805f065c3a5b28bbc9594541c84", - "affectsGlobalScope": false - }, - "./node_modules/typescript/lib/lib.es2020.d.ts": { - "version": "e21c071ca3e1b4a815d5f04a7475adcaeea5d64367e840dd0154096d705c3940", - "signature": "e21c071ca3e1b4a815d5f04a7475adcaeea5d64367e840dd0154096d705c3940", - "affectsGlobalScope": false - }, - "./node_modules/typescript/lib/lib.dom.d.ts": { - "version": "abadddbf660adeec27e9a56584907d52fa1d6e1e1dc49f639a921baa951b7a84", - "signature": "abadddbf660adeec27e9a56584907d52fa1d6e1e1dc49f639a921baa951b7a84", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.dom.iterable.d.ts": { - "version": "d42f4141bd9ce82b4e2902f26acb00c183e321be19a38bbc0e76a922c1724c94", - "signature": "d42f4141bd9ce82b4e2902f26acb00c183e321be19a38bbc0e76a922c1724c94", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.webworker.importscripts.d.ts": { - "version": "7fac8cb5fc820bc2a59ae11ef1c5b38d3832c6d0dfaec5acdb5569137d09a481", - "signature": "7fac8cb5fc820bc2a59ae11ef1c5b38d3832c6d0dfaec5acdb5569137d09a481", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.scripthost.d.ts": { - "version": "097a57355ded99c68e6df1b738990448e0bf170e606707df5a7c0481ff2427cd", - "signature": "097a57355ded99c68e6df1b738990448e0bf170e606707df5a7c0481ff2427cd", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2015.core.d.ts": { - "version": "46ee15e9fefa913333b61eaf6b18885900b139867d89832a515059b62cf16a17", - "signature": "46ee15e9fefa913333b61eaf6b18885900b139867d89832a515059b62cf16a17", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2015.collection.d.ts": { - "version": "43fb1d932e4966a39a41b464a12a81899d9ae5f2c829063f5571b6b87e6d2f9c", - "signature": "43fb1d932e4966a39a41b464a12a81899d9ae5f2c829063f5571b6b87e6d2f9c", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2015.generator.d.ts": { - "version": "cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a", - "signature": "cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2015.iterable.d.ts": { - "version": "8b2a5df1ce95f78f6b74f1a555ccdb6baab0486b42d8345e0871dd82811f9b9a", - "signature": "8b2a5df1ce95f78f6b74f1a555ccdb6baab0486b42d8345e0871dd82811f9b9a", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2015.promise.d.ts": { - "version": "2bb4b3927299434052b37851a47bf5c39764f2ba88a888a107b32262e9292b7c", - "signature": "2bb4b3927299434052b37851a47bf5c39764f2ba88a888a107b32262e9292b7c", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2015.proxy.d.ts": { - "version": "7207e317a2cb07a177e7d963ab7b8c0e85dde7f9ddb50351f830239bf597569e", - "signature": "7207e317a2cb07a177e7d963ab7b8c0e85dde7f9ddb50351f830239bf597569e", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2015.reflect.d.ts": { - "version": "cb609802a8698aa28b9c56331d4b53f590ca3c1c3a255350304ae3d06017779d", - "signature": "cb609802a8698aa28b9c56331d4b53f590ca3c1c3a255350304ae3d06017779d", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2015.symbol.d.ts": { - "version": "3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93", - "signature": "3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts": { - "version": "9d122b7e8c1a5c72506eea50c0973cba55b92b5532d5cafa8a6ce2c547d57551", - "signature": "9d122b7e8c1a5c72506eea50c0973cba55b92b5532d5cafa8a6ce2c547d57551", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2016.array.include.d.ts": { - "version": "3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006", - "signature": "3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2017.object.d.ts": { - "version": "17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a", - "signature": "17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts": { - "version": "7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98", - "signature": "7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2017.string.d.ts": { - "version": "6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577", - "signature": "6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2017.intl.d.ts": { - "version": "12a310447c5d23c7d0d5ca2af606e3bd08afda69100166730ab92c62999ebb9d", - "signature": "12a310447c5d23c7d0d5ca2af606e3bd08afda69100166730ab92c62999ebb9d", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts": { - "version": "b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e", - "signature": "b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts": { - "version": "0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a", - "signature": "0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts": { - "version": "a40c4d82bf13fcded295ac29f354eb7d40249613c15e07b53f2fc75e45e16359", - "signature": "a40c4d82bf13fcded295ac29f354eb7d40249613c15e07b53f2fc75e45e16359", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2018.intl.d.ts": { - "version": "df9c8a72ca8b0ed62f5470b41208a0587f0f73f0a7db28e5a1272cf92537518e", - "signature": "df9c8a72ca8b0ed62f5470b41208a0587f0f73f0a7db28e5a1272cf92537518e", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2018.promise.d.ts": { - "version": "bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c", - "signature": "bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2018.regexp.d.ts": { - "version": "c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8", - "signature": "c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2019.array.d.ts": { - "version": "9d57b2b5d15838ed094aa9ff1299eecef40b190722eb619bac4616657a05f951", - "signature": "9d57b2b5d15838ed094aa9ff1299eecef40b190722eb619bac4616657a05f951", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2019.object.d.ts": { - "version": "6c51b5dd26a2c31dbf37f00cfc32b2aa6a92e19c995aefb5b97a3a64f1ac99de", - "signature": "6c51b5dd26a2c31dbf37f00cfc32b2aa6a92e19c995aefb5b97a3a64f1ac99de", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2019.string.d.ts": { - "version": "93544ca2f26a48716c1b6c5091842cad63129daac422dfa4bc52460465f22bb1", - "signature": "93544ca2f26a48716c1b6c5091842cad63129daac422dfa4bc52460465f22bb1", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2019.symbol.d.ts": { - "version": "2ad234885a4240522efccd77de6c7d99eecf9b4de0914adb9a35c0c22433f993", - "signature": "2ad234885a4240522efccd77de6c7d99eecf9b4de0914adb9a35c0c22433f993", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2020.bigint.d.ts": { - "version": "7b5a10e3c897fabece5a51aa85b4111727d7adb53c2734b5d37230ff96802a09", - "signature": "7b5a10e3c897fabece5a51aa85b4111727d7adb53c2734b5d37230ff96802a09", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2020.promise.d.ts": { - "version": "7435b75fdf3509622e79622dbe5091cf4b09688410ee2034e4fc17d0c99d0862", - "signature": "7435b75fdf3509622e79622dbe5091cf4b09688410ee2034e4fc17d0c99d0862", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts": { - "version": "e7e8e1d368290e9295ef18ca23f405cf40d5456fa9f20db6373a61ca45f75f40", - "signature": "e7e8e1d368290e9295ef18ca23f405cf40d5456fa9f20db6373a61ca45f75f40", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2020.string.d.ts": { - "version": "faf0221ae0465363c842ce6aa8a0cbda5d9296940a8e26c86e04cc4081eea21e", - "signature": "faf0221ae0465363c842ce6aa8a0cbda5d9296940a8e26c86e04cc4081eea21e", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts": { - "version": "936d7d2e8851af9ccfa5333b15e877a824417d352b1d7fd06388639dc69ef80a", - "signature": "936d7d2e8851af9ccfa5333b15e877a824417d352b1d7fd06388639dc69ef80a", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2020.intl.d.ts": { - "version": "31e8df2398e328077079c17ea4f1664bad0a34adf8b0608837e504e310e329a1", - "signature": "31e8df2398e328077079c17ea4f1664bad0a34adf8b0608837e504e310e329a1", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.esnext.intl.d.ts": { - "version": "89bf2b7a601b73ea4311eda9c41f86a58994fec1bee3b87c4a14d68d9adcdcbd", - "signature": "89bf2b7a601b73ea4311eda9c41f86a58994fec1bee3b87c4a14d68d9adcdcbd", - "affectsGlobalScope": true - }, - "./node_modules/typescript/lib/lib.es2017.full.d.ts": { - "version": "d2f31f19e1ba6ed59be9259d660a239d9a3fcbbc8e038c6b2009bde34b175fed", - "signature": "d2f31f19e1ba6ed59be9259d660a239d9a3fcbbc8e038c6b2009bde34b175fed", - "affectsGlobalScope": false - }, - "./src/constants.ts": { - "version": "d1b50b28f73598f2c0479913be3071976275030e57bf67d1bb2f28553fa9cd75", - "signature": "93ae52395354778bcb769ba56ab91921949b82433f475bce3e341b895bcf1b03", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/algorithm/types/array.d.ts": { - "version": "df52f40fae2bd287b9fb52f0d4cd6978891f5b9e12c8bc4b51f5aeb20673db24", - "signature": "df52f40fae2bd287b9fb52f0d4cd6978891f5b9e12c8bc4b51f5aeb20673db24", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/algorithm/types/iter.d.ts": { - "version": "95a373d620cf8adb5baa4d4f18c0880d9279761d742075693b64dcfe25d93249", - "signature": "95a373d620cf8adb5baa4d4f18c0880d9279761d742075693b64dcfe25d93249", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/algorithm/types/chain.d.ts": { - "version": "59c71ace3907b7558202ab9fb0fc29d0f000455e6addb8891476ea6f29704fb0", - "signature": "59c71ace3907b7558202ab9fb0fc29d0f000455e6addb8891476ea6f29704fb0", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/algorithm/types/empty.d.ts": { - "version": "ac222059167c12b97693a32458d469428079921ef2e21a41370e192f679559a4", - "signature": "ac222059167c12b97693a32458d469428079921ef2e21a41370e192f679559a4", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/algorithm/types/enumerate.d.ts": { - "version": "49fa72b3dd09f2d8cfa8538f3aba53644e90a99866c486a1e535f6e45a809019", - "signature": "49fa72b3dd09f2d8cfa8538f3aba53644e90a99866c486a1e535f6e45a809019", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/algorithm/types/filter.d.ts": { - "version": "4bd953ab46129d1a06fc848cc1e04f69d003cba1010839ae5f11d9a8ecc1b45c", - "signature": "4bd953ab46129d1a06fc848cc1e04f69d003cba1010839ae5f11d9a8ecc1b45c", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/algorithm/types/find.d.ts": { - "version": "985be8579445c37fccc690db36529d9197abac484b76e2374845eda82fc134be", - "signature": "985be8579445c37fccc690db36529d9197abac484b76e2374845eda82fc134be", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/algorithm/types/map.d.ts": { - "version": "778e780516d0cfa36e160dcdbc2cc64193fb13853c4019bafeb2adc39d4b6f95", - "signature": "778e780516d0cfa36e160dcdbc2cc64193fb13853c4019bafeb2adc39d4b6f95", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/algorithm/types/range.d.ts": { - "version": "61821a4dfe8525bb4082648600ecd1f945698fb65a0bbf4fa2b6e160751fe5e1", - "signature": "61821a4dfe8525bb4082648600ecd1f945698fb65a0bbf4fa2b6e160751fe5e1", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/algorithm/types/reduce.d.ts": { - "version": "6f2192fe22e5aed3e61ae7891921feb8601bfa101161c7b522965d709210cc41", - "signature": "6f2192fe22e5aed3e61ae7891921feb8601bfa101161c7b522965d709210cc41", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/algorithm/types/repeat.d.ts": { - "version": "39effd6ab75c733dd48cbe43a91658cec9cf86db5a961d3b091d8194b7e7b573", - "signature": "39effd6ab75c733dd48cbe43a91658cec9cf86db5a961d3b091d8194b7e7b573", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/algorithm/types/retro.d.ts": { - "version": "431207ccbae58b4046cba4a5956beeea69a151defc993bcba16b357cbc8871e7", - "signature": "431207ccbae58b4046cba4a5956beeea69a151defc993bcba16b357cbc8871e7", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/algorithm/types/sort.d.ts": { - "version": "2053f012d9d8edaeb4b66bb65120888dd342be84316cc7b85e78cae9ceade349", - "signature": "2053f012d9d8edaeb4b66bb65120888dd342be84316cc7b85e78cae9ceade349", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/algorithm/types/stride.d.ts": { - "version": "bcfae0d75f0dd13b0d0bd6bb6a1a527076f23d48335a1530211d4926556edf4d", - "signature": "bcfae0d75f0dd13b0d0bd6bb6a1a527076f23d48335a1530211d4926556edf4d", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/algorithm/types/string.d.ts": { - "version": "b8186710d384b0b58f9ac2e8e9e4a8cf6385718fd47f12adfca9e163def1fa5e", - "signature": "b8186710d384b0b58f9ac2e8e9e4a8cf6385718fd47f12adfca9e163def1fa5e", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/algorithm/types/take.d.ts": { - "version": "2e55931399ada20784a0903627d3e7cac14e6849ef7e589f32907ed733160af0", - "signature": "2e55931399ada20784a0903627d3e7cac14e6849ef7e589f32907ed733160af0", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/algorithm/types/zip.d.ts": { - "version": "425744ecce376e0c201eb15a24df23c20b9f9222c25501a64147191255f1a5bb", - "signature": "425744ecce376e0c201eb15a24df23c20b9f9222c25501a64147191255f1a5bb", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/algorithm/types/index.d.ts": { - "version": "d9700500170f5138bbb3b59ede0d2303486b24826a19dd242eaaa667a3735b63", - "signature": "d9700500170f5138bbb3b59ede0d2303486b24826a19dd242eaaa667a3735b63", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/coreutils/types/json.d.ts": { - "version": "44a4b5ef53f2ff94bfcfa223e3fc3ad35f32bef57337e050513dd7c729a0cb63", - "signature": "44a4b5ef53f2ff94bfcfa223e3fc3ad35f32bef57337e050513dd7c729a0cb63", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/coreutils/types/mime.d.ts": { - "version": "47dbb9212d0f309e56914de06038a91ad4f0ce9e28a200ebe7c8268bada8fede", - "signature": "47dbb9212d0f309e56914de06038a91ad4f0ce9e28a200ebe7c8268bada8fede", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/coreutils/types/promise.d.ts": { - "version": "a57ee34edf8791c8c4395ada1fb459df7aad714838555ab306729b66db795840", - "signature": "a57ee34edf8791c8c4395ada1fb459df7aad714838555ab306729b66db795840", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/coreutils/types/token.d.ts": { - "version": "facc62a0c8748f37d6c85d3e5a6eb4cd1d40a899d4ee2c360c9ec4756513931c", - "signature": "facc62a0c8748f37d6c85d3e5a6eb4cd1d40a899d4ee2c360c9ec4756513931c", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/coreutils/types/index.common.d.ts": { - "version": "d59884537fee2053545586c2ea66e27ae54fa0e59e9fec4ef58b9bb3eb3a676c", - "signature": "d59884537fee2053545586c2ea66e27ae54fa0e59e9fec4ef58b9bb3eb3a676c", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/coreutils/types/random.d.ts": { - "version": "f58caa451ccf0cdc2834698380fa13f964033178d0cb73cce5d2fd2ba0cfbade", - "signature": "f58caa451ccf0cdc2834698380fa13f964033178d0cb73cce5d2fd2ba0cfbade", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/coreutils/types/random.browser.d.ts": { - "version": "42b37508de20026ecfb53ad4293a3fb1d5ceac85d03f4d831c999db3f2d942cc", - "signature": "42b37508de20026ecfb53ad4293a3fb1d5ceac85d03f4d831c999db3f2d942cc", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/coreutils/types/uuid.browser.d.ts": { - "version": "6bb2babdac69f5089b8e5d645977aa18301e6c9ddd8e80fdd5996149235ffe35", - "signature": "6bb2babdac69f5089b8e5d645977aa18301e6c9ddd8e80fdd5996149235ffe35", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/coreutils/types/index.d.ts": { - "version": "741e32002f767357ff950d74855ea336e51409738f861e6d5a163cd4b0450bd2", - "signature": "741e32002f767357ff950d74855ea336e51409738f861e6d5a163cd4b0450bd2", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/clipboard.d.ts": { - "version": "b9a2b4d2c1040298a3940b1f904553904336c6618bd87aaefa9e170b0b9331e9", - "signature": "b9a2b4d2c1040298a3940b1f904553904336c6618bd87aaefa9e170b0b9331e9", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/messaging/types/index.d.ts": { - "version": "cac40d24651330bd29ebcf835dc9014a8d9ce02219503fb1dd880ffd27d71b3b", - "signature": "cac40d24651330bd29ebcf835dc9014a8d9ce02219503fb1dd880ffd27d71b3b", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/signaling/types/index.d.ts": { - "version": "11e5e4c5983c5150410112a156503aa02b29fed56100314eb3a77334a5e2ec6c", - "signature": "11e5e4c5983c5150410112a156503aa02b29fed56100314eb3a77334a5e2ec6c", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/disposable/types/index.d.ts": { - "version": "80a29bdb045c8403249b0df81e2c660139556735e363b9228b9e6ed731576cfe", - "signature": "80a29bdb045c8403249b0df81e2c660139556735e363b9228b9e6ed731576cfe", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/virtualdom/types/index.d.ts": { - "version": "189b287ec7c821f61bf76d90a62575b048d0434c3baee8fc8dea6c30ebc35999", - "signature": "189b287ec7c821f61bf76d90a62575b048d0434c3baee8fc8dea6c30ebc35999", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/title.d.ts": { - "version": "a4b91055eac6096b0d40a4981c4a993d3e259b1f009360880902e98eb5e028ea", - "signature": "a4b91055eac6096b0d40a4981c4a993d3e259b1f009360880902e98eb5e028ea", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/widget.d.ts": { - "version": "29476079a25eac3dd7aa7af3411cd675b6a446f7e56b9fb720a7f4c451b6cb8b", - "signature": "29476079a25eac3dd7aa7af3411cd675b6a446f7e56b9fb720a7f4c451b6cb8b", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/layout.d.ts": { - "version": "e28b6033949daa05a21c45ac3bf4db03d07e9da632a976224c57744c46bce08e", - "signature": "e28b6033949daa05a21c45ac3bf4db03d07e9da632a976224c57744c46bce08e", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/panellayout.d.ts": { - "version": "b6fe9902db09a08fb5816c2644d47b21b48763a6493d1f2080dcc8f97f63ffd5", - "signature": "b6fe9902db09a08fb5816c2644d47b21b48763a6493d1f2080dcc8f97f63ffd5", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/splitlayout.d.ts": { - "version": "92e8a3c3a8469d4afad78dbee2dd444ccbb8f96b87cba06a3c2b5480eb67c311", - "signature": "92e8a3c3a8469d4afad78dbee2dd444ccbb8f96b87cba06a3c2b5480eb67c311", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/accordionlayout.d.ts": { - "version": "0b2d7f6ab179f786acc2e52f0470e25ff5bb9c92bb625424f452e05b1111c059", - "signature": "0b2d7f6ab179f786acc2e52f0470e25ff5bb9c92bb625424f452e05b1111c059", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/panel.d.ts": { - "version": "4ea4e4aeb7cc473d641ec53cc7a05324ff1c528e452e1a0f5949a245911d4775", - "signature": "4ea4e4aeb7cc473d641ec53cc7a05324ff1c528e452e1a0f5949a245911d4775", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/splitpanel.d.ts": { - "version": "d29aaf721f4504024f0f55fed33190b289699b5664a4b312ba1e2aff6b7999ae", - "signature": "d29aaf721f4504024f0f55fed33190b289699b5664a4b312ba1e2aff6b7999ae", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/accordionpanel.d.ts": { - "version": "f32fe8c0e5f39f675c67525804e2da8e27bf49194e5cd9cde5bd776f2e418251", - "signature": "f32fe8c0e5f39f675c67525804e2da8e27bf49194e5cd9cde5bd776f2e418251", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/boxengine.d.ts": { - "version": "6ce99f2c6e7c79a0b467e93cc607909fdeea4075ac24b2ea26df81c756c91197", - "signature": "6ce99f2c6e7c79a0b467e93cc607909fdeea4075ac24b2ea26df81c756c91197", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/boxlayout.d.ts": { - "version": "b450cc3a4ab4ba2663144cb5d2bee1dad19437bb22008bf4cb6abf33ab93c394", - "signature": "b450cc3a4ab4ba2663144cb5d2bee1dad19437bb22008bf4cb6abf33ab93c394", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/boxpanel.d.ts": { - "version": "eb0acd32fc29c07e864c737a4811b71159e03833b36febb85f7e47259d87e135", - "signature": "eb0acd32fc29c07e864c737a4811b71159e03833b36febb85f7e47259d87e135", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/commands/types/index.d.ts": { - "version": "c6b20e1b6eddfa0fb53e1b5f6c5dc3aac8ce0114b1c3ed9e9850736b5db88f35", - "signature": "c6b20e1b6eddfa0fb53e1b5f6c5dc3aac8ce0114b1c3ed9e9850736b5db88f35", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/commandpalette.d.ts": { - "version": "1293b8f4930237c82f58861ca488f50a2537a88f94682440f9fd07223ccee56c", - "signature": "1293b8f4930237c82f58861ca488f50a2537a88f94682440f9fd07223ccee56c", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/menu.d.ts": { - "version": "2c12e9393125ae27eee5f69e9b28cd65bd1073db0c99dd0625436f9b9815258e", - "signature": "2c12e9393125ae27eee5f69e9b28cd65bd1073db0c99dd0625436f9b9815258e", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/contextmenu.d.ts": { - "version": "cfef3a852fed8d8e32682841735514dc19a614d2bb04e0de6a430e72a3130ac6", - "signature": "cfef3a852fed8d8e32682841735514dc19a614d2bb04e0de6a430e72a3130ac6", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/tabbar.d.ts": { - "version": "8e6a1619fb5e821c9682264696871b55f1ab21903477d6272b44d6824fc511c2", - "signature": "8e6a1619fb5e821c9682264696871b55f1ab21903477d6272b44d6824fc511c2", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/docklayout.d.ts": { - "version": "c2d6545069db68b471ce68ef45ed33327663dc9c832c0bee2a72cd360a08f7fe", - "signature": "c2d6545069db68b471ce68ef45ed33327663dc9c832c0bee2a72cd360a08f7fe", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/dockpanel.d.ts": { - "version": "1d4df0f49549c39bc09a70dc267f5d0022f4cab181750f4d50d61ee30edd5a07", - "signature": "1d4df0f49549c39bc09a70dc267f5d0022f4cab181750f4d50d61ee30edd5a07", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/focustracker.d.ts": { - "version": "b36ccfcfa507c9be4bc662468d708d9fadb87d6950583f60456799e2534eac1b", - "signature": "b36ccfcfa507c9be4bc662468d708d9fadb87d6950583f60456799e2534eac1b", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/gridlayout.d.ts": { - "version": "9d3fb450742b3f5c5f459177e70fa3c4c4ab52d0b4215be87cfcdf5fc8685ad2", - "signature": "9d3fb450742b3f5c5f459177e70fa3c4c4ab52d0b4215be87cfcdf5fc8685ad2", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/menubar.d.ts": { - "version": "036adf93fb4f6f977fdfa686d8add1830e9d30f3066b4390530c4c2189754fc2", - "signature": "036adf93fb4f6f977fdfa686d8add1830e9d30f3066b4390530c4c2189754fc2", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/scrollbar.d.ts": { - "version": "ff8fce615e42a7a40d34fd1110488663bc010469e7cd3d21df8ddda06f6ebd95", - "signature": "ff8fce615e42a7a40d34fd1110488663bc010469e7cd3d21df8ddda06f6ebd95", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/singletonlayout.d.ts": { - "version": "cb114e95d686eadc19feda14f7ae0c497fd060415cf669d4062447ef22b54e93", - "signature": "cb114e95d686eadc19feda14f7ae0c497fd060415cf669d4062447ef22b54e93", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/stackedlayout.d.ts": { - "version": "1fb371850fe099544d0a16b29f3627fe634e4ca2f1e4ac92c12f4481fb1395e5", - "signature": "1fb371850fe099544d0a16b29f3627fe634e4ca2f1e4ac92c12f4481fb1395e5", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/stackedpanel.d.ts": { - "version": "4f3efa9e1d11ad4670f1773324781831819064d702e85616b05534025e927a81", - "signature": "4f3efa9e1d11ad4670f1773324781831819064d702e85616b05534025e927a81", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/tabpanel.d.ts": { - "version": "c172f46cd9c655653f116d3707ef6c84aa3e924514685e78ac5dababe2986313", - "signature": "c172f46cd9c655653f116d3707ef6c84aa3e924514685e78ac5dababe2986313", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/widgets/types/index.d.ts": { - "version": "5f90fbeec75ffafa87e37f8e1caa1411174f0d89f24b0bb19970e18bb1dd3c0d", - "signature": "5f90fbeec75ffafa87e37f8e1caa1411174f0d89f24b0bb19970e18bb1dd3c0d", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/collapse.d.ts": { - "version": "147d833a2c635e5e69bcf63b33bbbd07fc47cd95d012d8199a132c8e63a78f05", - "signature": "147d833a2c635e5e69bcf63b33bbbd07fc47cd95d012d8199a132c8e63a78f05", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/commandlinker.d.ts": { - "version": "78f55430f6416c48a547522a56dc085b23955c7a2dfbb79865367ebfa3ac8f0a", - "signature": "78f55430f6416c48a547522a56dc085b23955c7a2dfbb79865367ebfa3ac8f0a", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/commandpalette.d.ts": { - "version": "b69b18f9708e8a2c5eea2898b2800a0e97085f1e5ce5a895dec59cab01040bb7", - "signature": "b69b18f9708e8a2c5eea2898b2800a0e97085f1e5ce5a895dec59cab01040bb7", - "affectsGlobalScope": false - }, - "./node_modules/@types/react/global.d.ts": { - "version": "bbdf156fea2fabed31a569445835aeedcc33643d404fcbaa54541f06c109df3f", - "signature": "bbdf156fea2fabed31a569445835aeedcc33643d404fcbaa54541f06c109df3f", - "affectsGlobalScope": true - }, - "./node_modules/csstype/index.d.ts": { - "version": "ea0aa24a32c073b8639aa1f3130ba0add0f0f2f76b314d9ba988a5cb91d7e3c4", - "signature": "ea0aa24a32c073b8639aa1f3130ba0add0f0f2f76b314d9ba988a5cb91d7e3c4", - "affectsGlobalScope": false - }, - "./node_modules/@types/prop-types/index.d.ts": { - "version": "6a386ff939f180ae8ef064699d8b7b6e62bc2731a62d7fbf5e02589383838dea", - "signature": "6a386ff939f180ae8ef064699d8b7b6e62bc2731a62d7fbf5e02589383838dea", - "affectsGlobalScope": false - }, - "./node_modules/@types/scheduler/tracing.d.ts": { - "version": "f5a8b384f182b3851cec3596ccc96cb7464f8d3469f48c74bf2befb782a19de5", - "signature": "f5a8b384f182b3851cec3596ccc96cb7464f8d3469f48c74bf2befb782a19de5", - "affectsGlobalScope": false - }, - "./node_modules/@types/react/index.d.ts": { - "version": "4a8cf8af8945e476bbb1717783cf1fbb308161afc27bd1252112df93779c697a", - "signature": "4a8cf8af8945e476bbb1717783cf1fbb308161afc27bd1252112df93779c697a", - "affectsGlobalScope": true - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/interfaces.d.ts": { - "version": "9bfdb958a6b460d0c0c0f2781dece557cd20698820f0d4e644690dc23bc05cd9", - "signature": "9bfdb958a6b460d0c0c0f2781dece557cd20698820f0d4e644690dc23bc05cd9", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/dataconnector.d.ts": { - "version": "bd969829f3805c917933ef812d4cabe2c045aff801859f2c5166eb8d56aea4eb", - "signature": "bd969829f3805c917933ef812d4cabe2c045aff801859f2c5166eb8d56aea4eb", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/restorablepool.d.ts": { - "version": "4c21323d9575649908d578c403dac9a3f240e839c5e0f3a7422d6bdea0d596f8", - "signature": "4c21323d9575649908d578c403dac9a3f240e839c5e0f3a7422d6bdea0d596f8", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/tokens.d.ts": { - "version": "d3ee87ecc46e36a9b361b0ad770cde8a06f5b973b7fea6d5aa7cb2b7cc56315c", - "signature": "d3ee87ecc46e36a9b361b0ad770cde8a06f5b973b7fea6d5aa7cb2b7cc56315c", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/statedb.d.ts": { - "version": "f8c57de65d7a1c151041621bf9ed1cc3da20ffb5bd004182e4e04dbbaa21e41e", - "signature": "f8c57de65d7a1c151041621bf9ed1cc3da20ffb5bd004182e4e04dbbaa21e41e", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/index.d.ts": { - "version": "cc935329b723e345e8118454fde946f73b69f40086589d11f25513137075720a", - "signature": "cc935329b723e345e8118454fde946f73b69f40086589d11f25513137075720a", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/widgettracker.d.ts": { - "version": "47373ee1335c841b028086f19214476c62380d6db1061331b365fb03a77131c6", - "signature": "47373ee1335c841b028086f19214476c62380d6db1061331b365fb03a77131c6", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/dialog.d.ts": { - "version": "598e1b8b0ad2029f52c4379913757ba91f0c88846fe9b43f4965c195cb810ffa", - "signature": "598e1b8b0ad2029f52c4379913757ba91f0c88846fe9b43f4965c195cb810ffa", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/domutils.d.ts": { - "version": "b8a6b60217ac1eb177c22d3e78878387fb9b4326d9c42d48e7db569f397609c6", - "signature": "b8a6b60217ac1eb177c22d3e78878387fb9b4326d9c42d48e7db569f397609c6", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/hoverbox.d.ts": { - "version": "75e0cecefeee361f433032bcb0653dd09639cfaf11e0aff27c1c0add842d63bc", - "signature": "75e0cecefeee361f433032bcb0653dd09639cfaf11e0aff27c1c0add842d63bc", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/iframe.d.ts": { - "version": "e590fee01c5af4203c63b179c12531dbaf17f9027ed1bc9e58ccadf1999ac495", - "signature": "e590fee01c5af4203c63b179c12531dbaf17f9027ed1bc9e58ccadf1999ac495", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/inputdialog.d.ts": { - "version": "ce3504946dfdd742270be199cc1cdbb6bc3e2f5c1d321aab6c3f015dfa9ad7cd", - "signature": "ce3504946dfdd742270be199cc1cdbb6bc3e2f5c1d321aab6c3f015dfa9ad7cd", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/config/index.d.ts": { - "version": "41bd5decb99be607b760e0fcec9bccb318b0db4e32fa4771d07fdeffca120552", - "signature": "41bd5decb99be607b760e0fcec9bccb318b0db4e32fa4771d07fdeffca120552", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablemap.d.ts": { - "version": "f4b2304c8d9dd3ddb3d614dd8bc4c26f5fdb1dc9e4a0ab0a2df2fdc4d5d859e4", - "signature": "f4b2304c8d9dd3ddb3d614dd8bc4c26f5fdb1dc9e4a0ab0a2df2fdc4d5d859e4", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablejson.d.ts": { - "version": "e330139099ebcf6830ae396ff59e59e09ae0f6b56ebdc9205609e66843d7e3ef", - "signature": "e330139099ebcf6830ae396ff59e59e09ae0f6b56ebdc9205609e66843d7e3ef", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablestring.d.ts": { - "version": "f3c6769aeebc6890c190aa33831461a7d7d0d59ae1474555594dc480af6a4a5b", - "signature": "f3c6769aeebc6890c190aa33831461a7d7d0d59ae1474555594dc480af6a4a5b", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablelist.d.ts": { - "version": "04112734ad3a86529f9c78ba774e2999caafdf446c0d987304ac4eb65807902a", - "signature": "04112734ad3a86529f9c78ba774e2999caafdf446c0d987304ac4eb65807902a", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/undoablelist.d.ts": { - "version": "17b1e1fc5d431f6380ab9ae528d4c3fa648bcfbe5cd49e9061c7779fc3095f7f", - "signature": "17b1e1fc5d431f6380ab9ae528d4c3fa648bcfbe5cd49e9061c7779fc3095f7f", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/modeldb.d.ts": { - "version": "14b8b314fea37db11061f1dc67aa9877a925e2fbf8c11213d547cdb8cf164ed1", - "signature": "14b8b314fea37db11061f1dc67aa9877a925e2fbf8c11213d547cdb8cf164ed1", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts": { - "version": "ce0d82d3a839e026518bee8d357cce5ec6396010314ebd7176bf3486e6eb0730", - "signature": "ce0d82d3a839e026518bee8d357cce5ec6396010314ebd7176bf3486e6eb0730", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/contents/index.d.ts": { - "version": "fdd25846f3054fa2d14f909a4d0b859f69639dee1be9b845f886c5b03eaa4dbf", - "signature": "fdd25846f3054fa2d14f909a4d0b859f69639dee1be9b845f886c5b03eaa4dbf", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts": { - "version": "2ffb6539ee354e561c489603b226ad7f484aa1e8920eda91d3d0d1e46f7d3872", - "signature": "2ffb6539ee354e561c489603b226ad7f484aa1e8920eda91d3d0d1e46f7d3872", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/messages.d.ts": { - "version": "9509676d5f597f0fae0bd56b2cc7699e48e07ecdcb9dd9a5a4131269403aca3f", - "signature": "9509676d5f597f0fae0bd56b2cc7699e48e07ecdcb9dd9a5a4131269403aca3f", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts": { - "version": "090c14cd80bfa4ee3709139dafa5df319eda501736d465a41c822346f564331b", - "signature": "090c14cd80bfa4ee3709139dafa5df319eda501736d465a41c822346f564331b", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/basemanager.d.ts": { - "version": "ed186aff8f5899e1c5bc14ccff9c892a6e701d6aee339e38e10ae76d8d0f60fe", - "signature": "ed186aff8f5899e1c5bc14ccff9c892a6e701d6aee339e38e10ae76d8d0f60fe", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/restapi.d.ts": { - "version": "1e516b8aace99b3cfd896b1d52f51c8d7186fb721718007f2fd632d65caaa204", - "signature": "1e516b8aace99b3cfd896b1d52f51c8d7186fb721718007f2fd632d65caaa204", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/kernelspec.d.ts": { - "version": "e655ecf9defa4207f36029831d09487233b7cb3d0af1f22cdd39bbbcc89ed242", - "signature": "e655ecf9defa4207f36029831d09487233b7cb3d0af1f22cdd39bbbcc89ed242", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/polling/types/poll.d.ts": { - "version": "ce473f99dd39a6d3df6ccd27fa99482e4195d7c64c06d75d58eec9a272a421fe", - "signature": "ce473f99dd39a6d3df6ccd27fa99482e4195d7c64c06d75d58eec9a272a421fe", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/polling/types/ratelimiter.d.ts": { - "version": "71bf7f6fab1f1eee43ee6ac8007376b183404c876bc71bce3c6f28181da74ebf", - "signature": "71bf7f6fab1f1eee43ee6ac8007376b183404c876bc71bce3c6f28181da74ebf", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/polling/types/index.d.ts": { - "version": "86914f3fa143d10a02cb12b8350f7ed00f00261ea4f0a08864c24afa91d54563", - "signature": "86914f3fa143d10a02cb12b8350f7ed00f00261ea4f0a08864c24afa91d54563", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/manager.d.ts": { - "version": "5af5d2530e681dfea1ca7271eee7ede8d55eb4f0f8ae12cc7f02a87b50191b1d", - "signature": "5af5d2530e681dfea1ca7271eee7ede8d55eb4f0f8ae12cc7f02a87b50191b1d", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/index.d.ts": { - "version": "ee46549bb25b958e351bbfeb37b4a0fb42091b5d9e95233a25000a8abeedb688", - "signature": "ee46549bb25b958e351bbfeb37b4a0fb42091b5d9e95233a25000a8abeedb688", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/restapi.d.ts": { - "version": "97f86af95be712eff0916d4c2f579c1806b1f5725f380a6246e5903029d5a547", - "signature": "97f86af95be712eff0916d4c2f579c1806b1f5725f380a6246e5903029d5a547", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/kernel.d.ts": { - "version": "43110607422e1808f8df38b1763e3dd5b50956b9b476d198b17c83f5c9e3dc85", - "signature": "43110607422e1808f8df38b1763e3dd5b50956b9b476d198b17c83f5c9e3dc85", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/default.d.ts": { - "version": "b9d1caa53cd05516b6e6e043b863e572ec08f19beb04034981b5c40cdc3ea6e9", - "signature": "b9d1caa53cd05516b6e6e043b863e572ec08f19beb04034981b5c40cdc3ea6e9", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/manager.d.ts": { - "version": "64355cb023413b9f710306b65a083d3d70226c8f28e32bf866492a2c843ac641", - "signature": "64355cb023413b9f710306b65a083d3d70226c8f28e32bf866492a2c843ac641", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/index.d.ts": { - "version": "3094865bcd68e704ca0862d9ad1b6aa98b7ba23ac6e2f1667aabdfa520ab035a", - "signature": "3094865bcd68e704ca0862d9ad1b6aa98b7ba23ac6e2f1667aabdfa520ab035a", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/builder/index.d.ts": { - "version": "7c4ca33d63aba0dd458b26f777d76ec26467537eaa7f86c6676bef45e2deb36e", - "signature": "7c4ca33d63aba0dd458b26f777d76ec26467537eaa7f86c6676bef45e2deb36e", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/nbconvert/index.d.ts": { - "version": "e3d73207d0e9c210e4a9d133a929c474f870e9d23ff0075c7d2512a107e50a5e", - "signature": "e3d73207d0e9c210e4a9d133a929c474f870e9d23ff0075c7d2512a107e50a5e", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/activitymonitor.d.ts": { - "version": "b5575443873e492a09e84e53f65c37a24f5d291a306036f74fd34646ee9c14dd", - "signature": "b5575443873e492a09e84e53f65c37a24f5d291a306036f74fd34646ee9c14dd", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/interfaces.d.ts": { - "version": "e4591a005f34ccbbbec0bd140702e243387d57a21b1d4bb6bd3e76de152fc89f", - "signature": "e4591a005f34ccbbbec0bd140702e243387d57a21b1d4bb6bd3e76de152fc89f", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/markdowncodeblocks.d.ts": { - "version": "377fa33e5213ba934d4350d674296c1387aa2ebd225e2a296a465bb691915884", - "signature": "377fa33e5213ba934d4350d674296c1387aa2ebd225e2a296a465bb691915884", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/pageconfig.d.ts": { - "version": "8285079f41ab72940a3889e2fabd26c4fe9662783d3ce008213ee68c1f5bca06", - "signature": "8285079f41ab72940a3889e2fabd26c4fe9662783d3ce008213ee68c1f5bca06", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/path.d.ts": { - "version": "6baff3e4e3aca45d2879a6b26369316430f8756d85319898c64c69019036ab61", - "signature": "6baff3e4e3aca45d2879a6b26369316430f8756d85319898c64c69019036ab61", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/text.d.ts": { - "version": "7efd9303320cf186211b14e1723172a2bc15378c0d95e49990f31be5d2f271d4", - "signature": "7efd9303320cf186211b14e1723172a2bc15378c0d95e49990f31be5d2f271d4", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/time.d.ts": { - "version": "315dfd130e525ffa1934e769dc2266bafb35d021951a7845eb145089501ed86d", - "signature": "315dfd130e525ffa1934e769dc2266bafb35d021951a7845eb145089501ed86d", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/url.d.ts": { - "version": "99dda0cb4742feb2ea1339c6227119d47df6bc4ba8c886341c1fc879dfccb1d2", - "signature": "99dda0cb4742feb2ea1339c6227119d47df6bc4ba8c886341c1fc879dfccb1d2", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts": { - "version": "7a7fa32e403e381e681ef4984c9dc22adf0d32c1e4b7ad9fd5c6552412c855f0", - "signature": "7a7fa32e403e381e681ef4984c9dc22adf0d32c1e4b7ad9fd5c6552412c855f0", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/session.d.ts": { - "version": "f717135d66f061e058f704e91a8d8d72a61ea2fdeecc9265689452a81c494bdf", - "signature": "f717135d66f061e058f704e91a8d8d72a61ea2fdeecc9265689452a81c494bdf", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/restapi.d.ts": { - "version": "1e376fe94028a3e12ca8c3d2db097bb6f1c9de17a72f6e854e1d512bb1734adf", - "signature": "1e376fe94028a3e12ca8c3d2db097bb6f1c9de17a72f6e854e1d512bb1734adf", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/manager.d.ts": { - "version": "30e5c9e5ecd787438ad41ca8a487a77d6d571122c4eca365b24074eb2163964c", - "signature": "30e5c9e5ecd787438ad41ca8a487a77d6d571122c4eca365b24074eb2163964c", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/index.d.ts": { - "version": "0214c4398c638c72f77a78bc20c16fb8fab08d9cfe2bdfcd67f0baeafcc5b02b", - "signature": "0214c4398c638c72f77a78bc20c16fb8fab08d9cfe2bdfcd67f0baeafcc5b02b", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/tokens.d.ts": { - "version": "e2a66577639a534585d79c8b241253e08b506f8aaadd746d935f03addc769b9e", - "signature": "e2a66577639a534585d79c8b241253e08b506f8aaadd746d935f03addc769b9e", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/settingregistry.d.ts": { - "version": "8607bba0dc7671dff1d745b785601e7aeadbd338d93f6e70f0abaabcbadc4f2d", - "signature": "8607bba0dc7671dff1d745b785601e7aeadbd338d93f6e70f0abaabcbadc4f2d", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/index.d.ts": { - "version": "178c7c98157f7910ea4e19771e26374ecfd552df7c35b1cda6cd9dcc03b32016", - "signature": "178c7c98157f7910ea4e19771e26374ecfd552df7c35b1cda6cd9dcc03b32016", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/setting/index.d.ts": { - "version": "3f60325f8360846557509a160b9211c90419c4325581b04d3bd6fbe8a0972f9e", - "signature": "3f60325f8360846557509a160b9211c90419c4325581b04d3bd6fbe8a0972f9e", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/restapi.d.ts": { - "version": "d5c7e6c16fe96673f6f1010d31c54beedc77f31542736c28f1fe87570f730d46", - "signature": "d5c7e6c16fe96673f6f1010d31c54beedc77f31542736c28f1fe87570f730d46", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/terminal.d.ts": { - "version": "00cec9a23ceedb1421bca6cc4b0c489d7d6fd98ee2e80c3d751cf4d9485aad65", - "signature": "00cec9a23ceedb1421bca6cc4b0c489d7d6fd98ee2e80c3d751cf4d9485aad65", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/manager.d.ts": { - "version": "2a6001828f9a4616c48a3cb019fe8cff22918990d67d11de4af7152417ee1623", - "signature": "2a6001828f9a4616c48a3cb019fe8cff22918990d67d11de4af7152417ee1623", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/index.d.ts": { - "version": "77a4cfb8baa8f9861178b8ff4de8409841b387cd73ea4e51e2beee758c2d818a", - "signature": "77a4cfb8baa8f9861178b8ff4de8409841b387cd73ea4e51e2beee758c2d818a", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/workspace/index.d.ts": { - "version": "11bb21614c3c792941e289fdc340489be2881f51198217894d510dde943544fa", - "signature": "11bb21614c3c792941e289fdc340489be2881f51198217894d510dde943544fa", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/manager.d.ts": { - "version": "fdbe60857d35ec916e210e581890f5387e885d0e73e8c6fb62052bad05362bb8", - "signature": "fdbe60857d35ec916e210e581890f5387e885d0e73e8c6fb62052bad05362bb8", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts": { - "version": "3a8bab6cc1bee98448c5869f0ae38ab59a0651b533fdd9118ff23e02bc27ac4c", - "signature": "3a8bab6cc1bee98448c5869f0ae38ab59a0651b533fdd9118ff23e02bc27ac4c", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/tokens.d.ts": { - "version": "c97410aab3860667c54e48ab4f751222911f8887202df5c11b61868009d4ff14", - "signature": "c97410aab3860667c54e48ab4f751222911f8887202df5c11b61868009d4ff14", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/base.d.ts": { - "version": "7e80cbd62318016cfedfd4ccb53f930b4abe7f4b6bc4673fd8ec44f9de6243e2", - "signature": "7e80cbd62318016cfedfd4ccb53f930b4abe7f4b6bc4673fd8ec44f9de6243e2", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/gettext.d.ts": { - "version": "ba9e2a7e215602ba81103f3f2c7cdb3457e48e1b8fb96dae3af9873e12821f40", - "signature": "ba9e2a7e215602ba81103f3f2c7cdb3457e48e1b8fb96dae3af9873e12821f40", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/manager.d.ts": { - "version": "e527ab52c64b2db062a12f22ec2050608b99b8b08cc5397fd869ae66bc441fdc", - "signature": "e527ab52c64b2db062a12f22ec2050608b99b8b08cc5397fd869ae66bc441fdc", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/server.d.ts": { - "version": "e2bfb86488150c78cea78c2b726a3bd81c9a2053a5d56916beed898d4dc7f5b5", - "signature": "e2bfb86488150c78cea78c2b726a3bd81c9a2053a5d56916beed898d4dc7f5b5", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts": { - "version": "c2d417bfcfb62ed2101db6175ea83f91b2656ada1397d4abaf8c7681c42fb534", - "signature": "c2d417bfcfb62ed2101db6175ea83f91b2656ada1397d4abaf8c7681c42fb534", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/printing.d.ts": { - "version": "3c94850686707d1d046e05ea6178e3fc7cd115ba1eb159d1c59e93594e54131f", - "signature": "3c94850686707d1d046e05ea6178e3fc7cd115ba1eb159d1c59e93594e54131f", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sessioncontext.d.ts": { - "version": "7feee510023df8fb51c1797d70e92babc39948965cbf14062a373c32484aab8b", - "signature": "7feee510023df8fb51c1797d70e92babc39948965cbf14062a373c32484aab8b", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/tokens.d.ts": { - "version": "45bf317467aecd8111bf35093dcf4b2daa6ee110ab5e5dc2cf558a26419beb33", - "signature": "45bf317467aecd8111bf35093dcf4b2daa6ee110ab5e5dc2cf558a26419beb33", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/refs.d.ts": { - "version": "459a61b7dfec3982abca4e3f22e2fdb064053793fbc9a74240f03207a863c1db", - "signature": "459a61b7dfec3982abca4e3f22e2fdb064053793fbc9a74240f03207a863c1db", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractComponent.d.ts": { - "version": "d1dbebf193f3122f34a883ec910beb7c5e6d2921a56cc3065c33c91ff27a01d5", - "signature": "d1dbebf193f3122f34a883ec910beb7c5e6d2921a56cc3065c33c91ff27a01d5", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractComponent2.d.ts": { - "version": "4e81cedd4aca5f757c315cbf9a4ac69acfa79d178af0f60511f6cca9f55f82a2", - "signature": "4e81cedd4aca5f757c315cbf9a4ac69acfa79d178af0f60511f6cca9f55f82a2", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractPureComponent.d.ts": { - "version": "93bb365a11749a610355844b9cec34b2b2390581fa49619cec047610b0e92432", - "signature": "93bb365a11749a610355844b9cec34b2b2390581fa49619cec047610b0e92432", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractPureComponent2.d.ts": { - "version": "f2c9ddb2fe02d13686be12dc202659ff0de37837859bbc40c004c0296b424bfa", - "signature": "f2c9ddb2fe02d13686be12dc202659ff0de37837859bbc40c004c0296b424bfa", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/alignment.d.ts": { - "version": "bd2ab07f4d3e1f9f541383e8ef2c61658344348181d3020f6c663ee042375c88", - "signature": "bd2ab07f4d3e1f9f541383e8ef2c61658344348181d3020f6c663ee042375c88", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/boundary.d.ts": { - "version": "f1e1e68cbe048ee1112f2929c7d68d53d4ad86dacd6e45bafaa5c5801047b7c6", - "signature": "f1e1e68cbe048ee1112f2929c7d68d53d4ad86dacd6e45bafaa5c5801047b7c6", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/colors.d.ts": { - "version": "0ccaffe1ea5cef0ecb9cc897082b76cafcebe63dee99678ee373d4d037361822", - "signature": "0ccaffe1ea5cef0ecb9cc897082b76cafcebe63dee99678ee373d4d037361822", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/constructor.d.ts": { - "version": "2fd06d4c195333c49771d66853322b928a15b3900677e2bf46e12f2d7da4540f", - "signature": "2fd06d4c195333c49771d66853322b928a15b3900677e2bf46e12f2d7da4540f", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/elevation.d.ts": { - "version": "5873abbf948918e64a1d648d7b60cdfd2eb9e9902d6d1c580876218824ff689b", - "signature": "5873abbf948918e64a1d648d7b60cdfd2eb9e9902d6d1c580876218824ff689b", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/intent.d.ts": { - "version": "843fbd11bfa2082344b49c439a938f6f0cb3a185eb68acfde43f672b093b8558", - "signature": "843fbd11bfa2082344b49c439a938f6f0cb3a185eb68acfde43f672b093b8558", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/position.d.ts": { - "version": "e1cbde3f55a1d15093334577484cfd3f3f0ace8edb928ff4d0526663ca23ce62", - "signature": "e1cbde3f55a1d15093334577484cfd3f3f0ace8edb928ff4d0526663ca23ce62", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/icons/lib/esm/generated/iconContents.d.ts": { - "version": "1cfa9fdb2b2bcb3e204dfb2da4cbb1035725124ef2472018e9153bc945f9d60e", - "signature": "1cfa9fdb2b2bcb3e204dfb2da4cbb1035725124ef2472018e9153bc945f9d60e", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/icons/lib/esm/generated/iconNames.d.ts": { - "version": "9da38b661062966f1dafc78d034614af5181a92e1b9dba51cb2ad2320e300154", - "signature": "9da38b661062966f1dafc78d034614af5181a92e1b9dba51cb2ad2320e300154", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/icons/lib/esm/iconName.d.ts": { - "version": "f83b02a0e5d2ea81b9a14362a1cadafd534392bacdf731e461afc330c476980d", - "signature": "f83b02a0e5d2ea81b9a14362a1cadafd534392bacdf731e461afc330c476980d", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/icons/lib/esm/generated/iconSvgPaths.d.ts": { - "version": "f634926161579868440ca5372c890f0e20200b1323af31802a7075c4efdabe04", - "signature": "f634926161579868440ca5372c890f0e20200b1323af31802a7075c4efdabe04", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/icons/lib/esm/index.d.ts": { - "version": "9954e278f4c8a55b3c70710fc601addf02cf0a3eeccfb1b569917f10e3899a20", - "signature": "9954e278f4c8a55b3c70710fc601addf02cf0a3eeccfb1b569917f10e3899a20", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/props.d.ts": { - "version": "27953c75d82f1fd701c2e3f76c927199c264350d304ca1b6701099d6d4c6ec51", - "signature": "27953c75d82f1fd701c2e3f76c927199c264350d304ca1b6701099d6d4c6ec51", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/classes.d.ts": { - "version": "d7ac703836066d80c98305474443d2b5ce456bf1667e76a89659735e040b686b", - "signature": "d7ac703836066d80c98305474443d2b5ce456bf1667e76a89659735e040b686b", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/keys.d.ts": { - "version": "75eaa6171bc3ce74f87a9fea83c35e5d2bfda3518eec74466cf3551fadded8fe", - "signature": "75eaa6171bc3ce74f87a9fea83c35e5d2bfda3518eec74466cf3551fadded8fe", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/compareUtils.d.ts": { - "version": "46b6fd7de6d4297b7c8c24209672f1e87db5119a4e73ec08bc6426662cb6fd21", - "signature": "46b6fd7de6d4297b7c8c24209672f1e87db5119a4e73ec08bc6426662cb6fd21", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/domUtils.d.ts": { - "version": "5fe0701f446d17874b6ab8c141985faf0fe9c898cea9a84b009a30911cc86bee", - "signature": "5fe0701f446d17874b6ab8c141985faf0fe9c898cea9a84b009a30911cc86bee", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/functionUtils.d.ts": { - "version": "8802ee7636d5e15d7f732f8dd5d52e972f7c139c279f15f0b2768a1af183e1fc", - "signature": "8802ee7636d5e15d7f732f8dd5d52e972f7c139c279f15f0b2768a1af183e1fc", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/jsUtils.d.ts": { - "version": "9a54ced1026d946236b15d77a2f106d479087928c0d458f43917c26db39c96f7", - "signature": "9a54ced1026d946236b15d77a2f106d479087928c0d458f43917c26db39c96f7", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/reactUtils.d.ts": { - "version": "4dd37743fe7eb33ee2d65854b63d2e99999e2f8398c427ef6bff99ee1f94a4a7", - "signature": "4dd37743fe7eb33ee2d65854b63d2e99999e2f8398c427ef6bff99ee1f94a4a7", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/safeInvokeMember.d.ts": { - "version": "76a73ecc334a853411ba43d5e977bc56811b90448dafb383b4062acdd716c310", - "signature": "76a73ecc334a853411ba43d5e977bc56811b90448dafb383b4062acdd716c310", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/configureDom4.d.ts": { - "version": "8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881", - "signature": "8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/isDarkTheme.d.ts": { - "version": "525d24d74fbf1b3d4427e8e56db49667d67c15ec1685dd20d88cc5ee106a031d", - "signature": "525d24d74fbf1b3d4427e8e56db49667d67c15ec1685dd20d88cc5ee106a031d", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/index.d.ts": { - "version": "10ae57df94ab0cc4e92643ff0052454ec0a15b3956e4ba8b9d7a3e6e1497c747", - "signature": "10ae57df94ab0cc4e92643ff0052454ec0a15b3956e4ba8b9d7a3e6e1497c747", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/common/index.d.ts": { - "version": "f916f9303709d609e852bd97e8cc6586d3dab103ea4e605a4d63598e37b87190", - "signature": "f916f9303709d609e852bd97e8cc6586d3dab103ea4e605a4d63598e37b87190", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/components/icon/icon.d.ts": { - "version": "215a85b4d33bcc3d955c9a7dfe84368e97ce828aa095b07a1c39b9b136055f29", - "signature": "215a85b4d33bcc3d955c9a7dfe84368e97ce828aa095b07a1c39b9b136055f29", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/components/button/abstractButton.d.ts": { - "version": "a7de820c873e4f0db59303940aaa7f6f06a1a46d3f89eaada44d76c871876fb6", - "signature": "a7de820c873e4f0db59303940aaa7f6f06a1a46d3f89eaada44d76c871876fb6", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/components/button/buttons.d.ts": { - "version": "aed5c2f80124fcda53b6fe13b187fbf45979c931504b534601c8ea3ce9b2adba", - "signature": "aed5c2f80124fcda53b6fe13b187fbf45979c931504b534601c8ea3ce9b2adba", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/components/collapse/collapse.d.ts": { - "version": "8822d39d94eec0ce799e13cf2412680fd3238fb0059f05c6bf5f077f8ba9df72", - "signature": "8822d39d94eec0ce799e13cf2412680fd3238fb0059f05c6bf5f077f8ba9df72", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/components/forms/controls.d.ts": { - "version": "521ee48f7b1eef1cd4bcfee470204c69b35a08f6e9ddffd8bbb77957c13c83b1", - "signature": "521ee48f7b1eef1cd4bcfee470204c69b35a08f6e9ddffd8bbb77957c13c83b1", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/cjs/components/forms/inputGroup.d.ts": { - "version": "d50d9194e32d5435de6ea7d7732f7ad87317857e07e75efb114d9af8d7c10564", - "signature": "d50d9194e32d5435de6ea7d7732f7ad87317857e07e75efb114d9af8d7c10564", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/accessibility/focusStyleManager.d.ts": { - "version": "45764e880cd0158b4a1692c38670441b7d60ddfe6f8835641ca9bfceb5f78b9e", - "signature": "45764e880cd0158b4a1692c38670441b7d60ddfe6f8835641ca9bfceb5f78b9e", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/accessibility/index.d.ts": { - "version": "30b5e83c2c380e084df3b84fcf910e70f43abfe11448875356cd38e7a3bbf7cd", - "signature": "30b5e83c2c380e084df3b84fcf910e70f43abfe11448875356cd38e7a3bbf7cd", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/abstractComponent.d.ts": { - "version": "d1dbebf193f3122f34a883ec910beb7c5e6d2921a56cc3065c33c91ff27a01d5", - "signature": "d1dbebf193f3122f34a883ec910beb7c5e6d2921a56cc3065c33c91ff27a01d5", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/abstractComponent2.d.ts": { - "version": "4e81cedd4aca5f757c315cbf9a4ac69acfa79d178af0f60511f6cca9f55f82a2", - "signature": "4e81cedd4aca5f757c315cbf9a4ac69acfa79d178af0f60511f6cca9f55f82a2", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/abstractPureComponent.d.ts": { - "version": "93bb365a11749a610355844b9cec34b2b2390581fa49619cec047610b0e92432", - "signature": "93bb365a11749a610355844b9cec34b2b2390581fa49619cec047610b0e92432", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/abstractPureComponent2.d.ts": { - "version": "f2c9ddb2fe02d13686be12dc202659ff0de37837859bbc40c004c0296b424bfa", - "signature": "f2c9ddb2fe02d13686be12dc202659ff0de37837859bbc40c004c0296b424bfa", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/alignment.d.ts": { - "version": "bd2ab07f4d3e1f9f541383e8ef2c61658344348181d3020f6c663ee042375c88", - "signature": "bd2ab07f4d3e1f9f541383e8ef2c61658344348181d3020f6c663ee042375c88", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/boundary.d.ts": { - "version": "f1e1e68cbe048ee1112f2929c7d68d53d4ad86dacd6e45bafaa5c5801047b7c6", - "signature": "f1e1e68cbe048ee1112f2929c7d68d53d4ad86dacd6e45bafaa5c5801047b7c6", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/colors.d.ts": { - "version": "0ccaffe1ea5cef0ecb9cc897082b76cafcebe63dee99678ee373d4d037361822", - "signature": "0ccaffe1ea5cef0ecb9cc897082b76cafcebe63dee99678ee373d4d037361822", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/constructor.d.ts": { - "version": "2fd06d4c195333c49771d66853322b928a15b3900677e2bf46e12f2d7da4540f", - "signature": "2fd06d4c195333c49771d66853322b928a15b3900677e2bf46e12f2d7da4540f", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/elevation.d.ts": { - "version": "5873abbf948918e64a1d648d7b60cdfd2eb9e9902d6d1c580876218824ff689b", - "signature": "5873abbf948918e64a1d648d7b60cdfd2eb9e9902d6d1c580876218824ff689b", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/intent.d.ts": { - "version": "843fbd11bfa2082344b49c439a938f6f0cb3a185eb68acfde43f672b093b8558", - "signature": "843fbd11bfa2082344b49c439a938f6f0cb3a185eb68acfde43f672b093b8558", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/position.d.ts": { - "version": "e1cbde3f55a1d15093334577484cfd3f3f0ace8edb928ff4d0526663ca23ce62", - "signature": "e1cbde3f55a1d15093334577484cfd3f3f0ace8edb928ff4d0526663ca23ce62", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/refs.d.ts": { - "version": "459a61b7dfec3982abca4e3f22e2fdb064053793fbc9a74240f03207a863c1db", - "signature": "459a61b7dfec3982abca4e3f22e2fdb064053793fbc9a74240f03207a863c1db", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts": { - "version": "27953c75d82f1fd701c2e3f76c927199c264350d304ca1b6701099d6d4c6ec51", - "signature": "27953c75d82f1fd701c2e3f76c927199c264350d304ca1b6701099d6d4c6ec51", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/classes.d.ts": { - "version": "d7ac703836066d80c98305474443d2b5ce456bf1667e76a89659735e040b686b", - "signature": "d7ac703836066d80c98305474443d2b5ce456bf1667e76a89659735e040b686b", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/keys.d.ts": { - "version": "75eaa6171bc3ce74f87a9fea83c35e5d2bfda3518eec74466cf3551fadded8fe", - "signature": "75eaa6171bc3ce74f87a9fea83c35e5d2bfda3518eec74466cf3551fadded8fe", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/utils/compareUtils.d.ts": { - "version": "46b6fd7de6d4297b7c8c24209672f1e87db5119a4e73ec08bc6426662cb6fd21", - "signature": "46b6fd7de6d4297b7c8c24209672f1e87db5119a4e73ec08bc6426662cb6fd21", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/utils/domUtils.d.ts": { - "version": "5fe0701f446d17874b6ab8c141985faf0fe9c898cea9a84b009a30911cc86bee", - "signature": "5fe0701f446d17874b6ab8c141985faf0fe9c898cea9a84b009a30911cc86bee", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/utils/functionUtils.d.ts": { - "version": "8802ee7636d5e15d7f732f8dd5d52e972f7c139c279f15f0b2768a1af183e1fc", - "signature": "8802ee7636d5e15d7f732f8dd5d52e972f7c139c279f15f0b2768a1af183e1fc", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/utils/jsUtils.d.ts": { - "version": "9a54ced1026d946236b15d77a2f106d479087928c0d458f43917c26db39c96f7", - "signature": "9a54ced1026d946236b15d77a2f106d479087928c0d458f43917c26db39c96f7", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/utils/reactUtils.d.ts": { - "version": "4dd37743fe7eb33ee2d65854b63d2e99999e2f8398c427ef6bff99ee1f94a4a7", - "signature": "4dd37743fe7eb33ee2d65854b63d2e99999e2f8398c427ef6bff99ee1f94a4a7", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/utils/safeInvokeMember.d.ts": { - "version": "76a73ecc334a853411ba43d5e977bc56811b90448dafb383b4062acdd716c310", - "signature": "76a73ecc334a853411ba43d5e977bc56811b90448dafb383b4062acdd716c310", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/configureDom4.d.ts": { - "version": "8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881", - "signature": "8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/utils/isDarkTheme.d.ts": { - "version": "525d24d74fbf1b3d4427e8e56db49667d67c15ec1685dd20d88cc5ee106a031d", - "signature": "525d24d74fbf1b3d4427e8e56db49667d67c15ec1685dd20d88cc5ee106a031d", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/utils/index.d.ts": { - "version": "10ae57df94ab0cc4e92643ff0052454ec0a15b3956e4ba8b9d7a3e6e1497c747", - "signature": "10ae57df94ab0cc4e92643ff0052454ec0a15b3956e4ba8b9d7a3e6e1497c747", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts": { - "version": "f916f9303709d609e852bd97e8cc6586d3dab103ea4e605a4d63598e37b87190", - "signature": "f916f9303709d609e852bd97e8cc6586d3dab103ea4e605a4d63598e37b87190", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/context-menu/contextMenu.d.ts": { - "version": "9e3c4f9cbf53096fcdc9c514a3e6a5e406cd35344a7d08322a3df65a1815aa57", - "signature": "9e3c4f9cbf53096fcdc9c514a3e6a5e406cd35344a7d08322a3df65a1815aa57", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts": { - "version": "215a85b4d33bcc3d955c9a7dfe84368e97ce828aa095b07a1c39b9b136055f29", - "signature": "215a85b4d33bcc3d955c9a7dfe84368e97ce828aa095b07a1c39b9b136055f29", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/overlay/overlay.d.ts": { - "version": "d1d1e915f9a60a342cdfc8f9b04fee667ede32734a60224dd138b2ac2d3ef260", - "signature": "d1d1e915f9a60a342cdfc8f9b04fee667ede32734a60224dd138b2ac2d3ef260", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/alert/alert.d.ts": { - "version": "2d22a95989e6d327a5a9b98ab4ebdc21b5a73b672c7851cfd74cb6c21cc092ae", - "signature": "2d22a95989e6d327a5a9b98ab4ebdc21b5a73b672c7851cfd74cb6c21cc092ae", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/breadcrumbs/breadcrumb.d.ts": { - "version": "af386b7b91367e8fffd15bbcb94408ef805dd4b602807210097baa330f2c5889", - "signature": "af386b7b91367e8fffd15bbcb94408ef805dd4b602807210097baa330f2c5889", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/overflow-list/overflowList.d.ts": { - "version": "9f74908d2668503fae8a6f3291d06c3e07f4d55645b3e2a4f7866425883d6f74", - "signature": "9f74908d2668503fae8a6f3291d06c3e07f4d55645b3e2a4f7866425883d6f74", - "affectsGlobalScope": false - }, - "./node_modules/popper.js/index.d.ts": { - "version": "1873db8f2261ba4f248bde3e5bb4c79b1fdc990315054e9604fce8f41ddd1587", - "signature": "1873db8f2261ba4f248bde3e5bb4c79b1fdc990315054e9604fce8f41ddd1587", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popoverSharedProps.d.ts": { - "version": "8d4e55cef443510f1cc7d45cb3f91d1690a9bb4cc679bbf70af32b4d81b1f15e", - "signature": "8d4e55cef443510f1cc7d45cb3f91d1690a9bb4cc679bbf70af32b4d81b1f15e", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popover.d.ts": { - "version": "a28380967f8329e99968d2c7343b31c0a806d750d89e5660a4d99be9a8f44f29", - "signature": "a28380967f8329e99968d2c7343b31c0a806d750d89e5660a4d99be9a8f44f29", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/breadcrumbs/breadcrumbs.d.ts": { - "version": "8f57b36dec78897043a9dd5731cfc4e0206db3fdef0a844accb476c6406724fc", - "signature": "8f57b36dec78897043a9dd5731cfc4e0206db3fdef0a844accb476c6406724fc", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/button/abstractButton.d.ts": { - "version": "a7de820c873e4f0db59303940aaa7f6f06a1a46d3f89eaada44d76c871876fb6", - "signature": "a7de820c873e4f0db59303940aaa7f6f06a1a46d3f89eaada44d76c871876fb6", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/button/buttons.d.ts": { - "version": "aed5c2f80124fcda53b6fe13b187fbf45979c931504b534601c8ea3ce9b2adba", - "signature": "aed5c2f80124fcda53b6fe13b187fbf45979c931504b534601c8ea3ce9b2adba", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/button/buttonGroup.d.ts": { - "version": "bd43f20dd3d39376f15aefe0799f33507c649febb34b3bc89541d5156441ddcf", - "signature": "bd43f20dd3d39376f15aefe0799f33507c649febb34b3bc89541d5156441ddcf", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/callout/callout.d.ts": { - "version": "c78c87f25e8d2fbe777c01ed9c78e6b607ab3e5d961726ff63debe8b3df18422", - "signature": "c78c87f25e8d2fbe777c01ed9c78e6b607ab3e5d961726ff63debe8b3df18422", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/card/card.d.ts": { - "version": "4324e831d373fc3424239ad7d67099ed67e0844338adbbdc643551a4930cd914", - "signature": "4324e831d373fc3424239ad7d67099ed67e0844338adbbdc643551a4930cd914", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/collapse/collapse.d.ts": { - "version": "8822d39d94eec0ce799e13cf2412680fd3238fb0059f05c6bf5f077f8ba9df72", - "signature": "8822d39d94eec0ce799e13cf2412680fd3238fb0059f05c6bf5f077f8ba9df72", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menuItem.d.ts": { - "version": "2f3a49c734d3793f3d8e4b22e23e8271eab41cb5847a5f749195eed9b5d4fade", - "signature": "2f3a49c734d3793f3d8e4b22e23e8271eab41cb5847a5f749195eed9b5d4fade", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/collapsible-list/collapsibleList.d.ts": { - "version": "b71ce4da778b6ce0da4b4131612bf57072a6269565241ff3ed26abfde9541326", - "signature": "b71ce4da778b6ce0da4b4131612bf57072a6269565241ff3ed26abfde9541326", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/context-menu/contextMenuTarget.d.ts": { - "version": "05edf98e806ebf88280ab4d7542746b7b387268bed2d007d69927b0706dfdf2f", - "signature": "05edf98e806ebf88280ab4d7542746b7b387268bed2d007d69927b0706dfdf2f", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/dialog.d.ts": { - "version": "03df23e7e132ea07a1d565900060ab6b7fe757180d0bde8157dee4c18eeda2b7", - "signature": "03df23e7e132ea07a1d565900060ab6b7fe757180d0bde8157dee4c18eeda2b7", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/dialogStep.d.ts": { - "version": "0de7a621167a5349efbeff691242a1e602e92500b5c0abd228b6185964aa9438", - "signature": "0de7a621167a5349efbeff691242a1e602e92500b5c0abd228b6185964aa9438", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/multistepDialog.d.ts": { - "version": "60f3d1d93659940320e971563be7e6d44f24c08c54253ba98381dde383dcb35f", - "signature": "60f3d1d93659940320e971563be7e6d44f24c08c54253ba98381dde383dcb35f", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/divider/divider.d.ts": { - "version": "51b884c9e4773111ed6ce9610aeedb9f905996d02d3906ba2faa6793a129645a", - "signature": "51b884c9e4773111ed6ce9610aeedb9f905996d02d3906ba2faa6793a129645a", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/drawer/drawer.d.ts": { - "version": "f62dec06b428af51d559914fbb558de1512783c506282fc6f9e3f6c3206cb13f", - "signature": "f62dec06b428af51d559914fbb558de1512783c506282fc6f9e3f6c3206cb13f", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/editable-text/editableText.d.ts": { - "version": "eb4218049599f0da9fddfb428bd145e6d21653ea892412d3891c71490fa974f7", - "signature": "eb4218049599f0da9fddfb428bd145e6d21653ea892412d3891c71490fa974f7", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/forms/controlGroup.d.ts": { - "version": "4eb8d00a4f7456eac56b3f7a79ec2c043871473864c0750415f0e22d081847fa", - "signature": "4eb8d00a4f7456eac56b3f7a79ec2c043871473864c0750415f0e22d081847fa", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/forms/controls.d.ts": { - "version": "521ee48f7b1eef1cd4bcfee470204c69b35a08f6e9ddffd8bbb77957c13c83b1", - "signature": "521ee48f7b1eef1cd4bcfee470204c69b35a08f6e9ddffd8bbb77957c13c83b1", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/forms/fileInput.d.ts": { - "version": "4db27144830067b8f22c4b4b21547914fedf033a213afd5e98096252e540d06d", - "signature": "4db27144830067b8f22c4b4b21547914fedf033a213afd5e98096252e540d06d", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/forms/formGroup.d.ts": { - "version": "f7000be7a6c345e37f609a75e67dbc3330debfd3b40a0bba8418192af0eadafe", - "signature": "f7000be7a6c345e37f609a75e67dbc3330debfd3b40a0bba8418192af0eadafe", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/forms/inputGroup.d.ts": { - "version": "d50d9194e32d5435de6ea7d7732f7ad87317857e07e75efb114d9af8d7c10564", - "signature": "d50d9194e32d5435de6ea7d7732f7ad87317857e07e75efb114d9af8d7c10564", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/forms/numericInput.d.ts": { - "version": "3386697553c7a881e343ad9a3558ec290bb816e266f5a85a94ed9022f8a7ef26", - "signature": "3386697553c7a881e343ad9a3558ec290bb816e266f5a85a94ed9022f8a7ef26", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/forms/radioGroup.d.ts": { - "version": "6efd1a9a45a5246703057855b064f0bd85ff5a87d52961d9186b5b7e06863b25", - "signature": "6efd1a9a45a5246703057855b064f0bd85ff5a87d52961d9186b5b7e06863b25", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/forms/textArea.d.ts": { - "version": "4511297bd0729fb6081a20d2b3bbe9ac38df82a8a88057bfb1682c0445a16174", - "signature": "4511297bd0729fb6081a20d2b3bbe9ac38df82a8a88057bfb1682c0445a16174", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/html/html.d.ts": { - "version": "3f39474d72edcd1979d78580b91d755d81386fe7222b831e16fb886ae2299831", - "signature": "3f39474d72edcd1979d78580b91d755d81386fe7222b831e16fb886ae2299831", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/html-select/htmlSelect.d.ts": { - "version": "fe728784b93c52b3ce66c34b69faf12a08dedc1e9550825a5acd929e60dd0ad5", - "signature": "fe728784b93c52b3ce66c34b69faf12a08dedc1e9550825a5acd929e60dd0ad5", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/html-table/htmlTable.d.ts": { - "version": "0e1d38ab457ec45dd77fcdb5d6735c82cabb1c2cb7ab2126a8f61bd5e8a677e7", - "signature": "0e1d38ab457ec45dd77fcdb5d6735c82cabb1c2cb7ab2126a8f61bd5e8a677e7", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTypes.d.ts": { - "version": "7db0240aa741e3b99b836d8af732886afeadf988501c5587d5eb20e4c2a14eeb", - "signature": "7db0240aa741e3b99b836d8af732886afeadf988501c5587d5eb20e4c2a14eeb", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeys.d.ts": { - "version": "3a1113fc275cae51ff74af07d8544170106117a5545a8381d05756bde52126be", - "signature": "3a1113fc275cae51ff74af07d8544170106117a5545a8381d05756bde52126be", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/hooks/hotkeys/hotkeyConfig.d.ts": { - "version": "179731ebd8bbe53575fda2f20bac66ce9c553e417debd60c795ebdf70dcbd127", - "signature": "179731ebd8bbe53575fda2f20bac66ce9c553e417debd60c795ebdf70dcbd127", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/hooks/hotkeys/useHotkeys.d.ts": { - "version": "2fd6358ad61ca689f3a41c75416ecfd142389973b7e34cc00974d911740fc04c", - "signature": "2fd6358ad61ca689f3a41c75416ecfd142389973b7e34cc00974d911740fc04c", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/hooks/index.d.ts": { - "version": "ab34e9437157528207b49e79861fd44f8bf788c6b09954cd02ef201a9041021a", - "signature": "ab34e9437157528207b49e79861fd44f8bf788c6b09954cd02ef201a9041021a", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkey.d.ts": { - "version": "6924d04ff7eb2dfbf7e9e29c7b163eafd905bdc3a8c365cf1198d4a499bdeeee", - "signature": "6924d04ff7eb2dfbf7e9e29c7b163eafd905bdc3a8c365cf1198d4a499bdeeee", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/keyCombo.d.ts": { - "version": "c7e0c0c995a814a3722bfe606947deb84fab8f66dab05b226226143edac37b41", - "signature": "c7e0c0c995a814a3722bfe606947deb84fab8f66dab05b226226143edac37b41", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeyParser.d.ts": { - "version": "25ff1b9cce87802468e368a8f5cfa1fc6b441ed7f042e74f4cf0774970a55d78", - "signature": "25ff1b9cce87802468e368a8f5cfa1fc6b441ed7f042e74f4cf0774970a55d78", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysEvents.d.ts": { - "version": "d442718e27311698feab5e56acc9cd7f9f1d7901f909d29577c66409aa36816e", - "signature": "d442718e27311698feab5e56acc9cd7f9f1d7901f909d29577c66409aa36816e", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTarget.d.ts": { - "version": "a00351937b267afb1755c02500468206d59e454a277457629a6710ba90294499", - "signature": "a00351937b267afb1755c02500468206d59e454a277457629a6710ba90294499", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysDialog.d.ts": { - "version": "ccbc9b80459cc3201c441a2855d52f41367677274a16554c9942f10d22e11c74", - "signature": "ccbc9b80459cc3201c441a2855d52f41367677274a16554c9942f10d22e11c74", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysDialog2.d.ts": { - "version": "705a3c4c90308c507e4a11db93803aeb66c1a7ba3cd87488250278c8fe7a78e0", - "signature": "705a3c4c90308c507e4a11db93803aeb66c1a7ba3cd87488250278c8fe7a78e0", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTarget2.d.ts": { - "version": "bbd8e5c44e3ab074e769469d43b796c038e8085cff877cabb5ddca13670f1542", - "signature": "bbd8e5c44e3ab074e769469d43b796c038e8085cff877cabb5ddca13670f1542", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/index.d.ts": { - "version": "ff852b0841f31d148c8e210c8f8c4e4933e61e6b149c4439332a0960feb68da6", - "signature": "ff852b0841f31d148c8e210c8f8c4e4933e61e6b149c4439332a0960feb68da6", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menuDivider.d.ts": { - "version": "c4b5e722bce5cc5586e20e98bffc814c1e6bc0eb63491033da6c7ad06a08452e", - "signature": "c4b5e722bce5cc5586e20e98bffc814c1e6bc0eb63491033da6c7ad06a08452e", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menu.d.ts": { - "version": "fd45fd45c1bc1b01f3d2ce48690d34ba7da3d12fd747f2e1294ed68434a6c9e0", - "signature": "fd45fd45c1bc1b01f3d2ce48690d34ba7da3d12fd747f2e1294ed68434a6c9e0", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarDivider.d.ts": { - "version": "12d0e3cc6dc17ca99b0a62b6582ea2d0d2de615476bf4226f06993a32c2f55d8", - "signature": "12d0e3cc6dc17ca99b0a62b6582ea2d0d2de615476bf4226f06993a32c2f55d8", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarGroup.d.ts": { - "version": "71f6be98b68d76e501ab9b030fd91406abf63bfd62c07ea01c62378a10e67392", - "signature": "71f6be98b68d76e501ab9b030fd91406abf63bfd62c07ea01c62378a10e67392", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarHeading.d.ts": { - "version": "b30d6b292f7fe92ab336c862c87c0ee638f42fc19064d2c453f1ceb9907743a0", - "signature": "b30d6b292f7fe92ab336c862c87c0ee638f42fc19064d2c453f1ceb9907743a0", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbar.d.ts": { - "version": "82db4090463339840ba9e4e74dcbb149770021b04da9d250bb59f0bde1d6fb7f", - "signature": "82db4090463339840ba9e4e74dcbb149770021b04da9d250bb59f0bde1d6fb7f", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/non-ideal-state/nonIdealState.d.ts": { - "version": "b8b77eca0027e7379bae9d2fcb541214463a29bee82c2446bc4055cdd0947154", - "signature": "b8b77eca0027e7379bae9d2fcb541214463a29bee82c2446bc4055cdd0947154", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/text/text.d.ts": { - "version": "e9f2290bb471abe6ffbd94da887175211af82fd222c410954a132a8b853fbcc7", - "signature": "e9f2290bb471abe6ffbd94da887175211af82fd222c410954a132a8b853fbcc7", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack/panelProps.d.ts": { - "version": "766d9084eed1c97e2b8f74aacfd589e048e7ad9f6d6721e34661e8a225b2b235", - "signature": "766d9084eed1c97e2b8f74aacfd589e048e7ad9f6d6721e34661e8a225b2b235", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack/panelStack.d.ts": { - "version": "fad16a86db863b04d81732e8578caceaa7987116cb212889fe13503f63b336fa", - "signature": "fad16a86db863b04d81732e8578caceaa7987116cb212889fe13503f63b336fa", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack2/panelTypes.d.ts": { - "version": "67de6128726bc617396f1b5935d9f1e75a7e96d6d6f03daa5adf4a697e13063e", - "signature": "67de6128726bc617396f1b5935d9f1e75a7e96d6d6f03daa5adf4a697e13063e", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack2/panelStack2.d.ts": { - "version": "fc2921889e348f02bb9fa2205f6aed53b7afef4f3a4128d91aa46b7809b9c8ac", - "signature": "fc2921889e348f02bb9fa2205f6aed53b7afef4f3a4128d91aa46b7809b9c8ac", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/common/context.d.ts": { - "version": "6af6177e515fd46648854e37fef518d482cc55fa35392c3cac1eefcbf4970b53", - "signature": "6af6177e515fd46648854e37fef518d482cc55fa35392c3cac1eefcbf4970b53", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/portal/portal.d.ts": { - "version": "1f7c096a968fb8e9b2668aaf575ea9672e16e22525eecc03b567fca89db96868", - "signature": "1f7c096a968fb8e9b2668aaf575ea9672e16e22525eecc03b567fca89db96868", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/progress-bar/progressBar.d.ts": { - "version": "db336f2e6a2cf9113e66c2442db885817c51d642ed25e9475b1bf8b942a5c737", - "signature": "db336f2e6a2cf9113e66c2442db885817c51d642ed25e9475b1bf8b942a5c737", - "affectsGlobalScope": false - }, - "./node_modules/@juggle/resize-observer/lib/DOMRectReadOnly.d.ts": { - "version": "c93bb3841ee23979a11eed48d03c748b6c00f6b82908208b1b70bee5a2510d11", - "signature": "c93bb3841ee23979a11eed48d03c748b6c00f6b82908208b1b70bee5a2510d11", - "affectsGlobalScope": false - }, - "./node_modules/@juggle/resize-observer/lib/ResizeObserverSize.d.ts": { - "version": "c8576d05dd7b580a110af9ac6b66a81cfabc732b0076fc6743eb218ecb387083", - "signature": "c8576d05dd7b580a110af9ac6b66a81cfabc732b0076fc6743eb218ecb387083", - "affectsGlobalScope": false - }, - "./node_modules/@juggle/resize-observer/lib/ResizeObserverEntry.d.ts": { - "version": "adb44ac0f12dea0e9a41485bcf37f8e0617fae28c5175c8f585ea5119a9ced55", - "signature": "adb44ac0f12dea0e9a41485bcf37f8e0617fae28c5175c8f585ea5119a9ced55", - "affectsGlobalScope": false - }, - "./node_modules/@juggle/resize-observer/lib/ResizeObserverCallback.d.ts": { - "version": "fda5ce2688395ea5116d61cbfcce51572ff4a552320018fe61acc126d2396ec5", - "signature": "fda5ce2688395ea5116d61cbfcce51572ff4a552320018fe61acc126d2396ec5", - "affectsGlobalScope": false - }, - "./node_modules/@juggle/resize-observer/lib/ResizeObserverBoxOptions.d.ts": { - "version": "74e473cd4d82d3fbb5a1e1184c08434ff47a092210d21fc8e12be4414c663ef4", - "signature": "74e473cd4d82d3fbb5a1e1184c08434ff47a092210d21fc8e12be4414c663ef4", - "affectsGlobalScope": false - }, - "./node_modules/@juggle/resize-observer/lib/ResizeObserverOptions.d.ts": { - "version": "32bfdd2bbcf3556ad9d9649e55fbb5f13be9f51d111c8c63c1bb2ebe171c8fa1", - "signature": "32bfdd2bbcf3556ad9d9649e55fbb5f13be9f51d111c8c63c1bb2ebe171c8fa1", - "affectsGlobalScope": false - }, - "./node_modules/@juggle/resize-observer/lib/ResizeObserver.d.ts": { - "version": "02a7893bb8b6af9b2bf0bdd1b6c1649ea57a474d20328b7743c5498f6c1d35a5", - "signature": "02a7893bb8b6af9b2bf0bdd1b6c1649ea57a474d20328b7743c5498f6c1d35a5", - "affectsGlobalScope": false - }, - "./node_modules/@juggle/resize-observer/lib/exports/resize-observer.d.ts": { - "version": "7ec37e85f0fa38bedae93389ecd478f02016cae1aba85a84317c85e3be330695", - "signature": "7ec37e85f0fa38bedae93389ecd478f02016cae1aba85a84317c85e3be330695", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/resize-sensor/resizeSensor.d.ts": { - "version": "f9a3e4e1482543de33fc583ed0cba9418deb70cb4a23b6a887adae4c475a0ea5", - "signature": "f9a3e4e1482543de33fc583ed0cba9418deb70cb4a23b6a887adae4c475a0ea5", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/resize-sensor/resizeObserverTypes.d.ts": { - "version": "2dc5a147df3cda569a2ea63ad72cdaf5a07d7ed6d8d50c9ae19d9db33b2dbc4a", - "signature": "2dc5a147df3cda569a2ea63ad72cdaf5a07d7ed6d8d50c9ae19d9db33b2dbc4a", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/slider/handleProps.d.ts": { - "version": "de758cc51526ebf7e20d55259b2f77db44ec287da225cef6a918b7ed6f4832ac", - "signature": "de758cc51526ebf7e20d55259b2f77db44ec287da225cef6a918b7ed6f4832ac", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/slider/multiSlider.d.ts": { - "version": "5ffea48470c0ffac6f0ea8869388967046f926617c75944919b5566d5a8e1250", - "signature": "5ffea48470c0ffac6f0ea8869388967046f926617c75944919b5566d5a8e1250", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/slider/rangeSlider.d.ts": { - "version": "6f221183996e809807c8da8306f04b4451152c989479f89f4453ee741fffe8dd", - "signature": "6f221183996e809807c8da8306f04b4451152c989479f89f4453ee741fffe8dd", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/slider/slider.d.ts": { - "version": "680614408c6a3b9852ad605681c10a3ecd7c86f2118ddbad742feafe794193ee", - "signature": "680614408c6a3b9852ad605681c10a3ecd7c86f2118ddbad742feafe794193ee", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/spinner/spinner.d.ts": { - "version": "54b4e3c73d9e920ef5a62c3f5bcf1a55494dd9890fa9c88b0da13921df66b94e", - "signature": "54b4e3c73d9e920ef5a62c3f5bcf1a55494dd9890fa9c88b0da13921df66b94e", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/tabs/tab.d.ts": { - "version": "de5dcf365bfbbde28733ce9462f433314ae9689d37b0b04939c5e6966e3bda06", - "signature": "de5dcf365bfbbde28733ce9462f433314ae9689d37b0b04939c5e6966e3bda06", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/tabs/tabs.d.ts": { - "version": "5057f24d8172296cdc62afb9abb63a2a4d3c07437d12b52f6a0310159e97d971", - "signature": "5057f24d8172296cdc62afb9abb63a2a4d3c07437d12b52f6a0310159e97d971", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/tag/tag.d.ts": { - "version": "289f6df20ace88eaba2850cb61b5611491e080c2bfa7b37797b2fe038e6e9ad1", - "signature": "289f6df20ace88eaba2850cb61b5611491e080c2bfa7b37797b2fe038e6e9ad1", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/tag-input/tagInput.d.ts": { - "version": "ccdce610b96815ed3531525ccfadf350ff9c65e9e2b3f078d90afecb9759b8cf", - "signature": "ccdce610b96815ed3531525ccfadf350ff9c65e9e2b3f078d90afecb9759b8cf", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/toast/toast.d.ts": { - "version": "4515e4e961dfaa2d4b973345d463f19bf86f8866d8f1642015104a68b9516e2b", - "signature": "4515e4e961dfaa2d4b973345d463f19bf86f8866d8f1642015104a68b9516e2b", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/toast/toaster.d.ts": { - "version": "a9e15d87d0161943f857ee069dc2e86dff8ba4d93fb757a4d42f60ecb2769c90", - "signature": "a9e15d87d0161943f857ee069dc2e86dff8ba4d93fb757a4d42f60ecb2769c90", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/tooltip/tooltip.d.ts": { - "version": "385b46d24d6f4ae8e9bcce72514ec31ace894069cd5b14ad45ec5dd07a632384", - "signature": "385b46d24d6f4ae8e9bcce72514ec31ace894069cd5b14ad45ec5dd07a632384", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/tree/treeNode.d.ts": { - "version": "24540dd95f648a44a8966342ec060944d36ee77fb82a8ca3a597658d4034a7bc", - "signature": "24540dd95f648a44a8966342ec060944d36ee77fb82a8ca3a597658d4034a7bc", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/tree/tree.d.ts": { - "version": "f750a5987f52545b7892a7154b882831743e83a58c53bafa7ff5ac43f01b9361", - "signature": "f750a5987f52545b7892a7154b882831743e83a58c53bafa7ff5ac43f01b9361", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/components/index.d.ts": { - "version": "38982dc4bea27b113b097542e7062b9c6a2f7b3df8541af50b55a78fd29daf77", - "signature": "38982dc4bea27b113b097542e7062b9c6a2f7b3df8541af50b55a78fd29daf77", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/context/hotkeys/hotkeysProvider.d.ts": { - "version": "3194118ef94b435a44c67f6f3b9a1fb3599c82d8943f9c0afa7436e7e96e4961", - "signature": "3194118ef94b435a44c67f6f3b9a1fb3599c82d8943f9c0afa7436e7e96e4961", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/context/index.d.ts": { - "version": "4a20cccd80c4144a8534dd94781ed5b2a439189caec02e84c2dc0fe26ec1f287", - "signature": "4a20cccd80c4144a8534dd94781ed5b2a439189caec02e84c2dc0fe26ec1f287", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/core/lib/esm/index.d.ts": { - "version": "6fc2bf14b58b8c23dc11c9c1afb4880649ff99b2c4aa2bc0c5dc7c6446feae77", - "signature": "6fc2bf14b58b8c23dc11c9c1afb4880649ff99b2c4aa2bc0c5dc7c6446feae77", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/select/lib/cjs/common/classes.d.ts": { - "version": "a7d6622b45699239636521e38dd4e9f76b857afeeda087b95078f0811c8cb910", - "signature": "a7d6622b45699239636521e38dd4e9f76b857afeeda087b95078f0811c8cb910", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/select/lib/cjs/common/listItemsUtils.d.ts": { - "version": "875b2375b7214808f47c525b583c22ff7e18864c5eb8ab6fb019e04d78d14653", - "signature": "875b2375b7214808f47c525b583c22ff7e18864c5eb8ab6fb019e04d78d14653", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/select/lib/cjs/common/itemListRenderer.d.ts": { - "version": "65f924b906eea12184a1076148a4e05163f62d197e70007d5254b6dbea5b7075", - "signature": "65f924b906eea12184a1076148a4e05163f62d197e70007d5254b6dbea5b7075", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/select/lib/cjs/common/itemRenderer.d.ts": { - "version": "360c80aa8c2bb72df69ac5c0ea32b1767d9a7e54294bf92c56d6fe0e6fd504cf", - "signature": "360c80aa8c2bb72df69ac5c0ea32b1767d9a7e54294bf92c56d6fe0e6fd504cf", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/select/lib/cjs/common/predicate.d.ts": { - "version": "27b3f549994f28c3b738ce39a929a8829ac9252653dc7d3ad8aa829f4d6cef7a", - "signature": "27b3f549994f28c3b738ce39a929a8829ac9252653dc7d3ad8aa829f4d6cef7a", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/select/lib/cjs/common/listItemsProps.d.ts": { - "version": "b7f3b4c40e22e1c38bab0a1fb4611e71ce1884db30f389f4277f1ca1a472cf0b", - "signature": "b7f3b4c40e22e1c38bab0a1fb4611e71ce1884db30f389f4277f1ca1a472cf0b", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/select/lib/cjs/common/index.d.ts": { - "version": "d7f35f1ff18f2bc33c0ec0234e12f47f8dcee29e76942689cabdfb4d19f3f4b0", - "signature": "d7f35f1ff18f2bc33c0ec0234e12f47f8dcee29e76942689cabdfb4d19f3f4b0", - "affectsGlobalScope": false - }, - "./node_modules/@blueprintjs/select/lib/cjs/components/select/select.d.ts": { - "version": "2be90eb05dc17ec0f6dbe4439c3170e907d0d7601d3bfe5c164cf7a7e93c6275", - "signature": "2be90eb05dc17ec0f6dbe4439c3170e907d0d7601d3bfe5c164cf7a7e93c6275", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/blueprint.d.ts": { - "version": "76e27a82abcc42653aec48ff050d6235a62a3eb0d5c6c4c2f5f09bdc8fb79807", - "signature": "76e27a82abcc42653aec48ff050d6235a62a3eb0d5c6c4c2f5f09bdc8fb79807", - "affectsGlobalScope": false - }, - "./node_modules/typestyle/node_modules/csstype/index.d.ts": { - "version": "381899b8d1d4c1be716f18cb5242ba39f66f4b1e31d45af62a32a99f8edcb39d", - "signature": "381899b8d1d4c1be716f18cb5242ba39f66f4b1e31d45af62a32a99f8edcb39d", - "affectsGlobalScope": false - }, - "./node_modules/typestyle/lib/types.d.ts": { - "version": "07e05f7848cbab3cd06298fd5ec3e2c2ac106c6c76b2233d667bd04b49109ed1", - "signature": "07e05f7848cbab3cd06298fd5ec3e2c2ac106c6c76b2233d667bd04b49109ed1", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/style/icon.d.ts": { - "version": "72197af93cb407921c0db36a7c187588c10f994e7924d2ec722004843c226e2d", - "signature": "72197af93cb407921c0db36a7c187588c10f994e7924d2ec722004843c226e2d", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/style/index.d.ts": { - "version": "aecf31d8843eecf4011a77ba692a68ba8da0241653a39cd275310eed2ab1649d", - "signature": "aecf31d8843eecf4011a77ba692a68ba8da0241653a39cd275310eed2ab1649d", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/labicon.d.ts": { - "version": "bfef935156b81c081b0e58da269d50db594c6229eb9d90622858274d92358700", - "signature": "bfef935156b81c081b0e58da269d50db594c6229eb9d90622858274d92358700", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/iconimports.d.ts": { - "version": "ba782fc53d5fef0d97580dd4ef24ada4a9bc3491574f4fe67fb35dd03d8cf7f5", - "signature": "ba782fc53d5fef0d97580dd4ef24ada4a9bc3491574f4fe67fb35dd03d8cf7f5", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/commandpalettesvg.d.ts": { - "version": "b19f59a453f22453e4735e0b9fee2089fabebddfdd0b0fedab0409e3a2da63ca", - "signature": "b19f59a453f22453e4735e0b9fee2089fabebddfdd0b0fedab0409e3a2da63ca", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/menusvg.d.ts": { - "version": "f080a7a3aaa9eb07e4b0c38c0ecdb3a409bdb5f827479a4402acfed6111763a7", - "signature": "f080a7a3aaa9eb07e4b0c38c0ecdb3a409bdb5f827479a4402acfed6111763a7", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/tabbarsvg.d.ts": { - "version": "18d7e87e181c54ce296d7d86c03cc4a4adbfc8a647a57d966bef31e02857b994", - "signature": "18d7e87e181c54ce296d7d86c03cc4a4adbfc8a647a57d966bef31e02857b994", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/index.d.ts": { - "version": "d17f7a001dae13ded8536376f9319169a4c53e0e3789756e2058d0f4b4083a19", - "signature": "d17f7a001dae13ded8536376f9319169a4c53e0e3789756e2058d0f4b4083a19", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/index.d.ts": { - "version": "ba42ed466e271511af20653ef52792fc270ae38c2a897c60249efdb5258f22a8", - "signature": "ba42ed466e271511af20653ef52792fc270ae38c2a897c60249efdb5258f22a8", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/interface.d.ts": { - "version": "db3efaf54928d3b92c0e80f1da14e03b49e20272e90158beae18ac9891207798", - "signature": "db3efaf54928d3b92c0e80f1da14e03b49e20272e90158beae18ac9891207798", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/htmlselect.d.ts": { - "version": "cb82c1784b85fe06df3a5bdbebf3e27e68ed9e6e0086014db89adf3954596661", - "signature": "cb82c1784b85fe06df3a5bdbebf3e27e68ed9e6e0086014db89adf3954596661", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/menu.d.ts": { - "version": "5d88c7751a2e431303eb7537734d90c8441831d976a45fe015afbc3a387f0458", - "signature": "5d88c7751a2e431303eb7537734d90c8441831d976a45fe015afbc3a387f0458", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/switch.d.ts": { - "version": "f930cec87b27939416f5d933c8ae49e83827def3c4d6a7b842ee414892dbe873", - "signature": "f930cec87b27939416f5d933c8ae49e83827def3c4d6a7b842ee414892dbe873", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/index.d.ts": { - "version": "490333f51a29f5a720d3dcd58912c8456231e17965ccbbd29aedf1d84823e56c", - "signature": "490333f51a29f5a720d3dcd58912c8456231e17965ccbbd29aedf1d84823e56c", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/tokens.d.ts": { - "version": "f5f4eed847f0556304760c3beacdcb13a5e0410339897204eedc0b193d4b2d2b", - "signature": "f5f4eed847f0556304760c3beacdcb13a5e0410339897204eedc0b193d4b2d2b", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/utils.d.ts": { - "version": "3bdcbc4d71a64f44368a69a02566a9c2357381e162f588eeb51ea610abb4766d", - "signature": "3bdcbc4d71a64f44368a69a02566a9c2357381e162f588eeb51ea610abb4766d", - "affectsGlobalScope": false - }, - "./node_modules/@types/json-schema/index.d.ts": { - "version": "f3e604694b624fa3f83f6684185452992088f5efb2cf136b62474aa106d6f1b6", - "signature": "f3e604694b624fa3f83f6684185452992088f5efb2cf136b62474aa106d6f1b6", - "affectsGlobalScope": false - }, - "./node_modules/@rjsf/core/index.d.ts": { - "version": "a81498798cca946eeaec5844059412baaca219eee731de4bb054b02faa26b8f5", - "signature": "a81498798cca946eeaec5844059412baaca219eee731de4bb054b02faa26b8f5", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/FormComponentRegistry.d.ts": { - "version": "45549b824965f21bae5bc4de5b6e5996441352a8dddf4890af6e6d4f206429b8", - "signature": "45549b824965f21bae5bc4de5b6e5996441352a8dddf4890af6e6d4f206429b8", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/index.d.ts": { - "version": "66184a3fe0eea09816acbf62e64f9c3d19f00fdac46c7976c9befe99bd011e28", - "signature": "66184a3fe0eea09816acbf62e64f9c3d19f00fdac46c7976c9befe99bd011e28", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/vdom.d.ts": { - "version": "3ac1797302fafdb44fd3e021dd7720534d7e21eb7e0857937cec7e5b97d8aa08", - "signature": "3ac1797302fafdb44fd3e021dd7720534d7e21eb7e0857937cec7e5b97d8aa08", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/widget.d.ts": { - "version": "1de402e6a050bf19f139cf626dc9423a2a932113ae5bc92b66a0532efa7b711b", - "signature": "1de402e6a050bf19f139cf626dc9423a2a932113ae5bc92b66a0532efa7b711b", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/factory.d.ts": { - "version": "6186b526aed0008b29d4f1ed5898ebd1e2ca208befff915197321b8d410ee1aa", - "signature": "6186b526aed0008b29d4f1ed5898ebd1e2ca208befff915197321b8d410ee1aa", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/registry.d.ts": { - "version": "4927f298301e27dc2bb64be8c579fd75dbbbccc9a9c45d0930cee2276076dea2", - "signature": "4927f298301e27dc2bb64be8c579fd75dbbbccc9a9c45d0930cee2276076dea2", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/index.d.ts": { - "version": "bd503a1092b773ad9df35218ae7640826ed20bff6e6aa53935940a37f8532387", - "signature": "bd503a1092b773ad9df35218ae7640826ed20bff6e6aa53935940a37f8532387", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/mainareawidget.d.ts": { - "version": "d10f0a25e4f0acd20d9ac7d49c0ad11e00d6c2f83bab405ad3fea3c5edbf4cea", - "signature": "d10f0a25e4f0acd20d9ac7d49c0ad11e00d6c2f83bab405ad3fea3c5edbf4cea", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/menufactory.d.ts": { - "version": "ac05441a6341f150946465f50a2033b9bf5834178454b8a8ffd13eacdd0ab905", - "signature": "ac05441a6341f150946465f50a2033b9bf5834178454b8a8ffd13eacdd0ab905", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sanitizer.d.ts": { - "version": "0b7ab3f0194228d852486b5d456db422b51db4985a35ae19c2f9d8f39f397cde", - "signature": "0b7ab3f0194228d852486b5d456db422b51db4985a35ae19c2f9d8f39f397cde", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/search.d.ts": { - "version": "2be65d8b8602b250b8758e1ece4e63c7bc76de755ea28c9a33b5226e4327cf34", - "signature": "2be65d8b8602b250b8758e1ece4e63c7bc76de755ea28c9a33b5226e4327cf34", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/spinner.d.ts": { - "version": "021d76abf950787b60632e2cddc8feecb0a5396293c83fdf53ba653f41cc62d5", - "signature": "021d76abf950787b60632e2cddc8feecb0a5396293c83fdf53ba653f41cc62d5", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/splash.d.ts": { - "version": "0fa06cc38a37fb4e7cfe132e137eb07765a78f9ff7562be2253722c019494aa3", - "signature": "0fa06cc38a37fb4e7cfe132e137eb07765a78f9ff7562be2253722c019494aa3", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/styling.d.ts": { - "version": "0317f14d352c00b5d5bc15ce474cbd66c439f9c84a9a7efe3be503afe53de288", - "signature": "0317f14d352c00b5d5bc15ce474cbd66c439f9c84a9a7efe3be503afe53de288", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/thememanager.d.ts": { - "version": "a7eae431a47e9b746dc46ae86c879578d81711e951d1d3e974ba087ea519884a", - "signature": "a7eae431a47e9b746dc46ae86c879578d81711e951d1d3e974ba087ea519884a", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/windowresolver.d.ts": { - "version": "d7082b1c91b9c8bf2d19cbd736ef7ee8a6a7c7cff5d6989b652bd28ebd73d8b0", - "signature": "d7082b1c91b9c8bf2d19cbd736ef7ee8a6a7c7cff5d6989b652bd28ebd73d8b0", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/kernelstatuses.d.ts": { - "version": "840f94e9586f135cac4cd3ff032f06b2af7997c20488ba097d3895686695026c", - "signature": "840f94e9586f135cac4cd3ff032f06b2af7997c20488ba097d3895686695026c", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts": { - "version": "50ed3a72a5b906f24310f56fae2788872b6bc87de67d77426a664e33eab83310", - "signature": "50ed3a72a5b906f24310f56fae2788872b6bc87de67d77426a664e33eab83310", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/api.d.ts": { - "version": "a7d88ddc37a080200cdaf74ef85fd719b37ca092db6f2039e664331e608bc398", - "signature": "a7d88ddc37a080200cdaf74ef85fd719b37ca092db6f2039e664331e608bc398", - "affectsGlobalScope": false - }, - "./node_modules/lib0/observable.d.ts": { - "version": "8677c84dd96426659c02d8204af67d286b4ff1e647a7b94d0fe174fdb81b7f05", - "signature": "8677c84dd96426659c02d8204af67d286b4ff1e647a7b94d0fe174fdb81b7f05", - "affectsGlobalScope": false - }, - "./node_modules/lib0/random.d.ts": { - "version": "a40120c921286e2b336d87804ba61eb5270675540054f8d58a0f71348ed9fec6", - "signature": "a40120c921286e2b336d87804ba61eb5270675540054f8d58a0f71348ed9fec6", - "affectsGlobalScope": false - }, - "./node_modules/lib0/encoding.d.ts": { - "version": "7ab10c475fad9a9999a77e0990708bab59c595ad99f2a8189d69d695208fdbc2", - "signature": "7ab10c475fad9a9999a77e0990708bab59c595ad99f2a8189d69d695208fdbc2", - "affectsGlobalScope": false - }, - "./node_modules/lib0/decoding.d.ts": { - "version": "05daa1ea1a7de9583bfce21d5a3383c8e580beae580e97f0f2902ebe2deb6897", - "signature": "05daa1ea1a7de9583bfce21d5a3383c8e580beae580e97f0f2902ebe2deb6897", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts": { - "version": "02e8d6b9f3c89e7ad07c65a486c8387cf862a4c4e7c4d3cb7f51598c7ec057a6", - "signature": "02e8d6b9f3c89e7ad07c65a486c8387cf862a4c4e7c4d3cb7f51598c7ec057a6", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts": { - "version": "f3745a58f2bd7ed2c210e882e95b67d0707f97b9ed7b2431f68e5cccec0e20ba", - "signature": "f3745a58f2bd7ed2c210e882e95b67d0707f97b9ed7b2431f68e5cccec0e20ba", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/utils/DeleteSet.d.ts": { - "version": "ef31e112135506de69dd265d650a12fe0658899266cf49f785f387980fad3e3a", - "signature": "ef31e112135506de69dd265d650a12fe0658899266cf49f785f387980fad3e3a", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/utils/YEvent.d.ts": { - "version": "a5947ad6685a37ec093a5acc0e313e1b8922fe93e9893a914bf2f112d66c88ea", - "signature": "a5947ad6685a37ec093a5acc0e313e1b8922fe93e9893a914bf2f112d66c88ea", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/utils/Transaction.d.ts": { - "version": "bc94d9f3733df77fb0e156b9a1e65fd079a923b32ef1cf69e832dab5553c0b86", - "signature": "bc94d9f3733df77fb0e156b9a1e65fd079a923b32ef1cf69e832dab5553c0b86", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/utils/EventHandler.d.ts": { - "version": "e7c738913fab4ba4b00fcf1d1eb1ddf8989b64355da34250407340f4894a2384", - "signature": "e7c738913fab4ba4b00fcf1d1eb1ddf8989b64355da34250407340f4894a2384", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/utils/Snapshot.d.ts": { - "version": "da23a9065db521ac08ae997289eb4b0a243985fc483e12a5a99f955b9ed485d0", - "signature": "da23a9065db521ac08ae997289eb4b0a243985fc483e12a5a99f955b9ed485d0", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/types/AbstractType.d.ts": { - "version": "172026190c628bcb7908427594dea8e6fd5bc1dda1898c2f3b4d6c7e58f55108", - "signature": "172026190c628bcb7908427594dea8e6fd5bc1dda1898c2f3b4d6c7e58f55108", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/utils/ID.d.ts": { - "version": "431eef47c55a88198c1cc62ea7c9c7537c3219c3fd652c554d3d5bb7a63658a1", - "signature": "431eef47c55a88198c1cc62ea7c9c7537c3219c3fd652c554d3d5bb7a63658a1", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/structs/AbstractStruct.d.ts": { - "version": "ee5af755629403e296dcc1bb67c3d405ba2996eb2111ce0d6af5cf39df258e73", - "signature": "ee5af755629403e296dcc1bb67c3d405ba2996eb2111ce0d6af5cf39df258e73", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/structs/GC.d.ts": { - "version": "16b311651dbd580d429938c993c41e1c610ef0b1e83c38229f3ad4d81a35cd39", - "signature": "16b311651dbd580d429938c993c41e1c610ef0b1e83c38229f3ad4d81a35cd39", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/utils/StructStore.d.ts": { - "version": "a45c8c0c99d344b9bdbdf836f3d8fb8a90a2b0adc6ecba2592593d7bcb28ec5f", - "signature": "a45c8c0c99d344b9bdbdf836f3d8fb8a90a2b0adc6ecba2592593d7bcb28ec5f", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/structs/Item.d.ts": { - "version": "9abe7f3d8ec07e6a0d16b58858a58e50fd8bf3a5da845d04e19e96105b744436", - "signature": "9abe7f3d8ec07e6a0d16b58858a58e50fd8bf3a5da845d04e19e96105b744436", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/types/YArray.d.ts": { - "version": "0e8545391b29120f8f845ca20c91dbdbf779a169f5e530fd9ef7ea57617d6200", - "signature": "0e8545391b29120f8f845ca20c91dbdbf779a169f5e530fd9ef7ea57617d6200", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/types/YText.d.ts": { - "version": "80a0cce00eed21a46d7669ca810a12973b28033636460c8cbeded257ddbad284", - "signature": "80a0cce00eed21a46d7669ca810a12973b28033636460c8cbeded257ddbad284", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/types/YMap.d.ts": { - "version": "08b21adc536403f7092bf89eb3de7e88b15df6d4e1daf64ca9da303d45d9c3a9", - "signature": "08b21adc536403f7092bf89eb3de7e88b15df6d4e1daf64ca9da303d45d9c3a9", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/types/YXmlText.d.ts": { - "version": "999754ad2655bed12496eeaf81efc8f4881807c514cdb95216dd96e531b8fcd5", - "signature": "999754ad2655bed12496eeaf81efc8f4881807c514cdb95216dd96e531b8fcd5", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/types/YXmlElement.d.ts": { - "version": "1ad42042417b29772aa2940f26a697a21bbfa5e63ea9debdf9cc6025b16cc7bf", - "signature": "1ad42042417b29772aa2940f26a697a21bbfa5e63ea9debdf9cc6025b16cc7bf", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/types/YXmlHook.d.ts": { - "version": "72c9b0f8c9ee268fe755eeab915e5b0897772244aa0ef11f59e15c50a6a55121", - "signature": "72c9b0f8c9ee268fe755eeab915e5b0897772244aa0ef11f59e15c50a6a55121", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/types/YXmlEvent.d.ts": { - "version": "64c71ac5e3d69e24ae33b0f6f0e109950dcc5828944ce08b2c4b76be0114b75e", - "signature": "64c71ac5e3d69e24ae33b0f6f0e109950dcc5828944ce08b2c4b76be0114b75e", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/types/YXmlFragment.d.ts": { - "version": "3aa58e0e4b11207049d969daba021ca29be3a4fdc19682320a85b682da2967aa", - "signature": "3aa58e0e4b11207049d969daba021ca29be3a4fdc19682320a85b682da2967aa", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/utils/Doc.d.ts": { - "version": "b531c113427fc1c33835dc64ac619471182cbdf31ec9e3ad9362e8650c6ad661", - "signature": "b531c113427fc1c33835dc64ac619471182cbdf31ec9e3ad9362e8650c6ad661", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/utils/AbstractConnector.d.ts": { - "version": "55867e1188ed1f46cbde299df51671901c9de5af5a4b53c274019ed4b08d4f34", - "signature": "55867e1188ed1f46cbde299df51671901c9de5af5a4b53c274019ed4b08d4f34", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/utils/encoding.d.ts": { - "version": "d9b96d27372967e8f53b3f7b7cb6e875b8d128080abc4fa204a13f0d3f2b6506", - "signature": "d9b96d27372967e8f53b3f7b7cb6e875b8d128080abc4fa204a13f0d3f2b6506", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/utils/isParentOf.d.ts": { - "version": "d41b65a0fb48a14a7b52eaa45d9b65988af076e63704cba1dd1f72e961e0e2f5", - "signature": "d41b65a0fb48a14a7b52eaa45d9b65988af076e63704cba1dd1f72e961e0e2f5", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/utils/logging.d.ts": { - "version": "92b40a9393f937e4bd7eed4b0161ad03296607bfdf26b0bb323cde18c51e0687", - "signature": "92b40a9393f937e4bd7eed4b0161ad03296607bfdf26b0bb323cde18c51e0687", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/utils/PermanentUserData.d.ts": { - "version": "ef4af984fed6b1d73093c2d92619690ccf43e392ad0606a813fe7eb096bfb2ca", - "signature": "ef4af984fed6b1d73093c2d92619690ccf43e392ad0606a813fe7eb096bfb2ca", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/utils/RelativePosition.d.ts": { - "version": "7215a5c611e92a934a4280874c9844cd6b8dba4fd4523badc27203a60303c8ca", - "signature": "7215a5c611e92a934a4280874c9844cd6b8dba4fd4523badc27203a60303c8ca", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/utils/UndoManager.d.ts": { - "version": "95fb72821f5409bb14074d8cb57451865f40283f158718e2fea773d9f7580a17", - "signature": "95fb72821f5409bb14074d8cb57451865f40283f158718e2fea773d9f7580a17", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/structs/Skip.d.ts": { - "version": "59217222f06b2b24784160c8e2eaf0de94906912505101576a1dd744fd90cdcf", - "signature": "59217222f06b2b24784160c8e2eaf0de94906912505101576a1dd744fd90cdcf", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/utils/updates.d.ts": { - "version": "3353cf6e9d745fd873970cfd71ead8053869847dd0292290fc6f3efaf6b8ddcd", - "signature": "3353cf6e9d745fd873970cfd71ead8053869847dd0292290fc6f3efaf6b8ddcd", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/structs/ContentBinary.d.ts": { - "version": "d8b6dc94bc2761afdcff7a1e29359a383472bd8af2ce03485a2792026f15f458", - "signature": "d8b6dc94bc2761afdcff7a1e29359a383472bd8af2ce03485a2792026f15f458", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/structs/ContentDeleted.d.ts": { - "version": "1955442a305cd1622782ce89c898be431c66c39c36a253abb0543052f4917613", - "signature": "1955442a305cd1622782ce89c898be431c66c39c36a253abb0543052f4917613", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/structs/ContentDoc.d.ts": { - "version": "2251d1a89b3d8aac866bc79839c28681886d289d117404276ecf1d4fd5f5c19c", - "signature": "2251d1a89b3d8aac866bc79839c28681886d289d117404276ecf1d4fd5f5c19c", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/structs/ContentEmbed.d.ts": { - "version": "2a55511100028e4af650f52bdd7826fb187b9eee380b7ce9249a69f0713503fa", - "signature": "2a55511100028e4af650f52bdd7826fb187b9eee380b7ce9249a69f0713503fa", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/structs/ContentFormat.d.ts": { - "version": "af95dfea86a72f578f54d68f590a3988a97900b06f6169cdddc0bc40a4c6a918", - "signature": "af95dfea86a72f578f54d68f590a3988a97900b06f6169cdddc0bc40a4c6a918", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/structs/ContentJSON.d.ts": { - "version": "992442834491efb053df22fb8148f8fd1303c198c97f5b50ebf1dd0f63ae5e8b", - "signature": "992442834491efb053df22fb8148f8fd1303c198c97f5b50ebf1dd0f63ae5e8b", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/structs/ContentAny.d.ts": { - "version": "092274870bfdbb373ea502c23b8205d30e622fd10a7e5370d752a6d8de761110", - "signature": "092274870bfdbb373ea502c23b8205d30e622fd10a7e5370d752a6d8de761110", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/structs/ContentString.d.ts": { - "version": "e86a45fac2071035f07ade063ad32754edd13f45f3f3b143387ec01b8eb8aec9", - "signature": "e86a45fac2071035f07ade063ad32754edd13f45f3f3b143387ec01b8eb8aec9", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/structs/ContentType.d.ts": { - "version": "9d6fcf45c88c41f81ac9a39df453089cad491812291c260f19d85df9fd6ad130", - "signature": "9d6fcf45c88c41f81ac9a39df453089cad491812291c260f19d85df9fd6ad130", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/internals.d.ts": { - "version": "819ff6185962272453fe11af8d9f3da27f5d3761b21e196272db43ff54e4caa4", - "signature": "819ff6185962272453fe11af8d9f3da27f5d3761b21e196272db43ff54e4caa4", - "affectsGlobalScope": false - }, - "./node_modules/yjs/dist/src/index.d.ts": { - "version": "84691a3cac04b895505f490f97b2193b5068418fa252e69039caa9d61a98e441", - "signature": "84691a3cac04b895505f490f97b2193b5068418fa252e69039caa9d61a98e441", - "affectsGlobalScope": false - }, - "./node_modules/y-protocols/awareness.d.ts": { - "version": "6b630576d462988579afb9ad6b59f4475e3d87a4d105e52ff041263d23760283", - "signature": "6b630576d462988579afb9ad6b59f4475e3d87a4d105e52ff041263d23760283", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/ymodels.d.ts": { - "version": "24e0323c6427ccbe0c25e78b01f9b57a0495f81ac42bf660b937959a41bd17ce", - "signature": "24e0323c6427ccbe0c25e78b01f9b57a0495f81ac42bf660b937959a41bd17ce", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/utils.d.ts": { - "version": "fd875d9215c67e7939a2a838f59fb5bf2475f6599b0e790268e0959c8132ad56", - "signature": "fd875d9215c67e7939a2a838f59fb5bf2475f6599b0e790268e0959c8132ad56", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/index.d.ts": { - "version": "efe52b1bf1ee21354919672cd5b1e5a90ca660b44c1698daa9dede23df247ea9", - "signature": "efe52b1bf1ee21354919672cd5b1e5a90ca660b44c1698daa9dede23df247ea9", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/editor.d.ts": { - "version": "922ffa92f2a749d9e4983caf539450226a9a512e59f8d59ad3efb4e7a7d69acd", - "signature": "922ffa92f2a749d9e4983caf539450226a9a512e59f8d59ad3efb4e7a7d69acd", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/jsoneditor.d.ts": { - "version": "0cfd13afd45dc34a2cc17c5f0bb4b112a8707729c30473972f5f53f46c1f0bdf", - "signature": "0cfd13afd45dc34a2cc17c5f0bb4b112a8707729c30473972f5f53f46c1f0bdf", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/widget.d.ts": { - "version": "cc2ff26093c2ac1952efcbe8f9e85274fc66957d938c7803b45d59fcb3103038", - "signature": "cc2ff26093c2ac1952efcbe8f9e85274fc66957d938c7803b45d59fcb3103038", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/factory.d.ts": { - "version": "34c4973d41d0a884168413ec6f954a1549f801ad83bcaefce7a242a701186b6f", - "signature": "34c4973d41d0a884168413ec6f954a1549f801ad83bcaefce7a242a701186b6f", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/mimetype.d.ts": { - "version": "1f0945ebd30cf377af5724eb342adfd4021c98886d77cbf7d29800a33a56e52a", - "signature": "1f0945ebd30cf377af5724eb342adfd4021c98886d77cbf7d29800a33a56e52a", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/tokens.d.ts": { - "version": "54ad9ca565972415115f53e9d767daef39ce371b7cf06996bf062109cdd612bd", - "signature": "54ad9ca565972415115f53e9d767daef39ce371b7cf06996bf062109cdd612bd", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/index.d.ts": { - "version": "2f25161c97da541fac8fe4d8770626dba0c3a8564812847e89da336ef7ed604a", - "signature": "2f25161c97da541fac8fe4d8770626dba0c3a8564812847e89da336ef7ed604a", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/nbformat/lib/index.d.ts": { - "version": "2ffb6539ee354e561c489603b226ad7f484aa1e8920eda91d3d0d1e46f7d3872", - "signature": "2ffb6539ee354e561c489603b226ad7f484aa1e8920eda91d3d0d1e46f7d3872", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/observables/lib/index.d.ts": { - "version": "ce0d82d3a839e026518bee8d357cce5ec6396010314ebd7176bf3486e6eb0730", - "signature": "ce0d82d3a839e026518bee8d357cce5ec6396010314ebd7176bf3486e6eb0730", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/translation/lib/index.d.ts": { - "version": "c2d417bfcfb62ed2101db6175ea83f91b2656ada1397d4abaf8c7681c42fb534", - "signature": "c2d417bfcfb62ed2101db6175ea83f91b2656ada1397d4abaf8c7681c42fb534", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts": { - "version": "e871d5517e2c9dc5d7231ff614975ac84cdee84eb48c4529cdb4b681b5db5836", - "signature": "e871d5517e2c9dc5d7231ff614975ac84cdee84eb48c4529cdb4b681b5db5836", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/attachmentmodel.d.ts": { - "version": "18602ac631f800d530de4bc500d49b6302cbd907f4e272866292ec82dcfb9181", - "signature": "18602ac631f800d530de4bc500d49b6302cbd907f4e272866292ec82dcfb9181", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/factories.d.ts": { - "version": "91bfdd762f73f52a6eed64e988d3315b221a8a234ff2b6c5145393ede500101b", - "signature": "91bfdd762f73f52a6eed64e988d3315b221a8a234ff2b6c5145393ede500101b", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/latex.d.ts": { - "version": "010877b689dac0faf7d7891c4550771ccc62c7a110901b1966b59e82ffa08a27", - "signature": "010877b689dac0faf7d7891c4550771ccc62c7a110901b1966b59e82ffa08a27", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/mimemodel.d.ts": { - "version": "c2e2f97a746e849dc07cdf89eb555edc86704df6f328f10bedc7a90ebe1e3d64", - "signature": "c2e2f97a746e849dc07cdf89eb555edc86704df6f328f10bedc7a90ebe1e3d64", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/outputmodel.d.ts": { - "version": "9080ac7fd0b10b570edfa0adb7870b352a612074fe2095d889659176b3ab5825", - "signature": "9080ac7fd0b10b570edfa0adb7870b352a612074fe2095d889659176b3ab5825", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/apputils/lib/index.d.ts": { - "version": "50ed3a72a5b906f24310f56fae2788872b6bc87de67d77426a664e33eab83310", - "signature": "50ed3a72a5b906f24310f56fae2788872b6bc87de67d77426a664e33eab83310", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/services/lib/index.d.ts": { - "version": "3a8bab6cc1bee98448c5869f0ae38ab59a0651b533fdd9118ff23e02bc27ac4c", - "signature": "3a8bab6cc1bee98448c5869f0ae38ab59a0651b533fdd9118ff23e02bc27ac4c", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/tokens.d.ts": { - "version": "b631bbdec39e843d13588a980313af3d87f2e619f4b69ca41a74206fd4633721", - "signature": "b631bbdec39e843d13588a980313af3d87f2e619f4b69ca41a74206fd4633721", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/registry.d.ts": { - "version": "311e8e377a3ee2442bdd982249b68946cd756245386a36ac51110c58e81267d4", - "signature": "311e8e377a3ee2442bdd982249b68946cd756245386a36ac51110c58e81267d4", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/renderers.d.ts": { - "version": "3a3272321fb226d6aeaa7e770b6a3303a7ba165cc78704177e2976e41d4f129d", - "signature": "3a3272321fb226d6aeaa7e770b6a3303a7ba165cc78704177e2976e41d4f129d", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/widgets.d.ts": { - "version": "07c27846ff2d472afe34461830690ad03cc549be58a1469a2201e2e4d25edd8c", - "signature": "07c27846ff2d472afe34461830690ad03cc549be58a1469a2201e2e4d25edd8c", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/index.d.ts": { - "version": "4ed051e63cb4e713c8629ddb425b61b4acaac453183994a78187346f86f5c635", - "signature": "4ed051e63cb4e713c8629ddb425b61b4acaac453183994a78187346f86f5c635", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/outputarea/lib/model.d.ts": { - "version": "d650e233e653a0952826564dc5912e5eb9bca7bf34a4b520142e90c609309955", - "signature": "d650e233e653a0952826564dc5912e5eb9bca7bf34a4b520142e90c609309955", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/outputarea/lib/widget.d.ts": { - "version": "7f30aaebeea19707f1ea345969fdea45ef9efbe6f089b2c2c4d89c8333f22077", - "signature": "7f30aaebeea19707f1ea345969fdea45ef9efbe6f089b2c2c4d89c8333f22077", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/outputarea/lib/index.d.ts": { - "version": "3878eacacf7345bac706e02b26f0a8e073217a7558da6f57af1658261a2660c8", - "signature": "3878eacacf7345bac706e02b26f0a8e073217a7558da6f57af1658261a2660c8", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/rendermime/lib/index.d.ts": { - "version": "4ed051e63cb4e713c8629ddb425b61b4acaac453183994a78187346f86f5c635", - "signature": "4ed051e63cb4e713c8629ddb425b61b4acaac453183994a78187346f86f5c635", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/lib/headerfooter.d.ts": { - "version": "329a0e68a499a91c554f0d54909811bb1956620ecd5fb4e4d221a520c9325ad0", - "signature": "329a0e68a499a91c554f0d54909811bb1956620ecd5fb4e4d221a520c9325ad0", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/attachments/node_modules/@jupyterlab/nbformat/lib/index.d.ts": { - "version": "2ffb6539ee354e561c489603b226ad7f484aa1e8920eda91d3d0d1e46f7d3872", - "signature": "2ffb6539ee354e561c489603b226ad7f484aa1e8920eda91d3d0d1e46f7d3872", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/attachments/node_modules/@jupyterlab/observables/lib/index.d.ts": { - "version": "ce0d82d3a839e026518bee8d357cce5ec6396010314ebd7176bf3486e6eb0730", - "signature": "ce0d82d3a839e026518bee8d357cce5ec6396010314ebd7176bf3486e6eb0730", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/attachments/node_modules/@jupyterlab/rendermime/lib/index.d.ts": { - "version": "4ed051e63cb4e713c8629ddb425b61b4acaac453183994a78187346f86f5c635", - "signature": "4ed051e63cb4e713c8629ddb425b61b4acaac453183994a78187346f86f5c635", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/attachments/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts": { - "version": "e871d5517e2c9dc5d7231ff614975ac84cdee84eb48c4529cdb4b681b5db5836", - "signature": "e871d5517e2c9dc5d7231ff614975ac84cdee84eb48c4529cdb4b681b5db5836", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/attachments/lib/model.d.ts": { - "version": "92e110c85213e30ebba980e1d7c08d6cd9cbb33a13be682f6edff90373a60160", - "signature": "92e110c85213e30ebba980e1d7c08d6cd9cbb33a13be682f6edff90373a60160", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/attachments/lib/index.d.ts": { - "version": "4e10618655994786a4abc133f3ff36f1454edb62132c68ffbe83a191056b3a7a", - "signature": "4e10618655994786a4abc133f3ff36f1454edb62132c68ffbe83a191056b3a7a", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/lib/model.d.ts": { - "version": "c0c4deac1a2c72eabca183aa45ffcfd028fed1ceb99873d3f75f237dd2829f53", - "signature": "c0c4deac1a2c72eabca183aa45ffcfd028fed1ceb99873d3f75f237dd2829f53", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/lib/inputarea.d.ts": { - "version": "588efb4c4067ff4902ad0b7fffe81e8aad2e5730151ec5aa07e161ccfb6c573d", - "signature": "588efb4c4067ff4902ad0b7fffe81e8aad2e5730151ec5aa07e161ccfb6c573d", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/lib/widget.d.ts": { - "version": "f47184c1d16776229208c8cf40053ddb30793c985e1829817a1933c89f5212ba", - "signature": "f47184c1d16776229208c8cf40053ddb30793c985e1829817a1933c89f5212ba", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/lib/celldragutils.d.ts": { - "version": "93c4a07aab3d585495b347cdf841525cdfef2b8227e8eaaafd81cb8024233dbc", - "signature": "93c4a07aab3d585495b347cdf841525cdfef2b8227e8eaaafd81cb8024233dbc", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/lib/collapser.d.ts": { - "version": "aaa8825b8445ca92403adf0afb0cbf1842e741c2c1d37295d06a779f35bbfa3e", - "signature": "aaa8825b8445ca92403adf0afb0cbf1842e741c2c1d37295d06a779f35bbfa3e", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/lib/placeholder.d.ts": { - "version": "fd0c787f8f1a70073c902b2e8b3e5939f5a8464e6be8992a60ba6d16af6562e8", - "signature": "fd0c787f8f1a70073c902b2e8b3e5939f5a8464e6be8992a60ba6d16af6562e8", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/cells/lib/index.d.ts": { - "version": "182de11255bf8650def79975b682df6aa9c27fd5e1279cbf3ec084a61e5fb517", - "signature": "182de11255bf8650def79975b682df6aa9c27fd5e1279cbf3ec084a61e5fb517", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/apputils/lib/index.d.ts": { - "version": "50ed3a72a5b906f24310f56fae2788872b6bc87de67d77426a664e33eab83310", - "signature": "50ed3a72a5b906f24310f56fae2788872b6bc87de67d77426a664e33eab83310", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/nbformat/lib/index.d.ts": { - "version": "2ffb6539ee354e561c489603b226ad7f484aa1e8920eda91d3d0d1e46f7d3872", - "signature": "2ffb6539ee354e561c489603b226ad7f484aa1e8920eda91d3d0d1e46f7d3872", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/services/lib/index.d.ts": { - "version": "3a8bab6cc1bee98448c5869f0ae38ab59a0651b533fdd9118ff23e02bc27ac4c", - "signature": "3a8bab6cc1bee98448c5869f0ae38ab59a0651b533fdd9118ff23e02bc27ac4c", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/translation/lib/index.d.ts": { - "version": "c2d417bfcfb62ed2101db6175ea83f91b2656ada1397d4abaf8c7681c42fb534", - "signature": "c2d417bfcfb62ed2101db6175ea83f91b2656ada1397d4abaf8c7681c42fb534", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/codeeditor/lib/index.d.ts": { - "version": "2f25161c97da541fac8fe4d8770626dba0c3a8564812847e89da336ef7ed604a", - "signature": "2f25161c97da541fac8fe4d8770626dba0c3a8564812847e89da336ef7ed604a", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/coreutils/lib/index.d.ts": { - "version": "7a7fa32e403e381e681ef4984c9dc22adf0d32c1e4b7ad9fd5c6552412c855f0", - "signature": "7a7fa32e403e381e681ef4984c9dc22adf0d32c1e4b7ad9fd5c6552412c855f0", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/observables/lib/index.d.ts": { - "version": "ce0d82d3a839e026518bee8d357cce5ec6396010314ebd7176bf3486e6eb0730", - "signature": "ce0d82d3a839e026518bee8d357cce5ec6396010314ebd7176bf3486e6eb0730", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/rendermime/lib/index.d.ts": { - "version": "4ed051e63cb4e713c8629ddb425b61b4acaac453183994a78187346f86f5c635", - "signature": "4ed051e63cb4e713c8629ddb425b61b4acaac453183994a78187346f86f5c635", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/awareness.d.ts": { - "version": "d76f07f54a33b4180037f97633eef075357332c2d9c5962324eb42313fe8c95b", - "signature": "d76f07f54a33b4180037f97633eef075357332c2d9c5962324eb42313fe8c95b", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/mock.d.ts": { - "version": "a05ad0636016c5e19a3706a009e74d834f49dfaced27fd8b5be0d90f7bb9d3c4", - "signature": "a05ad0636016c5e19a3706a009e74d834f49dfaced27fd8b5be0d90f7bb9d3c4", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/shared-models/lib/index.d.ts": { - "version": "efe52b1bf1ee21354919672cd5b1e5a90ca660b44c1698daa9dede23df247ea9", - "signature": "efe52b1bf1ee21354919672cd5b1e5a90ca660b44c1698daa9dede23df247ea9", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/tokens.d.ts": { - "version": "584da1361a13e620b326f52d3afc5f1320414821e974162ee2ff48e17bb17ce7", - "signature": "584da1361a13e620b326f52d3afc5f1320414821e974162ee2ff48e17bb17ce7", - "affectsGlobalScope": false - }, - "./node_modules/y-websocket/dist/src/y-websocket.d.ts": { - "version": "f9f49c75e26a50c560033af6e7a6a7cf90250644aded0572b24776edc167ea8c", - "signature": "f9f49c75e26a50c560033af6e7a6a7cf90250644aded0572b24776edc167ea8c", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/yprovider.d.ts": { - "version": "00922c3bcaac6b66323468e79fbb1199d7d2a4ac62d0649a46248c1f55321d83", - "signature": "00922c3bcaac6b66323468e79fbb1199d7d2a4ac62d0649a46248c1f55321d83", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/index.d.ts": { - "version": "8d2385fb48865b7b11af8ade032494987a9d3f2b1478bc0d72333570a05ede67", - "signature": "8d2385fb48865b7b11af8ade032494987a9d3f2b1478bc0d72333570a05ede67", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts": { - "version": "e871d5517e2c9dc5d7231ff614975ac84cdee84eb48c4529cdb4b681b5db5836", - "signature": "e871d5517e2c9dc5d7231ff614975ac84cdee84eb48c4529cdb4b681b5db5836", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/ui-components/lib/index.d.ts": { - "version": "66184a3fe0eea09816acbf62e64f9c3d19f00fdac46c7976c9befe99bd011e28", - "signature": "66184a3fe0eea09816acbf62e64f9c3d19f00fdac46c7976c9befe99bd011e28", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/registry.d.ts": { - "version": "4c13808569e0a645d0ab5d865dc978918b4ff1654e5467e84383cb57ae2bff7e", - "signature": "4c13808569e0a645d0ab5d865dc978918b4ff1654e5467e84383cb57ae2bff7e", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/context.d.ts": { - "version": "4f09588dc21b264c6809d13fb3d6e6ba31be5f3b77ca383249567a89d1df80aa", - "signature": "4f09588dc21b264c6809d13fb3d6e6ba31be5f3b77ca383249567a89d1df80aa", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/default.d.ts": { - "version": "dc8a380122d258bdcbb6360f84e9c5439414201049a9bcb2aa06cc0579a3348d", - "signature": "dc8a380122d258bdcbb6360f84e9c5439414201049a9bcb2aa06cc0579a3348d", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/mimedocument.d.ts": { - "version": "1d24d23d670fbc3763013f9341a7a376499e8a4f2a35f24b008535d133101cd6", - "signature": "1d24d23d670fbc3763013f9341a7a376499e8a4f2a35f24b008535d133101cd6", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts": { - "version": "6b3aa0f1ec0fdf7230af21d0d08e33a3259e2d3d1a8a3340b626f26a1a8af4b5", - "signature": "6b3aa0f1ec0fdf7230af21d0d08e33a3259e2d3d1a8a3340b626f26a1a8af4b5", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/lib/model.d.ts": { - "version": "ef6fb1421cba8289b0308045d0b603f3bbb57b33dfe9945ec3360aef272a49fd", - "signature": "ef6fb1421cba8289b0308045d0b603f3bbb57b33dfe9945ec3360aef272a49fd", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/lib/widget.d.ts": { - "version": "e78ce364af7f56d75f8704a70c69ca31fb2cff5709fecb62735e28c13d102ef6", - "signature": "e78ce364af7f56d75f8704a70c69ca31fb2cff5709fecb62735e28c13d102ef6", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/lib/actions.d.ts": { - "version": "13f00230e08af0643e1efb1e89c37a69afbdffe26c28c885f19cf95e9dc18556", - "signature": "13f00230e08af0643e1efb1e89c37a69afbdffe26c28c885f19cf95e9dc18556", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/lib/panel.d.ts": { - "version": "30ef2b51d787ce550a72c55730bdd2de9f1f435bf42a92296ccc1fca8bd8f2f8", - "signature": "30ef2b51d787ce550a72c55730bdd2de9f1f435bf42a92296ccc1fca8bd8f2f8", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/lib/default-toolbar.d.ts": { - "version": "3cd5268590fc1921ce131aaa2486f9aca091bb631e3b245c2de47e24d0cc86d5", - "signature": "3cd5268590fc1921ce131aaa2486f9aca091bb631e3b245c2de47e24d0cc86d5", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/lib/modelfactory.d.ts": { - "version": "0df96dcec9bcf2635cf7817f3f43cf5249b97ab4daffa32d1aaf222e1c3f119d", - "signature": "0df96dcec9bcf2635cf7817f3f43cf5249b97ab4daffa32d1aaf222e1c3f119d", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/lib/modestatus.d.ts": { - "version": "7a94b2a471443d7d0ca8d9ae605b8844a53468d45b90c137724e17e415b86e48", - "signature": "7a94b2a471443d7d0ca8d9ae605b8844a53468d45b90c137724e17e415b86e48", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/lib/widgetfactory.d.ts": { - "version": "3ea8e0c1fec8b440fa321a67ea4deefbbe9af7a45d1eba4da9012684875f528f", - "signature": "3ea8e0c1fec8b440fa321a67ea4deefbbe9af7a45d1eba4da9012684875f528f", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/lib/tokens.d.ts": { - "version": "8e26e21b36bb3ae02718a699e0c7c4806a2501822fbb6b8f4307ccd598968114", - "signature": "8e26e21b36bb3ae02718a699e0c7c4806a2501822fbb6b8f4307ccd598968114", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/lib/notebooktools.d.ts": { - "version": "817f5010003b43b43aa5ab8f4e53da88b9fa51f2eab97f747f13903a9a571a55", - "signature": "817f5010003b43b43aa5ab8f4e53da88b9fa51f2eab97f747f13903a9a571a55", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/lib/tracker.d.ts": { - "version": "7db78794f7cf94112b3e5f7b6998f37cb4bec61c70aa1bed81f3bfe09c468127", - "signature": "7db78794f7cf94112b3e5f7b6998f37cb4bec61c70aa1bed81f3bfe09c468127", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/lib/truststatus.d.ts": { - "version": "53af8d78a71cf9e534e77e326a0c2c86189f8c569f207f5919e3f4217c3d6e35", - "signature": "53af8d78a71cf9e534e77e326a0c2c86189f8c569f207f5919e3f4217c3d6e35", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/settingregistry/lib/index.d.ts": { - "version": "178c7c98157f7910ea4e19771e26374ecfd552df7c35b1cda6cd9dcc03b32016", - "signature": "178c7c98157f7910ea4e19771e26374ecfd552df7c35b1cda6cd9dcc03b32016", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/lib/executionindicator.d.ts": { - "version": "c4aa24a6abc836ef7dd7c3ac6270db825bbf66d0794a8154f5b662824546c081", - "signature": "c4aa24a6abc836ef7dd7c3ac6270db825bbf66d0794a8154f5b662824546c081", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/notebook/lib/index.d.ts": { - "version": "078936d5384df6ce83182b459b6130299d80e4541f39ed295c11f09ca0ef8654", - "signature": "078936d5384df6ce83182b459b6130299d80e4541f39ed295c11f09ca0ef8654", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/services/lib/index.d.ts": { - "version": "3a8bab6cc1bee98448c5869f0ae38ab59a0651b533fdd9118ff23e02bc27ac4c", - "signature": "3a8bab6cc1bee98448c5869f0ae38ab59a0651b533fdd9118ff23e02bc27ac4c", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/coreutils/lib/json.d.ts": { - "version": "9d441989d1cbb52939625e57621620524bf19c3c223f01007941ecd10335d0d1", - "signature": "9d441989d1cbb52939625e57621620524bf19c3c223f01007941ecd10335d0d1", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/coreutils/lib/mime.d.ts": { - "version": "28e06b63c3f364ef754eedfb0cb0f5127011f3d685e102f07ff5c56aa87d1562", - "signature": "28e06b63c3f364ef754eedfb0cb0f5127011f3d685e102f07ff5c56aa87d1562", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/coreutils/lib/promise.d.ts": { - "version": "b0ee12813f8d26468aba1fd860db8180eb9e332183ad839dd554a2f19c8983cc", - "signature": "b0ee12813f8d26468aba1fd860db8180eb9e332183ad839dd554a2f19c8983cc", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/coreutils/lib/random.d.ts": { - "version": "b407b6761debdcd11022f0157535e7bc4977433fc09b6c188cd7c324ded64a5d", - "signature": "b407b6761debdcd11022f0157535e7bc4977433fc09b6c188cd7c324ded64a5d", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/coreutils/lib/token.d.ts": { - "version": "4873fe69c2bd7be609e6f3f033db4534b88735ff0769e18cb100cbf24f25e0f1", - "signature": "4873fe69c2bd7be609e6f3f033db4534b88735ff0769e18cb100cbf24f25e0f1", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/coreutils/lib/uuid.d.ts": { - "version": "094815f0e8d3c53c1b983debb0559cb347ad78142419654b6093ce285aa150cd", - "signature": "094815f0e8d3c53c1b983debb0559cb347ad78142419654b6093ce285aa150cd", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/coreutils/lib/index.d.ts": { - "version": "cc0fca544c9ee63d754899e93ebae35c8ba8304a100126b9c3dadee2c91a2250", - "signature": "cc0fca544c9ee63d754899e93ebae35c8ba8304a100126b9c3dadee2c91a2250", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/algorithm/lib/array.d.ts": { - "version": "5275faae938513e793a5ea551efa77b43a47bbfac8ed8550753ec217376f24ca", - "signature": "5275faae938513e793a5ea551efa77b43a47bbfac8ed8550753ec217376f24ca", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/algorithm/lib/iter.d.ts": { - "version": "b0fe7c947694eb4f0f736af28a853b0a8dc59074329a3d9a3eb5967fbe83c10d", - "signature": "b0fe7c947694eb4f0f736af28a853b0a8dc59074329a3d9a3eb5967fbe83c10d", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/algorithm/lib/chain.d.ts": { - "version": "5d3db7107b3138edf0ddb9851bbba99caeb6b3e32074da4c7b45e751c296183b", - "signature": "5d3db7107b3138edf0ddb9851bbba99caeb6b3e32074da4c7b45e751c296183b", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/algorithm/lib/empty.d.ts": { - "version": "b86137c60e0c62f7acfd8f0e761170bc6920c105ef03868c0518be562a5c5908", - "signature": "b86137c60e0c62f7acfd8f0e761170bc6920c105ef03868c0518be562a5c5908", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/algorithm/lib/enumerate.d.ts": { - "version": "7ba39fedc2104c6d69f7f583e10ced54256f8d8e42770c754097e75f041cfb7d", - "signature": "7ba39fedc2104c6d69f7f583e10ced54256f8d8e42770c754097e75f041cfb7d", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/algorithm/lib/filter.d.ts": { - "version": "69d5afc46850b54ef3388769cd339f8dc88e15cd74a189bf71dac3937b4e8850", - "signature": "69d5afc46850b54ef3388769cd339f8dc88e15cd74a189bf71dac3937b4e8850", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/algorithm/lib/find.d.ts": { - "version": "a8db70d3ad601f4cf3c779623a3ca232606db0c1d052cf3f1d7a3a695bcbd368", - "signature": "a8db70d3ad601f4cf3c779623a3ca232606db0c1d052cf3f1d7a3a695bcbd368", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/algorithm/lib/map.d.ts": { - "version": "6256ad6e7c41a9f9ecb6349b5d5be72ea2c60ba1c6c6b3954929eb59a6980688", - "signature": "6256ad6e7c41a9f9ecb6349b5d5be72ea2c60ba1c6c6b3954929eb59a6980688", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/algorithm/lib/range.d.ts": { - "version": "77596a948c8deffc8f059fa0f3c38688f3b05caefa303506074034b5cb1a56ae", - "signature": "77596a948c8deffc8f059fa0f3c38688f3b05caefa303506074034b5cb1a56ae", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/algorithm/lib/reduce.d.ts": { - "version": "81ef0fab583499ba45dab44490620e7b870597d90c5e562ec5a9b38b6bd3fcdf", - "signature": "81ef0fab583499ba45dab44490620e7b870597d90c5e562ec5a9b38b6bd3fcdf", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/algorithm/lib/repeat.d.ts": { - "version": "f2b309d4f1bdf8e9f4fa03bf2183eb1b2f7cb66efb5b16da52e378ce75ac17bb", - "signature": "f2b309d4f1bdf8e9f4fa03bf2183eb1b2f7cb66efb5b16da52e378ce75ac17bb", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/algorithm/lib/retro.d.ts": { - "version": "9cbaf0317ec49acb6c84d142077670a301015979260c4ecded7705fd2141379c", - "signature": "9cbaf0317ec49acb6c84d142077670a301015979260c4ecded7705fd2141379c", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/algorithm/lib/sort.d.ts": { - "version": "5a49d16b6f7d3ca5c66569784290c0ed7a3d74821095e2ab91e17ea444ac4657", - "signature": "5a49d16b6f7d3ca5c66569784290c0ed7a3d74821095e2ab91e17ea444ac4657", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/algorithm/lib/stride.d.ts": { - "version": "2e5fab5fe6e398cb14f695da07044a65f4e32c8d0fe9b31f5fe52d2cc7656230", - "signature": "2e5fab5fe6e398cb14f695da07044a65f4e32c8d0fe9b31f5fe52d2cc7656230", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/algorithm/lib/string.d.ts": { - "version": "92e581f3d154511056bfba03e72ed3cffa92681b4b9bb1953b0b724f67a664bc", - "signature": "92e581f3d154511056bfba03e72ed3cffa92681b4b9bb1953b0b724f67a664bc", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/algorithm/lib/take.d.ts": { - "version": "c9deb61903fd8318e6845e4e0f03b3bd813cdae1778f8dc9ee0ec05f9ca22094", - "signature": "c9deb61903fd8318e6845e4e0f03b3bd813cdae1778f8dc9ee0ec05f9ca22094", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/algorithm/lib/zip.d.ts": { - "version": "7bc3152a4c8adf395ad486da44acb6e8c98dedd2becc83810b076114338a5045", - "signature": "7bc3152a4c8adf395ad486da44acb6e8c98dedd2becc83810b076114338a5045", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/algorithm/lib/index.d.ts": { - "version": "30a8688575aeada46c1268d671b2a1de78705ebc0d5343e75b96c25f149caa98", - "signature": "30a8688575aeada46c1268d671b2a1de78705ebc0d5343e75b96c25f149caa98", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/signaling/lib/index.d.ts": { - "version": "e29b5eb559a057d36584ec480d49711f0c81bed176bb6256df584e800c453760", - "signature": "e29b5eb559a057d36584ec480d49711f0c81bed176bb6256df584e800c453760", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/disposable/lib/index.d.ts": { - "version": "57e52fd41767e09990c28cd092037736625b3c492c412d7b5c72282a4a97e2be", - "signature": "57e52fd41767e09990c28cd092037736625b3c492c412d7b5c72282a4a97e2be", - "affectsGlobalScope": false - }, - "./node_modules/@phosphor/commands/lib/index.d.ts": { - "version": "f7a4e242113dbee5fdbc1340ae8fa59fa1d92eeb41d3a9f2a7f34434036d8e87", - "signature": "f7a4e242113dbee5fdbc1340ae8fa59fa1d92eeb41d3a9f2a7f34434036d8e87", - "affectsGlobalScope": false - }, - "./src/utils.tsx": { - "version": "2c9b256291764b8302e67d67108264c203a5f756a7cfeb88464921b1d469c809", - "signature": "4b9ae1de92c1c4dbf0d32f6da024fbd09766ea77e84b9c1b15f87350f056eb50", - "affectsGlobalScope": false - }, - "./src/deepcoder.ts": { - "version": "cc07b558377b565ea6d7e77b1b283cc04c4b6056f652a0048e128b0964062723", - "signature": "7e43ebd937f263c39a2ec4b4e212d9c07a3ed393d4d65cd33fac73e955136038", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/docregistry/lib/index.d.ts": { - "version": "6b3aa0f1ec0fdf7230af21d0d08e33a3259e2d3d1a8a3340b626f26a1a8af4b5", - "signature": "6b3aa0f1ec0fdf7230af21d0d08e33a3259e2d3d1a8a3340b626f26a1a8af4b5", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/application/node_modules/@jupyterlab/services/lib/index.d.ts": { - "version": "3a8bab6cc1bee98448c5869f0ae38ab59a0651b533fdd9118ff23e02bc27ac4c", - "signature": "3a8bab6cc1bee98448c5869f0ae38ab59a0651b533fdd9118ff23e02bc27ac4c", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/application/node_modules/@jupyterlab/translation/lib/index.d.ts": { - "version": "c2d417bfcfb62ed2101db6175ea83f91b2656ada1397d4abaf8c7681c42fb534", - "signature": "c2d417bfcfb62ed2101db6175ea83f91b2656ada1397d4abaf8c7681c42fb534", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/application/lib/tokens.d.ts": { - "version": "4c8b8186eea5f23ac4f595a5bd4f0a90fa793614463839365ccd7494bc78c2e3", - "signature": "4c8b8186eea5f23ac4f595a5bd4f0a90fa793614463839365ccd7494bc78c2e3", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/application/lib/connectionlost.d.ts": { - "version": "4078af51a426601e46cedc694ee3d046b5a144397872dd3f245b9dddd204c8b4", - "signature": "4078af51a426601e46cedc694ee3d046b5a144397872dd3f245b9dddd204c8b4", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/application/node_modules/@jupyterlab/ui-components/lib/index.d.ts": { - "version": "66184a3fe0eea09816acbf62e64f9c3d19f00fdac46c7976c9befe99bd011e28", - "signature": "66184a3fe0eea09816acbf62e64f9c3d19f00fdac46c7976c9befe99bd011e28", - "affectsGlobalScope": false - }, - "./node_modules/@lumino/application/types/index.d.ts": { - "version": "5f2c0f5bcc2db43de123def0b1fe6ca19d861b451aa667636c6668070aa5636d", - "signature": "5f2c0f5bcc2db43de123def0b1fe6ca19d861b451aa667636c6668070aa5636d", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/application/lib/frontend.d.ts": { - "version": "2f998d6192bce7db4a38c2181ab866baec5bd7c0556260cec3a11c9448301c87", - "signature": "2f998d6192bce7db4a38c2181ab866baec5bd7c0556260cec3a11c9448301c87", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts": { - "version": "e871d5517e2c9dc5d7231ff614975ac84cdee84eb48c4529cdb4b681b5db5836", - "signature": "e871d5517e2c9dc5d7231ff614975ac84cdee84eb48c4529cdb4b681b5db5836", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/application/lib/shell.d.ts": { - "version": "795b1357388c2d0135d791c4eb659e931a194f4766f1c292dd93da2c3258584c", - "signature": "795b1357388c2d0135d791c4eb659e931a194f4766f1c292dd93da2c3258584c", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/application/lib/status.d.ts": { - "version": "af17ba3c526d6accdcc34e4bbfed20b7be4fff205f3ca2bc2f807ebc26ea9869", - "signature": "af17ba3c526d6accdcc34e4bbfed20b7be4fff205f3ca2bc2f807ebc26ea9869", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/application/lib/lab.d.ts": { - "version": "490066b713c0e71d51d3aa67fb919cf86c1c88dc9bf2838333b240ee6e23a1bf", - "signature": "490066b713c0e71d51d3aa67fb919cf86c1c88dc9bf2838333b240ee6e23a1bf", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/application/node_modules/@jupyterlab/statedb/lib/index.d.ts": { - "version": "cc935329b723e345e8118454fde946f73b69f40086589d11f25513137075720a", - "signature": "cc935329b723e345e8118454fde946f73b69f40086589d11f25513137075720a", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/application/lib/layoutrestorer.d.ts": { - "version": "150993204fbad3e04ca6b0248f4498324aaa0984a9a31cc3a41fe5a394ce1575", - "signature": "150993204fbad3e04ca6b0248f4498324aaa0984a9a31cc3a41fe5a394ce1575", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/application/lib/mimerenderers.d.ts": { - "version": "1ee23b8511d85cf68fbeec018d4f60d2d12b337ca3ea528c0ee69b54c3fe891a", - "signature": "1ee23b8511d85cf68fbeec018d4f60d2d12b337ca3ea528c0ee69b54c3fe891a", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/application/lib/router.d.ts": { - "version": "9516b24464fc256e9099edc0104165a845ca0762e622bd643486313c46767f31", - "signature": "9516b24464fc256e9099edc0104165a845ca0762e622bd643486313c46767f31", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/application/lib/treepathupdater.d.ts": { - "version": "becb1ba9752bab39612cd77eaf3140cca067ff0a1e651dc2b1242caf007e08b0", - "signature": "becb1ba9752bab39612cd77eaf3140cca067ff0a1e651dc2b1242caf007e08b0", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/application/lib/index.d.ts": { - "version": "810d840d5ace94f74be1ff4c3783debe8e58432772038c355eb7736cf971a8b4", - "signature": "810d840d5ace94f74be1ff4c3783debe8e58432772038c355eb7736cf971a8b4", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/settingregistry/lib/index.d.ts": { - "version": "178c7c98157f7910ea4e19771e26374ecfd552df7c35b1cda6cd9dcc03b32016", - "signature": "178c7c98157f7910ea4e19771e26374ecfd552df7c35b1cda6cd9dcc03b32016", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/statedb/lib/index.d.ts": { - "version": "cc935329b723e345e8118454fde946f73b69f40086589d11f25513137075720a", - "signature": "cc935329b723e345e8118454fde946f73b69f40086589d11f25513137075720a", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/translation/lib/tokens.d.ts": { - "version": "c97410aab3860667c54e48ab4f751222911f8887202df5c11b61868009d4ff14", - "signature": "c97410aab3860667c54e48ab4f751222911f8887202df5c11b61868009d4ff14", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/translation/lib/base.d.ts": { - "version": "7e80cbd62318016cfedfd4ccb53f930b4abe7f4b6bc4673fd8ec44f9de6243e2", - "signature": "7e80cbd62318016cfedfd4ccb53f930b4abe7f4b6bc4673fd8ec44f9de6243e2", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/translation/lib/gettext.d.ts": { - "version": "ba9e2a7e215602ba81103f3f2c7cdb3457e48e1b8fb96dae3af9873e12821f40", - "signature": "ba9e2a7e215602ba81103f3f2c7cdb3457e48e1b8fb96dae3af9873e12821f40", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/translation/lib/manager.d.ts": { - "version": "e527ab52c64b2db062a12f22ec2050608b99b8b08cc5397fd869ae66bc441fdc", - "signature": "e527ab52c64b2db062a12f22ec2050608b99b8b08cc5397fd869ae66bc441fdc", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/translation/lib/server.d.ts": { - "version": "e2bfb86488150c78cea78c2b726a3bd81c9a2053a5d56916beed898d4dc7f5b5", - "signature": "e2bfb86488150c78cea78c2b726a3bd81c9a2053a5d56916beed898d4dc7f5b5", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/translation/lib/index.d.ts": { - "version": "c2d417bfcfb62ed2101db6175ea83f91b2656ada1397d4abaf8c7681c42fb534", - "signature": "c2d417bfcfb62ed2101db6175ea83f91b2656ada1397d4abaf8c7681c42fb534", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/components/button/buttons.d.ts": { - "version": "aed5c2f80124fcda53b6fe13b187fbf45979c931504b534601c8ea3ce9b2adba", - "signature": "aed5c2f80124fcda53b6fe13b187fbf45979c931504b534601c8ea3ce9b2adba", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/components/collapse/collapse.d.ts": { - "version": "8822d39d94eec0ce799e13cf2412680fd3238fb0059f05c6bf5f077f8ba9df72", - "signature": "8822d39d94eec0ce799e13cf2412680fd3238fb0059f05c6bf5f077f8ba9df72", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/components/forms/controls.d.ts": { - "version": "521ee48f7b1eef1cd4bcfee470204c69b35a08f6e9ddffd8bbb77957c13c83b1", - "signature": "521ee48f7b1eef1cd4bcfee470204c69b35a08f6e9ddffd8bbb77957c13c83b1", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/components/forms/inputGroup.d.ts": { - "version": "d50d9194e32d5435de6ea7d7732f7ad87317857e07e75efb114d9af8d7c10564", - "signature": "d50d9194e32d5435de6ea7d7732f7ad87317857e07e75efb114d9af8d7c10564", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/select/lib/cjs/components/select/select.d.ts": { - "version": "2be90eb05dc17ec0f6dbe4439c3170e907d0d7601d3bfe5c164cf7a7e93c6275", - "signature": "2be90eb05dc17ec0f6dbe4439c3170e907d0d7601d3bfe5c164cf7a7e93c6275", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/common/intent.d.ts": { - "version": "843fbd11bfa2082344b49c439a938f6f0cb3a185eb68acfde43f672b093b8558", - "signature": "843fbd11bfa2082344b49c439a938f6f0cb3a185eb68acfde43f672b093b8558", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/lib/blueprint.d.ts": { - "version": "76e27a82abcc42653aec48ff050d6235a62a3eb0d5c6c4c2f5f09bdc8fb79807", - "signature": "76e27a82abcc42653aec48ff050d6235a62a3eb0d5c6c4c2f5f09bdc8fb79807", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/lib/style/icon.d.ts": { - "version": "72197af93cb407921c0db36a7c187588c10f994e7924d2ec722004843c226e2d", - "signature": "72197af93cb407921c0db36a7c187588c10f994e7924d2ec722004843c226e2d", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/lib/style/index.d.ts": { - "version": "aecf31d8843eecf4011a77ba692a68ba8da0241653a39cd275310eed2ab1649d", - "signature": "aecf31d8843eecf4011a77ba692a68ba8da0241653a39cd275310eed2ab1649d", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/lib/icon/labicon.d.ts": { - "version": "bfef935156b81c081b0e58da269d50db594c6229eb9d90622858274d92358700", - "signature": "bfef935156b81c081b0e58da269d50db594c6229eb9d90622858274d92358700", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/lib/icon/iconimports.d.ts": { - "version": "ba782fc53d5fef0d97580dd4ef24ada4a9bc3491574f4fe67fb35dd03d8cf7f5", - "signature": "ba782fc53d5fef0d97580dd4ef24ada4a9bc3491574f4fe67fb35dd03d8cf7f5", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/commandpalettesvg.d.ts": { - "version": "b19f59a453f22453e4735e0b9fee2089fabebddfdd0b0fedab0409e3a2da63ca", - "signature": "b19f59a453f22453e4735e0b9fee2089fabebddfdd0b0fedab0409e3a2da63ca", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/menusvg.d.ts": { - "version": "f080a7a3aaa9eb07e4b0c38c0ecdb3a409bdb5f827479a4402acfed6111763a7", - "signature": "f080a7a3aaa9eb07e4b0c38c0ecdb3a409bdb5f827479a4402acfed6111763a7", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/tabbarsvg.d.ts": { - "version": "18d7e87e181c54ce296d7d86c03cc4a4adbfc8a647a57d966bef31e02857b994", - "signature": "18d7e87e181c54ce296d7d86c03cc4a4adbfc8a647a57d966bef31e02857b994", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/index.d.ts": { - "version": "d17f7a001dae13ded8536376f9319169a4c53e0e3789756e2058d0f4b4083a19", - "signature": "d17f7a001dae13ded8536376f9319169a4c53e0e3789756e2058d0f4b4083a19", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/lib/icon/index.d.ts": { - "version": "ba42ed466e271511af20653ef52792fc270ae38c2a897c60249efdb5258f22a8", - "signature": "ba42ed466e271511af20653ef52792fc270ae38c2a897c60249efdb5258f22a8", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/lib/components/interface.d.ts": { - "version": "db3efaf54928d3b92c0e80f1da14e03b49e20272e90158beae18ac9891207798", - "signature": "db3efaf54928d3b92c0e80f1da14e03b49e20272e90158beae18ac9891207798", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/lib/components/htmlselect.d.ts": { - "version": "cb82c1784b85fe06df3a5bdbebf3e27e68ed9e6e0086014db89adf3954596661", - "signature": "cb82c1784b85fe06df3a5bdbebf3e27e68ed9e6e0086014db89adf3954596661", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/lib/components/menu.d.ts": { - "version": "5d88c7751a2e431303eb7537734d90c8441831d976a45fe015afbc3a387f0458", - "signature": "5d88c7751a2e431303eb7537734d90c8441831d976a45fe015afbc3a387f0458", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/coreutils/lib/index.d.ts": { - "version": "7a7fa32e403e381e681ef4984c9dc22adf0d32c1e4b7ad9fd5c6552412c855f0", - "signature": "7a7fa32e403e381e681ef4984c9dc22adf0d32c1e4b7ad9fd5c6552412c855f0", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/lib/components/switch.d.ts": { - "version": "f930cec87b27939416f5d933c8ae49e83827def3c4d6a7b842ee414892dbe873", - "signature": "f930cec87b27939416f5d933c8ae49e83827def3c4d6a7b842ee414892dbe873", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/lib/components/index.d.ts": { - "version": "490333f51a29f5a720d3dcd58912c8456231e17965ccbbd29aedf1d84823e56c", - "signature": "490333f51a29f5a720d3dcd58912c8456231e17965ccbbd29aedf1d84823e56c", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/lib/tokens.d.ts": { - "version": "f5f4eed847f0556304760c3beacdcb13a5e0410339897204eedc0b193d4b2d2b", - "signature": "f5f4eed847f0556304760c3beacdcb13a5e0410339897204eedc0b193d4b2d2b", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/lib/utils.d.ts": { - "version": "3bdcbc4d71a64f44368a69a02566a9c2357381e162f588eeb51ea610abb4766d", - "signature": "3bdcbc4d71a64f44368a69a02566a9c2357381e162f588eeb51ea610abb4766d", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/lib/FormComponentRegistry.d.ts": { - "version": "45549b824965f21bae5bc4de5b6e5996441352a8dddf4890af6e6d4f206429b8", - "signature": "45549b824965f21bae5bc4de5b6e5996441352a8dddf4890af6e6d4f206429b8", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts": { - "version": "66184a3fe0eea09816acbf62e64f9c3d19f00fdac46c7976c9befe99bd011e28", - "signature": "66184a3fe0eea09816acbf62e64f9c3d19f00fdac46c7976c9befe99bd011e28", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/mainmenu/lib/file.d.ts": { - "version": "68971500a53074392e969901d99880afb79252d3052fa94073362b107ccba122", - "signature": "68971500a53074392e969901d99880afb79252d3052fa94073362b107ccba122", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/mainmenu/lib/help.d.ts": { - "version": "2011a315387e3cadeef9a80c19827a302986aab5b32ace6f2ba2f90ccdb66c02", - "signature": "2011a315387e3cadeef9a80c19827a302986aab5b32ace6f2ba2f90ccdb66c02", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/mainmenu/lib/kernel.d.ts": { - "version": "1a39638ccdf5f5ab0e68976686544d3185b15078ea505e3266b9431277e0115c", - "signature": "1a39638ccdf5f5ab0e68976686544d3185b15078ea505e3266b9431277e0115c", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/mainmenu/lib/run.d.ts": { - "version": "3cec249c686e93b82723c95ce8b0e3ff59567f296e9cbbee6c3384f5ea1a0739", - "signature": "3cec249c686e93b82723c95ce8b0e3ff59567f296e9cbbee6c3384f5ea1a0739", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/mainmenu/lib/settings.d.ts": { - "version": "09c6720b20043c2dec11f252035eaa0772ee5acc0e132e3c8c4b5794d3053b59", - "signature": "09c6720b20043c2dec11f252035eaa0772ee5acc0e132e3c8c4b5794d3053b59", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/mainmenu/lib/tabs.d.ts": { - "version": "b9b65827d6fe43cc748d063251cecba81f22ac8cca144792fbdec8604b394246", - "signature": "b9b65827d6fe43cc748d063251cecba81f22ac8cca144792fbdec8604b394246", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/mainmenu/lib/view.d.ts": { - "version": "9f3d461dba33e9232898f0dd57163b23f010f6f53f8f141f3244588288952e81", - "signature": "9f3d461dba33e9232898f0dd57163b23f010f6f53f8f141f3244588288952e81", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/mainmenu/lib/tokens.d.ts": { - "version": "052a36e0f359478111e90bad5443d457ab8f54123d3fa9fb47f71abd11928b56", - "signature": "052a36e0f359478111e90bad5443d457ab8f54123d3fa9fb47f71abd11928b56", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/mainmenu/lib/edit.d.ts": { - "version": "ef7c739b08067843ea8bd14048929309cf39d32e88e2947c693d57e92bf9af3f", - "signature": "ef7c739b08067843ea8bd14048929309cf39d32e88e2947c693d57e92bf9af3f", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/mainmenu/lib/mainmenu.d.ts": { - "version": "fd36a8fd23b92e73a6a46b0a82c5169d444ea22a3a726b5ef60a79bd3aa394a2", - "signature": "fd36a8fd23b92e73a6a46b0a82c5169d444ea22a3a726b5ef60a79bd3aa394a2", - "affectsGlobalScope": false - }, - "./node_modules/@jupyterlab/mainmenu/lib/index.d.ts": { - "version": "ff1fffb7dcbcd38ea6815514dca45561be5b76587ffede5c1c3ab1fcb2bec624", - "signature": "ff1fffb7dcbcd38ea6815514dca45561be5b76587ffede5c1c3ab1fcb2bec624", - "affectsGlobalScope": false - }, - "./src/index.ts": { - "version": "1ac7cf4b220395cc1f4ba5704a34fdff21e9efef8ebc3ddadb3243e3a4064ddc", - "signature": "6bc762dae22dc8fea9376401edf817d1146e303e04fd4b479c902af21a79b4be", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/assert.d.ts": { - "version": "9122ed7070e054b73ebab37c2373a196def2d90e7d1a9a7fcd9d46b0e51fae78", - "signature": "9122ed7070e054b73ebab37c2373a196def2d90e7d1a9a7fcd9d46b0e51fae78", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/assert/strict.d.ts": { - "version": "a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a", - "signature": "a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/globals.d.ts": { - "version": "77f0b5c6a193a699c9f7d7fb0578e64e562d271afa740783665d2a827104a873", - "signature": "77f0b5c6a193a699c9f7d7fb0578e64e562d271afa740783665d2a827104a873", - "affectsGlobalScope": true - }, - "./node_modules/@types/node/async_hooks.d.ts": { - "version": "21a167fec8f933752fb8157f06d28fab6817af3ad9b0bdb1908a10762391eab9", - "signature": "21a167fec8f933752fb8157f06d28fab6817af3ad9b0bdb1908a10762391eab9", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/buffer.d.ts": { - "version": "002d6d5f044365b3fbfba0ba9be3bb57cac09b81547c8df4b0795755d2081d90", - "signature": "002d6d5f044365b3fbfba0ba9be3bb57cac09b81547c8df4b0795755d2081d90", - "affectsGlobalScope": true - }, - "./node_modules/@types/node/child_process.d.ts": { - "version": "0c0cee62cb619aed81133b904f644515ba3064487002a7da83fd8aa07b1b4abd", - "signature": "0c0cee62cb619aed81133b904f644515ba3064487002a7da83fd8aa07b1b4abd", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/cluster.d.ts": { - "version": "5a94487653355b56018122d92392beb2e5f4a6c63ba5cef83bbe1c99775ef713", - "signature": "5a94487653355b56018122d92392beb2e5f4a6c63ba5cef83bbe1c99775ef713", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/console.d.ts": { - "version": "d5135ad93b33adcce80b18f8065087934cdc1730d63db58562edcf017e1aad9b", - "signature": "d5135ad93b33adcce80b18f8065087934cdc1730d63db58562edcf017e1aad9b", - "affectsGlobalScope": true - }, - "./node_modules/@types/node/constants.d.ts": { - "version": "82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4", - "signature": "82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/crypto.d.ts": { - "version": "c4cfc9a6e2ebb8bc8c0e2392dfc4056993ced3b35069ebf132ac18ca7a562881", - "signature": "c4cfc9a6e2ebb8bc8c0e2392dfc4056993ced3b35069ebf132ac18ca7a562881", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/dgram.d.ts": { - "version": "bb9c4ffa5e6290c6980b63c815cdd1625876dadb2efaf77edbe82984be93e55e", - "signature": "bb9c4ffa5e6290c6980b63c815cdd1625876dadb2efaf77edbe82984be93e55e", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/diagnostics_channel.d.ts": { - "version": "75ecef44f126e2ae018b4abbd85b6e8a2e2ba1638ebec56cc64274643ce3567b", - "signature": "75ecef44f126e2ae018b4abbd85b6e8a2e2ba1638ebec56cc64274643ce3567b", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/dns.d.ts": { - "version": "f30bb836526d930a74593f7b0f5c1c46d10856415a8f69e5e2fc3db80371e362", - "signature": "f30bb836526d930a74593f7b0f5c1c46d10856415a8f69e5e2fc3db80371e362", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/dns/promises.d.ts": { - "version": "14b5aa23c5d0ae1907bc696ac7b6915d88f7d85799cc0dc2dcf98fbce2c5a67c", - "signature": "14b5aa23c5d0ae1907bc696ac7b6915d88f7d85799cc0dc2dcf98fbce2c5a67c", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/domain.d.ts": { - "version": "5c439dafdc09abe4d6c260a96b822fa0ba5be7203c71a63ab1f1423cd9e838ea", - "signature": "5c439dafdc09abe4d6c260a96b822fa0ba5be7203c71a63ab1f1423cd9e838ea", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/events.d.ts": { - "version": "bae4ea23beb8397755b935cb84d3cdc6cdb0b1b4a329b90de9fc6c8774d71994", - "signature": "bae4ea23beb8397755b935cb84d3cdc6cdb0b1b4a329b90de9fc6c8774d71994", - "affectsGlobalScope": true - }, - "./node_modules/@types/node/fs.d.ts": { - "version": "cec36af22f514322f870e81d30675c78df82ae8bf4863f5fd4e4424c040c678d", - "signature": "cec36af22f514322f870e81d30675c78df82ae8bf4863f5fd4e4424c040c678d", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/fs/promises.d.ts": { - "version": "df36874d9e56aff601e921c4b3971d37cf66d14f6455935ce821e6cad13b1823", - "signature": "df36874d9e56aff601e921c4b3971d37cf66d14f6455935ce821e6cad13b1823", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/http.d.ts": { - "version": "68915895d4a136df5cf5f90aaa41d8e1e47ec047e7781a150b5d0cf273dbb7a9", - "signature": "68915895d4a136df5cf5f90aaa41d8e1e47ec047e7781a150b5d0cf273dbb7a9", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/http2.d.ts": { - "version": "1abb206a4ecd13b21536b677d7d5f66e0d7316f0d44610197cfcc5776f78884a", - "signature": "1abb206a4ecd13b21536b677d7d5f66e0d7316f0d44610197cfcc5776f78884a", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/https.d.ts": { - "version": "09416dd69576b03a3f485adf329a02f043e4a481e060ef5b208194e488d31fd9", - "signature": "09416dd69576b03a3f485adf329a02f043e4a481e060ef5b208194e488d31fd9", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/inspector.d.ts": { - "version": "2c828a5405191d006115ab34e191b8474bc6c86ffdc401d1a9864b1b6e088a58", - "signature": "2c828a5405191d006115ab34e191b8474bc6c86ffdc401d1a9864b1b6e088a58", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/module.d.ts": { - "version": "e8b18c6385ff784228a6f369694fcf1a6b475355ba89090a88de13587a9391d5", - "signature": "e8b18c6385ff784228a6f369694fcf1a6b475355ba89090a88de13587a9391d5", - "affectsGlobalScope": true - }, - "./node_modules/@types/node/net.d.ts": { - "version": "76527127c8b749bee5977408861ce3ee56ec19ddcea8704c628f98ca610283e6", - "signature": "76527127c8b749bee5977408861ce3ee56ec19ddcea8704c628f98ca610283e6", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/os.d.ts": { - "version": "a907bf91df26df2400858ef75f749498fb5cf00062bf90a737ac3949cc07978d", - "signature": "a907bf91df26df2400858ef75f749498fb5cf00062bf90a737ac3949cc07978d", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/path.d.ts": { - "version": "cb92bc2e42b261e4299025756f1beb826b3d9666a3f0d46f8a7254ca512f57e4", - "signature": "cb92bc2e42b261e4299025756f1beb826b3d9666a3f0d46f8a7254ca512f57e4", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/perf_hooks.d.ts": { - "version": "cb4f3f03480e1727eae46400606cecaa97f550186ff8fa909ebc00db4180531b", - "signature": "cb4f3f03480e1727eae46400606cecaa97f550186ff8fa909ebc00db4180531b", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/process.d.ts": { - "version": "b3624aed92dab6da8484280d3cb3e2f4130ec3f4ef3f8201c95144ae9e898bb6", - "signature": "b3624aed92dab6da8484280d3cb3e2f4130ec3f4ef3f8201c95144ae9e898bb6", - "affectsGlobalScope": true - }, - "./node_modules/@types/node/punycode.d.ts": { - "version": "5153a2fd150e46ce57bb3f8db1318d33f6ad3261ed70ceeff92281c0608c74a3", - "signature": "5153a2fd150e46ce57bb3f8db1318d33f6ad3261ed70ceeff92281c0608c74a3", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/querystring.d.ts": { - "version": "d1a78a3c5708807e8de3e399f91df4797c62e44b02195eefc2209b2e713e54ee", - "signature": "d1a78a3c5708807e8de3e399f91df4797c62e44b02195eefc2209b2e713e54ee", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/readline.d.ts": { - "version": "36b03690b628eab08703d63f04eaa89c5df202e5f1edf3989f13ad389cd2c091", - "signature": "36b03690b628eab08703d63f04eaa89c5df202e5f1edf3989f13ad389cd2c091", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/readline/promises.d.ts": { - "version": "0effadd232a20498b11308058e334d3339cc5bf8c4c858393e38d9d4c0013dcf", - "signature": "0effadd232a20498b11308058e334d3339cc5bf8c4c858393e38d9d4c0013dcf", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/repl.d.ts": { - "version": "25846d43937c672bab7e8195f3d881f93495df712ee901860effc109918938cc", - "signature": "25846d43937c672bab7e8195f3d881f93495df712ee901860effc109918938cc", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/stream.d.ts": { - "version": "556bf5c36deb62cffa1bf697c1789fe008ec82db0273025001db66732714e9d9", - "signature": "556bf5c36deb62cffa1bf697c1789fe008ec82db0273025001db66732714e9d9", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/stream/promises.d.ts": { - "version": "1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff", - "signature": "1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/stream/consumers.d.ts": { - "version": "806ef4cac3b3d9fa4a48d849c8e084d7c72fcd7b16d76e06049a9ed742ff79c0", - "signature": "806ef4cac3b3d9fa4a48d849c8e084d7c72fcd7b16d76e06049a9ed742ff79c0", - "affectsGlobalScope": true - }, - "./node_modules/@types/node/stream/web.d.ts": { - "version": "44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5", - "signature": "44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/string_decoder.d.ts": { - "version": "23b89798789dffbd437c0c423f5d02d11f9736aea73d6abf16db4f812ff36eda", - "signature": "23b89798789dffbd437c0c423f5d02d11f9736aea73d6abf16db4f812ff36eda", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/test.d.ts": { - "version": "0830071706fa0e477fb5e95f0955cc1062b5948b146b7d4e03a126f12ad6085f", - "signature": "0830071706fa0e477fb5e95f0955cc1062b5948b146b7d4e03a126f12ad6085f", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/timers.d.ts": { - "version": "970a90f76d4d219ad60819d61f5994514087ba94c985647a3474a5a3d12714ed", - "signature": "970a90f76d4d219ad60819d61f5994514087ba94c985647a3474a5a3d12714ed", - "affectsGlobalScope": true - }, - "./node_modules/@types/node/timers/promises.d.ts": { - "version": "664d8f2d59164f2e08c543981453893bc7e003e4dfd29651ce09db13e9457980", - "signature": "664d8f2d59164f2e08c543981453893bc7e003e4dfd29651ce09db13e9457980", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/tls.d.ts": { - "version": "4c8525f256873c7ba3135338c647eaf0ca7115a1a2805ae2d0056629461186ce", - "signature": "4c8525f256873c7ba3135338c647eaf0ca7115a1a2805ae2d0056629461186ce", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/trace_events.d.ts": { - "version": "3c13ef48634e7b5012fcf7e8fce7496352c2d779a7201389ca96a2a81ee4314d", - "signature": "3c13ef48634e7b5012fcf7e8fce7496352c2d779a7201389ca96a2a81ee4314d", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/tty.d.ts": { - "version": "5d0a25ec910fa36595f85a67ac992d7a53dd4064a1ba6aea1c9f14ab73a023f2", - "signature": "5d0a25ec910fa36595f85a67ac992d7a53dd4064a1ba6aea1c9f14ab73a023f2", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/url.d.ts": { - "version": "bfe39beb986d2a2e512c091cbe924f1c415bc65de54de0e2f6a0dc6f84c183d9", - "signature": "bfe39beb986d2a2e512c091cbe924f1c415bc65de54de0e2f6a0dc6f84c183d9", - "affectsGlobalScope": true - }, - "./node_modules/@types/node/util.d.ts": { - "version": "2d526e6f21d8cc66ac11ada32874e95ae88d870c6c9d3d9d4e03b1d1f9ad7b8e", - "signature": "2d526e6f21d8cc66ac11ada32874e95ae88d870c6c9d3d9d4e03b1d1f9ad7b8e", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/v8.d.ts": { - "version": "06d7c42d256f0ce6afe1b2b6cfbc97ab391f29dadb00dd0ae8e8f23f5bc916c3", - "signature": "06d7c42d256f0ce6afe1b2b6cfbc97ab391f29dadb00dd0ae8e8f23f5bc916c3", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/vm.d.ts": { - "version": "ec4bd1b200670fb567920db572d6701ed42a9641d09c4ff6869768c8f81b404c", - "signature": "ec4bd1b200670fb567920db572d6701ed42a9641d09c4ff6869768c8f81b404c", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/wasi.d.ts": { - "version": "e59a892d87e72733e2a9ca21611b9beb52977be2696c7ba4b216cbbb9a48f5aa", - "signature": "e59a892d87e72733e2a9ca21611b9beb52977be2696c7ba4b216cbbb9a48f5aa", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/worker_threads.d.ts": { - "version": "d2ec52f565f0570e90b659811347bd689f8c6039b11eaaccd0f243759d46da6e", - "signature": "d2ec52f565f0570e90b659811347bd689f8c6039b11eaaccd0f243759d46da6e", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/zlib.d.ts": { - "version": "8a300fa9b698845a1f9c41ecbe2c5966634582a8e2020d51abcace9b55aa959e", - "signature": "8a300fa9b698845a1f9c41ecbe2c5966634582a8e2020d51abcace9b55aa959e", - "affectsGlobalScope": false - }, - "./node_modules/@types/node/globals.global.d.ts": { - "version": "ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e", - "signature": "ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e", - "affectsGlobalScope": true - }, - "./node_modules/@types/node/index.d.ts": { - "version": "a12806a1bde5e9f137bb79728d87a4ceaedf04e95efc9967d3288a3c252d9a7b", - "signature": "a12806a1bde5e9f137bb79728d87a4ceaedf04e95efc9967d3288a3c252d9a7b", - "affectsGlobalScope": false - } - }, - "options": { - "allowSyntheticDefaultImports": true, - "composite": true, - "declaration": true, - "esModuleInterop": true, - "incremental": true, - "jsx": 2, - "module": 99, - "moduleResolution": 2, - "noEmitOnError": true, - "noImplicitAny": true, - "noUnusedLocals": true, - "preserveWatchOutput": true, - "resolveJsonModule": true, - "outDir": "./lib", - "rootDir": "./src", - "strict": true, - "strictNullChecks": true, - "target": 4, - "types": [ - "node" - ], - "watch": true, - "configFilePath": "./tsconfig.json" - }, - "referencedMap": { - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractComponent.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractComponent2.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractPureComponent.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractPureComponent2.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/alignment.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/boundary.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/classes.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/alignment.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/elevation.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/intent.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/position.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/colors.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/configureDom4.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/constructor.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/elevation.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/index.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractComponent.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractComponent2.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractPureComponent.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractPureComponent2.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/alignment.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/boundary.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/classes.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/colors.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/constructor.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/elevation.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/intent.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/keys.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/position.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/refs.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/intent.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/keys.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/position.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/props.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/intent.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/refs.d.ts", - "./node_modules/@blueprintjs/icons/lib/esm/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/refs.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/compareUtils.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/domUtils.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/functionUtils.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/index.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/refs.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/compareUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/domUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/functionUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/isDarkTheme.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/jsUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/reactUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/safeInvokeMember.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/isDarkTheme.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/configureDom4.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/jsUtils.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/reactUtils.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/safeInvokeMember.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/components/button/abstractButton.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/icon/icon.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/components/button/buttons.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/refs.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/button/abstractButton.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/components/collapse/collapse.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/components/forms/controls.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/components/forms/inputGroup.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/icon/icon.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/components/icon/icon.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/index.d.ts", - "./node_modules/@blueprintjs/icons/lib/esm/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/accessibility/focusStyleManager.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/accessibility/index.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/accessibility/focusStyleManager.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/abstractComponent.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/abstractComponent2.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/abstractPureComponent.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/abstractPureComponent2.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/alignment.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/boundary.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/classes.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/alignment.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/elevation.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/intent.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/position.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/colors.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/configureDom4.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/constructor.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/context.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/elevation.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/abstractComponent.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/abstractComponent2.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/abstractPureComponent.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/abstractPureComponent2.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/alignment.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/boundary.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/classes.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/colors.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/constructor.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/elevation.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/intent.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/keys.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/position.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/refs.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/intent.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/keys.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/position.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/intent.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/refs.d.ts", - "./node_modules/@blueprintjs/icons/lib/esm/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/refs.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/utils/compareUtils.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/utils/domUtils.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/utils/functionUtils.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/utils/index.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/refs.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/compareUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/domUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/functionUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/isDarkTheme.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/jsUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/reactUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/safeInvokeMember.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/utils/isDarkTheme.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/configureDom4.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/utils/jsUtils.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/utils/reactUtils.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/utils/safeInvokeMember.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/alert/alert.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/overlay/overlay.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/breadcrumbs/breadcrumb.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/breadcrumbs/breadcrumbs.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/breadcrumbs/breadcrumb.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/overflow-list/overflowList.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popover.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/button/abstractButton.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/button/buttonGroup.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/button/buttons.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/refs.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/button/abstractButton.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/callout/callout.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/card/card.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/collapse/collapse.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/collapsible-list/collapsibleList.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/boundary.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menuItem.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popover.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/context-menu/contextMenu.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/context-menu/contextMenuTarget.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/constructor.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/dialog.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/overlay/overlay.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/dialogStep.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/button/buttons.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/multistepDialog.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/button/buttons.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/dialog.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/dialogStep.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/divider/divider.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/drawer/drawer.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/position.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/overlay/overlay.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/editable-text/editableText.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/forms/controlGroup.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/forms/controls.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/forms/fileInput.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/forms/formGroup.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/forms/inputGroup.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/forms/numericInput.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/icons/lib/esm/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/forms/radioGroup.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/forms/textArea.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkey.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/hooks/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeyParser.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeys.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTypes.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysDialog.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkey.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysDialog2.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/dialog.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/hooks/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysEvents.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkey.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeyParser.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTypes.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTarget.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/constructor.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysEvents.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTypes.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTarget2.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/hooks/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTypes.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/index.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkey.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeyParser.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeys.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysDialog.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysDialog2.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTarget.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTarget2.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTypes.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/keyCombo.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/keyCombo.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/html-select/htmlSelect.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/html-table/htmlTable.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/html/html.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/icons/lib/esm/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/index.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/configureDom4.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/alert/alert.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/breadcrumbs/breadcrumb.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/breadcrumbs/breadcrumbs.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/button/buttonGroup.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/button/buttons.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/callout/callout.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/card/card.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/collapse/collapse.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/collapsible-list/collapsibleList.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/context-menu/contextMenu.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/context-menu/contextMenuTarget.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/dialog.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/dialogStep.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/multistepDialog.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/divider/divider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/drawer/drawer.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/editable-text/editableText.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/controlGroup.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/controls.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/fileInput.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/formGroup.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/inputGroup.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/numericInput.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/radioGroup.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/textArea.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/html-select/htmlSelect.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/html-table/htmlTable.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/html/html.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menu.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menuDivider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menuItem.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbar.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarDivider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarGroup.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarHeading.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/non-ideal-state/nonIdealState.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/overflow-list/overflowList.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/overlay/overlay.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack/panelProps.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack/panelStack.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack2/panelStack2.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack2/panelTypes.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popover.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popoverSharedProps.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/portal/portal.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/progress-bar/progressBar.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/resize-sensor/resizeObserverTypes.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/resize-sensor/resizeSensor.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/slider/handleProps.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/slider/multiSlider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/slider/rangeSlider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/slider/slider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/spinner/spinner.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tabs/tab.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tabs/tabs.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tag-input/tagInput.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tag/tag.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/text/text.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/toast/toast.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/toast/toaster.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tooltip/tooltip.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tree/tree.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tree/treeNode.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menu.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menuDivider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menuItem.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menuDivider.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menuItem.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popover.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbar.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarDivider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarGroup.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarHeading.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarDivider.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarGroup.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarHeading.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/non-ideal-state/nonIdealState.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/overflow-list/overflowList.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/boundary.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/overlay/overlay.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack/panelProps.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack/panelStack.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack/panelProps.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack2/panelStack2.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack2/panelTypes.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack2/panelTypes.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popover.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popoverSharedProps.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popoverSharedProps.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/overlay/overlay.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts", - "./node_modules/popper.js/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/portal/portal.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/context.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/progress-bar/progressBar.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/resize-sensor/resizeObserverTypes.d.ts": [ - "./node_modules/@juggle/resize-observer/lib/DOMRectReadOnly.d.ts", - "./node_modules/@juggle/resize-observer/lib/exports/resize-observer.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/resize-sensor/resizeSensor.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@juggle/resize-observer/lib/exports/resize-observer.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/slider/handleProps.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/slider/multiSlider.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/slider/handleProps.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/slider/rangeSlider.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/slider/multiSlider.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/slider/slider.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/slider/multiSlider.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/spinner/spinner.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/tabs/tab.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/tabs/tabs.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tabs/tab.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/tag-input/tagInput.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tag/tag.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/tag/tag.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/text/text.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/toast/toast.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/toast/toaster.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/toast/toast.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/tooltip/tooltip.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popover.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popoverSharedProps.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/tree/tree.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tree/treeNode.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/tree/treeNode.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/context/hotkeys/hotkeysProvider.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysDialog2.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/hooks/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/context/index.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/context/hotkeys/hotkeysProvider.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/hooks/hotkeys/hotkeyConfig.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/hooks/hotkeys/useHotkeys.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/hooks/hotkeys/hotkeyConfig.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/hooks/index.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/hooks/hotkeys/hotkeyConfig.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/hooks/hotkeys/useHotkeys.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/index.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/accessibility/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/context/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/hooks/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/icons/lib/esm/generated/iconContents.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/icons/lib/esm/generated/iconNames.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/icons/lib/esm/generated/iconSvgPaths.d.ts": [ - "./node_modules/@blueprintjs/icons/lib/esm/iconName.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/icons/lib/esm/iconName.d.ts": [ - "./node_modules/@blueprintjs/icons/lib/esm/generated/iconNames.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/icons/lib/esm/index.d.ts": [ - "./node_modules/@blueprintjs/icons/lib/esm/generated/iconContents.d.ts", - "./node_modules/@blueprintjs/icons/lib/esm/generated/iconNames.d.ts", - "./node_modules/@blueprintjs/icons/lib/esm/generated/iconSvgPaths.d.ts", - "./node_modules/@blueprintjs/icons/lib/esm/iconName.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/select/lib/cjs/common/classes.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/select/lib/cjs/common/index.d.ts": [ - "./node_modules/@blueprintjs/select/lib/cjs/common/classes.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/itemListRenderer.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/itemRenderer.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/listItemsProps.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/listItemsUtils.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/predicate.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/select/lib/cjs/common/itemListRenderer.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/index.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/listItemsUtils.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/select/lib/cjs/common/itemRenderer.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/select/lib/cjs/common/listItemsProps.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/index.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/itemListRenderer.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/itemRenderer.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/listItemsUtils.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/predicate.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/select/lib/cjs/common/listItemsUtils.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/select/lib/cjs/common/predicate.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/select/lib/cjs/components/select/select.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/index.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@juggle/resize-observer/lib/DOMRectReadOnly.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@juggle/resize-observer/lib/ResizeObserver.d.ts": [ - "./node_modules/@juggle/resize-observer/lib/ResizeObserverCallback.d.ts", - "./node_modules/@juggle/resize-observer/lib/ResizeObserverOptions.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@juggle/resize-observer/lib/ResizeObserverBoxOptions.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@juggle/resize-observer/lib/ResizeObserverCallback.d.ts": [ - "./node_modules/@juggle/resize-observer/lib/ResizeObserver.d.ts", - "./node_modules/@juggle/resize-observer/lib/ResizeObserverEntry.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@juggle/resize-observer/lib/ResizeObserverEntry.d.ts": [ - "./node_modules/@juggle/resize-observer/lib/DOMRectReadOnly.d.ts", - "./node_modules/@juggle/resize-observer/lib/ResizeObserverSize.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@juggle/resize-observer/lib/ResizeObserverOptions.d.ts": [ - "./node_modules/@juggle/resize-observer/lib/ResizeObserverBoxOptions.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@juggle/resize-observer/lib/ResizeObserverSize.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@juggle/resize-observer/lib/exports/resize-observer.d.ts": [ - "./node_modules/@juggle/resize-observer/lib/ResizeObserver.d.ts", - "./node_modules/@juggle/resize-observer/lib/ResizeObserverEntry.d.ts", - "./node_modules/@juggle/resize-observer/lib/ResizeObserverSize.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/lib/connectionlost.d.ts": [ - "./node_modules/@jupyterlab/application/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/lib/frontend.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/application/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/lib/index.d.ts": [ - "./node_modules/@jupyterlab/application/lib/connectionlost.d.ts", - "./node_modules/@jupyterlab/application/lib/frontend.d.ts", - "./node_modules/@jupyterlab/application/lib/lab.d.ts", - "./node_modules/@jupyterlab/application/lib/layoutrestorer.d.ts", - "./node_modules/@jupyterlab/application/lib/mimerenderers.d.ts", - "./node_modules/@jupyterlab/application/lib/router.d.ts", - "./node_modules/@jupyterlab/application/lib/shell.d.ts", - "./node_modules/@jupyterlab/application/lib/status.d.ts", - "./node_modules/@jupyterlab/application/lib/tokens.d.ts", - "./node_modules/@jupyterlab/application/lib/treepathupdater.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/lib/lab.d.ts": [ - "./node_modules/@jupyterlab/application/lib/frontend.d.ts", - "./node_modules/@jupyterlab/application/lib/shell.d.ts", - "./node_modules/@jupyterlab/application/lib/status.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/lib/layoutrestorer.d.ts": [ - "./node_modules/@jupyterlab/application/lib/shell.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/index.d.ts", - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/lib/mimerenderers.d.ts": [ - "./node_modules/@jupyterlab/application/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/lib/router.d.ts": [ - "./node_modules/@jupyterlab/application/lib/tokens.d.ts", - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/lib/shell.d.ts": [ - "./node_modules/@jupyterlab/application/lib/frontend.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/lib/status.d.ts": [ - "./node_modules/@jupyterlab/application/lib/frontend.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/lib/tokens.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/lib/treepathupdater.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/node_modules/@jupyterlab/services/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/builder/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/config/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/contents/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/nbconvert/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/setting/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/workspace/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/node_modules/@jupyterlab/statedb/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/dataconnector.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/interfaces.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/restorablepool.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/statedb.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/node_modules/@jupyterlab/translation/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/base.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/gettext.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/server.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/node_modules/@jupyterlab/ui-components/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/FormComponentRegistry.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/blueprint.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/utils.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/apputils/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/clipboard.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/collapse.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/commandlinker.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/commandpalette.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/dialog.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/domutils.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/hoverbox.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/iframe.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/inputdialog.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/kernelstatuses.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/mainareawidget.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/menufactory.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/printing.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sanitizer.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/search.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sessioncontext.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/spinner.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/splash.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/styling.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/thememanager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/vdom.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/widgettracker.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/windowresolver.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/attachments/lib/index.d.ts": [ - "./node_modules/@jupyterlab/attachments/lib/model.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/attachments/lib/model.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/attachments/node_modules/@jupyterlab/nbformat/lib/index.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/attachments/node_modules/@jupyterlab/observables/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/modeldb.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablejson.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablelist.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablemap.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablestring.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/undoablelist.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/attachments/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/attachments/node_modules/@jupyterlab/rendermime/lib/index.d.ts": [ - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/attachmentmodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/factories.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/latex.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/mimemodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/outputmodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/registry.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/renderers.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/tokens.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/widgets.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/lib/celldragutils.d.ts": [ - "./node_modules/@jupyterlab/cells/lib/widget.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/lib/collapser.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/cells/lib/headerfooter.d.ts": [ - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/lib/celldragutils.d.ts", - "./node_modules/@jupyterlab/cells/lib/collapser.d.ts", - "./node_modules/@jupyterlab/cells/lib/headerfooter.d.ts", - "./node_modules/@jupyterlab/cells/lib/inputarea.d.ts", - "./node_modules/@jupyterlab/cells/lib/model.d.ts", - "./node_modules/@jupyterlab/cells/lib/placeholder.d.ts", - "./node_modules/@jupyterlab/cells/lib/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/lib/inputarea.d.ts": [ - "./node_modules/@jupyterlab/cells/lib/model.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/lib/model.d.ts": [ - "./node_modules/@jupyterlab/attachments/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/lib/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/lib/placeholder.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/cells/lib/widget.d.ts": [ - "./node_modules/@jupyterlab/cells/lib/headerfooter.d.ts", - "./node_modules/@jupyterlab/cells/lib/inputarea.d.ts", - "./node_modules/@jupyterlab/cells/lib/model.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/clipboard.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/collapse.d.ts": [ - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/commandlinker.d.ts": [ - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/commandpalette.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/dialog.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/widgettracker.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/domutils.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/hoverbox.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/iframe.d.ts": [ - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/clipboard.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/collapse.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/commandlinker.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/commandpalette.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/dialog.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/domutils.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/hoverbox.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/iframe.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/inputdialog.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/kernelstatuses.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/mainareawidget.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/menufactory.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/printing.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sanitizer.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/search.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sessioncontext.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/spinner.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/splash.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/styling.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/thememanager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/vdom.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/widgettracker.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/windowresolver.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/inputdialog.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/dialog.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/kernelstatuses.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sessioncontext.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/mainareawidget.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/printing.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/menufactory.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/printing.d.ts": [ - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sanitizer.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/search.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/vdom.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sessioncontext.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/spinner.d.ts": [ - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/splash.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/styling.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/thememanager.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/splash.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/tokens.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sessioncontext.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/factory.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/widget.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/factory.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/registry.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/registry.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/tokens.d.ts", - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/widget.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sessioncontext.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/vdom.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/vdom.d.ts": [ - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/widgettracker.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/windowresolver.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/editor.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/factory.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/editor.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/editor.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/factory.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/jsoneditor.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/mimetype.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/jsoneditor.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/editor.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/mimetype.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/tokens.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/factory.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/mimetype.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/widget.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/activitymonitor.d.ts": [ - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/activitymonitor.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/interfaces.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/markdowncodeblocks.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/pageconfig.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/path.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/text.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/time.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/url.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/interfaces.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/markdowncodeblocks.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/pageconfig.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/path.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/text.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/time.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/url.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/modeldb.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablejson.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablelist.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablemap.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablestring.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/undoablelist.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/modeldb.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablejson.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablemap.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablestring.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/undoablelist.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablejson.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablemap.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablelist.d.ts": [ - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablemap.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/modeldb.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablestring.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/modeldb.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/undoablelist.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablelist.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/rendermime/lib/index.d.ts": [ - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/attachmentmodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/factories.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/latex.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/mimemodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/outputmodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/registry.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/renderers.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/tokens.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/widgets.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/basemanager.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/builder/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/config/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/contents/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/builder/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/config/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/contents/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/nbconvert/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/setting/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/workspace/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/default.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/kernel.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/messages.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/default.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/kernel.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/messages.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/restapi.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/kernel.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/basemanager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/messages.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/restapi.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/index.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/manager.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/basemanager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/kernel.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/restapi.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/polling/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/messages.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/restapi.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/kernelspec.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/restapi.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/kernelspec.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/basemanager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/restapi.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/manager.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/basemanager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/kernelspec.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/restapi.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@lumino/polling/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/restapi.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/manager.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/builder/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/contents/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/nbconvert/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/setting/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/workspace/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/polling/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/nbconvert/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/restapi.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/session.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/manager.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/basemanager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/session.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/polling/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/restapi.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/session.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/index.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/setting/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/restapi.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/terminal.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/manager.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/basemanager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/terminal.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/polling/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/restapi.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/terminal.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/basemanager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/restapi.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/workspace/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/settingregistry.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/settingregistry.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/tokens.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/settingregistry.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/api.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/api.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/utils.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/ymodels.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/utils.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/api.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/index.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/ymodels.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/api.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/y-protocols/awareness.d.ts", - "./node_modules/yjs/dist/src/index.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/dataconnector.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/interfaces.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/dataconnector.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/interfaces.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/restorablepool.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/statedb.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/interfaces.d.ts": [ - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/restorablepool.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/interfaces.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/statedb.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/interfaces.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/tokens.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/tokens.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/interfaces.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/base.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/gettext.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/base.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/gettext.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/server.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/manager.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/server.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/tokens.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/FormComponentRegistry.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@rjsf/core/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/blueprint.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/intent.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/button/buttons.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/collapse/collapse.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/forms/controls.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/forms/inputGroup.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/components/select/select.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/htmlselect.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/interface.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/htmlselect.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/interface.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/menu.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/switch.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/interface.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/menu.d.ts": [ - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/switch.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/iconimports.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/labicon.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/iconimports.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/labicon.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/labicon.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/style/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/commandpalettesvg.d.ts": [ - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/commandpalettesvg.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/menusvg.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/tabbarsvg.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/menusvg.d.ts": [ - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/tabbarsvg.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/FormComponentRegistry.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/blueprint.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/utils.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/style/icon.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/typestyle/lib/types.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/style/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/style/icon.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/tokens.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/utils.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/coreutils/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/activitymonitor.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/interfaces.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/markdowncodeblocks.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/pageconfig.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/path.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/text.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/time.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/url.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/docregistry/lib/index.d.ts": [ - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/context.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/default.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/mimedocument.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/registry.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/mainmenu/lib/edit.d.ts": [ - "./node_modules/@jupyterlab/mainmenu/lib/tokens.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/mainmenu/lib/file.d.ts": [ - "./node_modules/@jupyterlab/mainmenu/lib/tokens.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/mainmenu/lib/help.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/tokens.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/mainmenu/lib/index.d.ts": [ - "./node_modules/@jupyterlab/mainmenu/lib/edit.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/file.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/help.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/kernel.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/mainmenu.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/run.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/settings.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/tabs.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/tokens.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/view.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/mainmenu/lib/kernel.d.ts": [ - "./node_modules/@jupyterlab/mainmenu/lib/tokens.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/mainmenu/lib/mainmenu.d.ts": [ - "./node_modules/@jupyterlab/mainmenu/lib/edit.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/file.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/help.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/kernel.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/run.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/settings.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/tabs.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/tokens.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/view.d.ts", - "./node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/mainmenu/lib/run.d.ts": [ - "./node_modules/@jupyterlab/mainmenu/lib/tokens.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/mainmenu/lib/settings.d.ts": [ - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/mainmenu/lib/tabs.d.ts": [ - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/mainmenu/lib/tokens.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/edit.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/file.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/help.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/kernel.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/run.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/settings.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/tabs.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/view.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/mainmenu/lib/view.d.ts": [ - "./node_modules/@jupyterlab/mainmenu/lib/tokens.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/actions.d.ts": [ - "./node_modules/@jupyterlab/cells/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/widget.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/default-toolbar.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/panel.d.ts", - "./node_modules/@jupyterlab/notebook/lib/widget.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/executionindicator.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/panel.d.ts", - "./node_modules/@jupyterlab/notebook/lib/widget.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/index.d.ts": [ - "./node_modules/@jupyterlab/notebook/lib/actions.d.ts", - "./node_modules/@jupyterlab/notebook/lib/default-toolbar.d.ts", - "./node_modules/@jupyterlab/notebook/lib/executionindicator.d.ts", - "./node_modules/@jupyterlab/notebook/lib/model.d.ts", - "./node_modules/@jupyterlab/notebook/lib/modelfactory.d.ts", - "./node_modules/@jupyterlab/notebook/lib/modestatus.d.ts", - "./node_modules/@jupyterlab/notebook/lib/notebooktools.d.ts", - "./node_modules/@jupyterlab/notebook/lib/panel.d.ts", - "./node_modules/@jupyterlab/notebook/lib/tokens.d.ts", - "./node_modules/@jupyterlab/notebook/lib/tracker.d.ts", - "./node_modules/@jupyterlab/notebook/lib/truststatus.d.ts", - "./node_modules/@jupyterlab/notebook/lib/widget.d.ts", - "./node_modules/@jupyterlab/notebook/lib/widgetfactory.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/model.d.ts": [ - "./node_modules/@jupyterlab/cells/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/modelfactory.d.ts": [ - "./node_modules/@jupyterlab/cells/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/model.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/modestatus.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/notebooktools.d.ts": [ - "./node_modules/@jupyterlab/cells/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/panel.d.ts", - "./node_modules/@jupyterlab/notebook/lib/tokens.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/panel.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/model.d.ts", - "./node_modules/@jupyterlab/notebook/lib/widget.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/tokens.d.ts": [ - "./node_modules/@jupyterlab/cells/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/notebooktools.d.ts", - "./node_modules/@jupyterlab/notebook/lib/panel.d.ts", - "./node_modules/@jupyterlab/notebook/lib/widgetfactory.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/tracker.d.ts": [ - "./node_modules/@jupyterlab/cells/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/panel.d.ts", - "./node_modules/@jupyterlab/notebook/lib/tokens.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/truststatus.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/widget.d.ts": [ - "./node_modules/@jupyterlab/cells/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/model.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/widgetfactory.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/model.d.ts", - "./node_modules/@jupyterlab/notebook/lib/panel.d.ts", - "./node_modules/@jupyterlab/notebook/lib/widget.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/codeeditor/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/editor.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/factory.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/jsoneditor.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/mimetype.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/coreutils/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/activitymonitor.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/interfaces.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/markdowncodeblocks.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/pageconfig.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/path.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/text.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/time.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/url.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/awareness.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/index.d.ts": [ - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/awareness.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/mock.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/tokens.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/yprovider.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/mock.d.ts": [ - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/tokens.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/yprovider.d.ts": [ - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/y-websocket/dist/src/y-websocket.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/context.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/registry.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/default.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts": [ - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/context.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/default.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/mimedocument.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/registry.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/mimedocument.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/default.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/registry.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/registry.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/nbformat/lib/index.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/observables/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/modeldb.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablejson.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablelist.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablemap.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablestring.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/undoablelist.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/rendermime/lib/index.d.ts": [ - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/attachmentmodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/factories.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/latex.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/mimemodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/outputmodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/registry.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/renderers.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/tokens.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/widgets.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/services/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/builder/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/config/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/contents/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/nbconvert/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/setting/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/workspace/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/settingregistry/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/settingregistry.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/shared-models/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/api.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/utils.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/ymodels.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/translation/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/base.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/gettext.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/server.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/ui-components/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/FormComponentRegistry.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/blueprint.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/utils.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/lib/index.d.ts": [ - "./node_modules/@jupyterlab/outputarea/lib/model.d.ts", - "./node_modules/@jupyterlab/outputarea/lib/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/lib/model.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/lib/widget.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/lib/model.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/apputils/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/clipboard.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/collapse.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/commandlinker.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/commandpalette.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/dialog.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/domutils.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/hoverbox.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/iframe.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/inputdialog.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/kernelstatuses.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/mainareawidget.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/menufactory.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/printing.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sanitizer.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/search.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sessioncontext.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/spinner.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/splash.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/styling.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/thememanager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/vdom.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/widgettracker.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/windowresolver.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/nbformat/lib/index.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/observables/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/modeldb.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablejson.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablelist.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablemap.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablestring.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/undoablelist.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/attachmentmodel.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/factories.d.ts": [ - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/index.d.ts": [ - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/attachmentmodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/factories.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/latex.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/mimemodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/outputmodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/registry.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/renderers.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/tokens.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/widgets.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/latex.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/mimemodel.d.ts": [ - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/outputmodel.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/registry.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/mimemodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/tokens.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/renderers.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/tokens.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/mimemodel.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/widgets.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/services/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/builder/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/config/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/contents/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/nbconvert/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/setting/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/workspace/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/translation/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/base.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/gettext.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/server.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/services/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/builder/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/config/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/contents/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/nbconvert/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/setting/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/workspace/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/settingregistry/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/settingregistry.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/statedb/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/dataconnector.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/interfaces.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/restorablepool.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/statedb.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/translation/lib/base.d.ts": [ - "./node_modules/@jupyterlab/translation/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/translation/lib/gettext.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/translation/lib/index.d.ts": [ - "./node_modules/@jupyterlab/translation/lib/base.d.ts", - "./node_modules/@jupyterlab/translation/lib/gettext.d.ts", - "./node_modules/@jupyterlab/translation/lib/manager.d.ts", - "./node_modules/@jupyterlab/translation/lib/server.d.ts", - "./node_modules/@jupyterlab/translation/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/translation/lib/manager.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/translation/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/translation/lib/server.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/translation/lib/tokens.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/FormComponentRegistry.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@rjsf/core/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/blueprint.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/intent.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/button/buttons.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/collapse/collapse.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/forms/controls.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/forms/inputGroup.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/components/select/select.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/components/htmlselect.d.ts": [ - "./node_modules/@jupyterlab/ui-components/lib/components/interface.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/icon/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/components/index.d.ts": [ - "./node_modules/@jupyterlab/ui-components/lib/components/htmlselect.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/components/interface.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/components/menu.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/components/switch.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/components/interface.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/components/menu.d.ts": [ - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/components/switch.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/icon/iconimports.d.ts": [ - "./node_modules/@jupyterlab/ui-components/lib/icon/labicon.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/icon/index.d.ts": [ - "./node_modules/@jupyterlab/ui-components/lib/icon/iconimports.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/icon/labicon.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/icon/labicon.d.ts": [ - "./node_modules/@jupyterlab/ui-components/lib/style/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/commandpalettesvg.d.ts": [ - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/index.d.ts": [ - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/commandpalettesvg.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/menusvg.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/tabbarsvg.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/menusvg.d.ts": [ - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/tabbarsvg.d.ts": [ - "./node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts": [ - "./node_modules/@jupyterlab/ui-components/lib/FormComponentRegistry.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/blueprint.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/components/index.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/icon/index.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/tokens.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/utils.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/style/icon.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/typestyle/lib/types.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/style/index.d.ts": [ - "./node_modules/@jupyterlab/ui-components/lib/style/icon.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/tokens.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/utils.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/common/intent.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/components/button/buttons.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/refs.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/button/abstractButton.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/components/collapse/collapse.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/components/forms/controls.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/components/forms/inputGroup.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/icon/icon.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/select/lib/cjs/components/select/select.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/index.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@lumino/algorithm/types/array.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/algorithm/types/chain.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/algorithm/types/empty.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/algorithm/types/enumerate.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/algorithm/types/filter.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/algorithm/types/find.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/algorithm/types/index.d.ts": [ - "./node_modules/@lumino/algorithm/types/array.d.ts", - "./node_modules/@lumino/algorithm/types/chain.d.ts", - "./node_modules/@lumino/algorithm/types/empty.d.ts", - "./node_modules/@lumino/algorithm/types/enumerate.d.ts", - "./node_modules/@lumino/algorithm/types/filter.d.ts", - "./node_modules/@lumino/algorithm/types/find.d.ts", - "./node_modules/@lumino/algorithm/types/iter.d.ts", - "./node_modules/@lumino/algorithm/types/map.d.ts", - "./node_modules/@lumino/algorithm/types/range.d.ts", - "./node_modules/@lumino/algorithm/types/reduce.d.ts", - "./node_modules/@lumino/algorithm/types/repeat.d.ts", - "./node_modules/@lumino/algorithm/types/retro.d.ts", - "./node_modules/@lumino/algorithm/types/sort.d.ts", - "./node_modules/@lumino/algorithm/types/stride.d.ts", - "./node_modules/@lumino/algorithm/types/string.d.ts", - "./node_modules/@lumino/algorithm/types/take.d.ts", - "./node_modules/@lumino/algorithm/types/zip.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/algorithm/types/iter.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/algorithm/types/map.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/algorithm/types/range.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/algorithm/types/reduce.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/algorithm/types/repeat.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/algorithm/types/retro.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/algorithm/types/sort.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/algorithm/types/stride.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/algorithm/types/string.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/algorithm/types/take.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/algorithm/types/zip.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/application/types/index.d.ts": [ - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/commands/types/index.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/coreutils/types/index.common.d.ts": [ - "./node_modules/@lumino/coreutils/types/json.d.ts", - "./node_modules/@lumino/coreutils/types/mime.d.ts", - "./node_modules/@lumino/coreutils/types/promise.d.ts", - "./node_modules/@lumino/coreutils/types/token.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/coreutils/types/index.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.common.d.ts", - "./node_modules/@lumino/coreutils/types/random.browser.d.ts", - "./node_modules/@lumino/coreutils/types/uuid.browser.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/coreutils/types/json.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/coreutils/types/mime.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/coreutils/types/promise.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/coreutils/types/random.browser.d.ts": [ - "./node_modules/@lumino/coreutils/types/random.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/coreutils/types/random.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/coreutils/types/token.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/coreutils/types/uuid.browser.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/disposable/types/index.d.ts": [ - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/messaging/types/index.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/polling/types/index.d.ts": [ - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/polling/types/poll.d.ts", - "./node_modules/@lumino/polling/types/ratelimiter.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/polling/types/poll.d.ts": [ - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/polling/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/polling/types/ratelimiter.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/polling/types/index.d.ts", - "./node_modules/@lumino/polling/types/poll.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/signaling/types/index.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/virtualdom/types/index.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/accordionlayout.d.ts": [ - "./node_modules/@lumino/widgets/types/splitlayout.d.ts", - "./node_modules/@lumino/widgets/types/title.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/accordionpanel.d.ts": [ - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/accordionlayout.d.ts", - "./node_modules/@lumino/widgets/types/splitlayout.d.ts", - "./node_modules/@lumino/widgets/types/splitpanel.d.ts", - "./node_modules/@lumino/widgets/types/title.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/boxengine.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/boxlayout.d.ts": [ - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/panellayout.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/boxpanel.d.ts": [ - "./node_modules/@lumino/widgets/types/boxlayout.d.ts", - "./node_modules/@lumino/widgets/types/panel.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/commandpalette.d.ts": [ - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/contextmenu.d.ts": [ - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/widgets/types/menu.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/docklayout.d.ts": [ - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/layout.d.ts", - "./node_modules/@lumino/widgets/types/tabbar.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/dockpanel.d.ts": [ - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/docklayout.d.ts", - "./node_modules/@lumino/widgets/types/tabbar.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/focustracker.d.ts": [ - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/gridlayout.d.ts": [ - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/layout.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/index.d.ts": [ - "./node_modules/@lumino/widgets/types/accordionlayout.d.ts", - "./node_modules/@lumino/widgets/types/accordionpanel.d.ts", - "./node_modules/@lumino/widgets/types/boxengine.d.ts", - "./node_modules/@lumino/widgets/types/boxlayout.d.ts", - "./node_modules/@lumino/widgets/types/boxpanel.d.ts", - "./node_modules/@lumino/widgets/types/commandpalette.d.ts", - "./node_modules/@lumino/widgets/types/contextmenu.d.ts", - "./node_modules/@lumino/widgets/types/docklayout.d.ts", - "./node_modules/@lumino/widgets/types/dockpanel.d.ts", - "./node_modules/@lumino/widgets/types/focustracker.d.ts", - "./node_modules/@lumino/widgets/types/gridlayout.d.ts", - "./node_modules/@lumino/widgets/types/layout.d.ts", - "./node_modules/@lumino/widgets/types/menu.d.ts", - "./node_modules/@lumino/widgets/types/menubar.d.ts", - "./node_modules/@lumino/widgets/types/panel.d.ts", - "./node_modules/@lumino/widgets/types/panellayout.d.ts", - "./node_modules/@lumino/widgets/types/scrollbar.d.ts", - "./node_modules/@lumino/widgets/types/singletonlayout.d.ts", - "./node_modules/@lumino/widgets/types/splitlayout.d.ts", - "./node_modules/@lumino/widgets/types/splitpanel.d.ts", - "./node_modules/@lumino/widgets/types/stackedlayout.d.ts", - "./node_modules/@lumino/widgets/types/stackedpanel.d.ts", - "./node_modules/@lumino/widgets/types/tabbar.d.ts", - "./node_modules/@lumino/widgets/types/tabpanel.d.ts", - "./node_modules/@lumino/widgets/types/title.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/layout.d.ts": [ - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/menu.d.ts": [ - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/menubar.d.ts": [ - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@lumino/widgets/types/menu.d.ts", - "./node_modules/@lumino/widgets/types/title.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/panel.d.ts": [ - "./node_modules/@lumino/widgets/types/panellayout.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/panellayout.d.ts": [ - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/widgets/types/layout.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/scrollbar.d.ts": [ - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/singletonlayout.d.ts": [ - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/widgets/types/layout.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/splitlayout.d.ts": [ - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/panellayout.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/splitpanel.d.ts": [ - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/panel.d.ts", - "./node_modules/@lumino/widgets/types/splitlayout.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/stackedlayout.d.ts": [ - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/layout.d.ts", - "./node_modules/@lumino/widgets/types/panellayout.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/stackedpanel.d.ts": [ - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/panel.d.ts", - "./node_modules/@lumino/widgets/types/stackedlayout.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/tabbar.d.ts": [ - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@lumino/widgets/types/title.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/tabpanel.d.ts": [ - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/stackedpanel.d.ts", - "./node_modules/@lumino/widgets/types/tabbar.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/title.d.ts": [ - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/widget.d.ts": [ - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/layout.d.ts", - "./node_modules/@lumino/widgets/types/title.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/array.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/chain.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/empty.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/enumerate.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/filter.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/find.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/index.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/array.d.ts", - "./node_modules/@phosphor/algorithm/lib/chain.d.ts", - "./node_modules/@phosphor/algorithm/lib/empty.d.ts", - "./node_modules/@phosphor/algorithm/lib/enumerate.d.ts", - "./node_modules/@phosphor/algorithm/lib/filter.d.ts", - "./node_modules/@phosphor/algorithm/lib/find.d.ts", - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@phosphor/algorithm/lib/map.d.ts", - "./node_modules/@phosphor/algorithm/lib/range.d.ts", - "./node_modules/@phosphor/algorithm/lib/reduce.d.ts", - "./node_modules/@phosphor/algorithm/lib/repeat.d.ts", - "./node_modules/@phosphor/algorithm/lib/retro.d.ts", - "./node_modules/@phosphor/algorithm/lib/sort.d.ts", - "./node_modules/@phosphor/algorithm/lib/stride.d.ts", - "./node_modules/@phosphor/algorithm/lib/string.d.ts", - "./node_modules/@phosphor/algorithm/lib/take.d.ts", - "./node_modules/@phosphor/algorithm/lib/zip.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/iter.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/map.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/range.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/reduce.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/repeat.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/retro.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/sort.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/stride.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/string.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/take.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/zip.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/commands/lib/index.d.ts": [ - "./node_modules/@phosphor/coreutils/lib/index.d.ts", - "./node_modules/@phosphor/disposable/lib/index.d.ts", - "./node_modules/@phosphor/signaling/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/coreutils/lib/index.d.ts": [ - "./node_modules/@phosphor/coreutils/lib/json.d.ts", - "./node_modules/@phosphor/coreutils/lib/mime.d.ts", - "./node_modules/@phosphor/coreutils/lib/promise.d.ts", - "./node_modules/@phosphor/coreutils/lib/random.d.ts", - "./node_modules/@phosphor/coreutils/lib/token.d.ts", - "./node_modules/@phosphor/coreutils/lib/uuid.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/coreutils/lib/json.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/coreutils/lib/mime.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/coreutils/lib/promise.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/coreutils/lib/random.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/coreutils/lib/token.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/coreutils/lib/uuid.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/disposable/lib/index.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/index.d.ts", - "./node_modules/@phosphor/signaling/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/signaling/lib/index.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@rjsf/core/index.d.ts": [ - "./node_modules/@rjsf/core/index.d.ts", - "./node_modules/@types/json-schema/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@types/json-schema/index.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/assert.d.ts": [ - "./node_modules/@types/node/assert.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/assert/strict.d.ts": [ - "./node_modules/@types/node/assert.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/async_hooks.d.ts": [ - "./node_modules/@types/node/async_hooks.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/buffer.d.ts": [ - "./node_modules/@types/node/buffer.d.ts", - "./node_modules/@types/node/crypto.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/child_process.d.ts": [ - "./node_modules/@types/node/child_process.d.ts", - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/fs.d.ts", - "./node_modules/@types/node/net.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/url.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/cluster.d.ts": [ - "./node_modules/@types/node/child_process.d.ts", - "./node_modules/@types/node/cluster.d.ts", - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/net.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/console.d.ts": [ - "./node_modules/@types/node/console.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/constants.d.ts": [ - "./node_modules/@types/node/constants.d.ts", - "./node_modules/@types/node/crypto.d.ts", - "./node_modules/@types/node/fs.d.ts", - "./node_modules/@types/node/os.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/crypto.d.ts": [ - "./node_modules/@types/node/crypto.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/tls.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/dgram.d.ts": [ - "./node_modules/@types/node/dgram.d.ts", - "./node_modules/@types/node/dns.d.ts", - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/net.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/diagnostics_channel.d.ts": [ - "./node_modules/@types/node/diagnostics_channel.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/dns.d.ts": [ - "./node_modules/@types/node/dns.d.ts", - "./node_modules/@types/node/dns/promises.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/dns/promises.d.ts": [ - "./node_modules/@types/node/dns.d.ts", - "./node_modules/@types/node/dns/promises.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/domain.d.ts": [ - "./node_modules/@types/node/domain.d.ts", - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/events.d.ts": [ - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/fs.d.ts": [ - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/fs.d.ts", - "./node_modules/@types/node/fs/promises.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/url.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/fs/promises.d.ts": [ - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/fs.d.ts", - "./node_modules/@types/node/fs/promises.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/stream/web.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/globals.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/node/worker_threads.d.ts" - ], - "./node_modules/@types/node/globals.global.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/http.d.ts": [ - "./node_modules/@types/node/http.d.ts", - "./node_modules/@types/node/net.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/url.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/http2.d.ts": [ - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/fs.d.ts", - "./node_modules/@types/node/http.d.ts", - "./node_modules/@types/node/http2.d.ts", - "./node_modules/@types/node/net.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/tls.d.ts", - "./node_modules/@types/node/url.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/https.d.ts": [ - "./node_modules/@types/node/http.d.ts", - "./node_modules/@types/node/https.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/tls.d.ts", - "./node_modules/@types/node/url.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/index.d.ts": [ - "./node_modules/@types/node/assert.d.ts", - "./node_modules/@types/node/assert/strict.d.ts", - "./node_modules/@types/node/async_hooks.d.ts", - "./node_modules/@types/node/buffer.d.ts", - "./node_modules/@types/node/child_process.d.ts", - "./node_modules/@types/node/cluster.d.ts", - "./node_modules/@types/node/console.d.ts", - "./node_modules/@types/node/constants.d.ts", - "./node_modules/@types/node/crypto.d.ts", - "./node_modules/@types/node/dgram.d.ts", - "./node_modules/@types/node/diagnostics_channel.d.ts", - "./node_modules/@types/node/dns.d.ts", - "./node_modules/@types/node/dns/promises.d.ts", - "./node_modules/@types/node/domain.d.ts", - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/fs.d.ts", - "./node_modules/@types/node/fs/promises.d.ts", - "./node_modules/@types/node/globals.d.ts", - "./node_modules/@types/node/globals.global.d.ts", - "./node_modules/@types/node/http.d.ts", - "./node_modules/@types/node/http2.d.ts", - "./node_modules/@types/node/https.d.ts", - "./node_modules/@types/node/inspector.d.ts", - "./node_modules/@types/node/module.d.ts", - "./node_modules/@types/node/net.d.ts", - "./node_modules/@types/node/os.d.ts", - "./node_modules/@types/node/path.d.ts", - "./node_modules/@types/node/perf_hooks.d.ts", - "./node_modules/@types/node/process.d.ts", - "./node_modules/@types/node/punycode.d.ts", - "./node_modules/@types/node/querystring.d.ts", - "./node_modules/@types/node/readline.d.ts", - "./node_modules/@types/node/readline/promises.d.ts", - "./node_modules/@types/node/repl.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/stream/consumers.d.ts", - "./node_modules/@types/node/stream/promises.d.ts", - "./node_modules/@types/node/stream/web.d.ts", - "./node_modules/@types/node/string_decoder.d.ts", - "./node_modules/@types/node/test.d.ts", - "./node_modules/@types/node/timers.d.ts", - "./node_modules/@types/node/timers/promises.d.ts", - "./node_modules/@types/node/tls.d.ts", - "./node_modules/@types/node/trace_events.d.ts", - "./node_modules/@types/node/tty.d.ts", - "./node_modules/@types/node/url.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/node/v8.d.ts", - "./node_modules/@types/node/vm.d.ts", - "./node_modules/@types/node/wasi.d.ts", - "./node_modules/@types/node/worker_threads.d.ts", - "./node_modules/@types/node/zlib.d.ts" - ], - "./node_modules/@types/node/inspector.d.ts": [ - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/inspector.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/module.d.ts": [ - "./node_modules/@types/node/module.d.ts", - "./node_modules/@types/node/url.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/net.d.ts": [ - "./node_modules/@types/node/dns.d.ts", - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/net.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/os.d.ts": [ - "./node_modules/@types/node/os.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/path.d.ts": [ - "./node_modules/@types/node/path.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/perf_hooks.d.ts": [ - "./node_modules/@types/node/async_hooks.d.ts", - "./node_modules/@types/node/perf_hooks.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/process.d.ts": [ - "./node_modules/@types/node/process.d.ts", - "./node_modules/@types/node/tty.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/node/worker_threads.d.ts" - ], - "./node_modules/@types/node/punycode.d.ts": [ - "./node_modules/@types/node/punycode.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/querystring.d.ts": [ - "./node_modules/@types/node/querystring.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/readline.d.ts": [ - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/readline.d.ts", - "./node_modules/@types/node/readline/promises.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/readline/promises.d.ts": [ - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/readline.d.ts", - "./node_modules/@types/node/readline/promises.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/repl.d.ts": [ - "./node_modules/@types/node/readline.d.ts", - "./node_modules/@types/node/repl.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/node/vm.d.ts" - ], - "./node_modules/@types/node/stream.d.ts": [ - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/stream/consumers.d.ts", - "./node_modules/@types/node/stream/promises.d.ts", - "./node_modules/@types/node/stream/web.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/stream/consumers.d.ts": [ - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/stream/consumers.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/stream/promises.d.ts": [ - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/stream/promises.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/stream/web.d.ts": [ - "./node_modules/@types/node/stream/web.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/string_decoder.d.ts": [ - "./node_modules/@types/node/string_decoder.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/test.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/timers.d.ts": [ - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/timers.d.ts", - "./node_modules/@types/node/timers/promises.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/timers/promises.d.ts": [ - "./node_modules/@types/node/timers.d.ts", - "./node_modules/@types/node/timers/promises.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/tls.d.ts": [ - "./node_modules/@types/node/crypto.d.ts", - "./node_modules/@types/node/net.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/tls.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/trace_events.d.ts": [ - "./node_modules/@types/node/trace_events.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/tty.d.ts": [ - "./node_modules/@types/node/net.d.ts", - "./node_modules/@types/node/tty.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/url.d.ts": [ - "./node_modules/@types/node/buffer.d.ts", - "./node_modules/@types/node/http.d.ts", - "./node_modules/@types/node/querystring.d.ts", - "./node_modules/@types/node/url.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/util.d.ts": [ - "./node_modules/@types/node/crypto.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/v8.d.ts": [ - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/node/v8.d.ts" - ], - "./node_modules/@types/node/vm.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/node/vm.d.ts" - ], - "./node_modules/@types/node/wasi.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/node/wasi.d.ts" - ], - "./node_modules/@types/node/worker_threads.d.ts": [ - "./node_modules/@types/node/buffer.d.ts", - "./node_modules/@types/node/crypto.d.ts", - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/fs/promises.d.ts", - "./node_modules/@types/node/perf_hooks.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/url.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/node/vm.d.ts", - "./node_modules/@types/node/worker_threads.d.ts" - ], - "./node_modules/@types/node/zlib.d.ts": [ - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/node/zlib.d.ts" - ], - "./node_modules/@types/prop-types/index.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/react/global.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/react/index.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/prop-types/index.d.ts", - "./node_modules/@types/react/global.d.ts", - "./node_modules/@types/scheduler/tracing.d.ts", - "./node_modules/csstype/index.d.ts" - ], - "./node_modules/@types/scheduler/tracing.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/csstype/index.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/lib0/decoding.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/lib0/encoding.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/lib0/observable.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/lib0/random.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/popper.js/index.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.dom.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.dom.iterable.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2015.collection.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2015.core.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2015.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2015.generator.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2015.iterable.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2015.promise.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2015.proxy.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2015.reflect.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2015.symbol.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2016.array.include.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2016.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2017.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2017.full.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2017.intl.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2017.object.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2017.string.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2018.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2018.intl.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2018.promise.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2018.regexp.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2019.array.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2019.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2019.object.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2019.string.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2019.symbol.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2020.bigint.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2020.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2020.intl.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2020.promise.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2020.string.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es5.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.esnext.intl.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.scripthost.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.webworker.importscripts.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typestyle/lib/types.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/typestyle/node_modules/csstype/index.d.ts" - ], - "./node_modules/typestyle/node_modules/csstype/index.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/y-protocols/awareness.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/lib0/observable.d.ts", - "./node_modules/yjs/dist/src/index.d.ts" - ], - "./node_modules/y-websocket/dist/src/y-websocket.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/lib0/decoding.d.ts", - "./node_modules/lib0/encoding.d.ts", - "./node_modules/lib0/observable.d.ts", - "./node_modules/y-protocols/awareness.d.ts", - "./node_modules/yjs/dist/src/index.d.ts" - ], - "./node_modules/yjs/dist/src/index.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/internals.d.ts" - ], - "./node_modules/yjs/dist/src/internals.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/AbstractStruct.d.ts", - "./node_modules/yjs/dist/src/structs/ContentAny.d.ts", - "./node_modules/yjs/dist/src/structs/ContentBinary.d.ts", - "./node_modules/yjs/dist/src/structs/ContentDeleted.d.ts", - "./node_modules/yjs/dist/src/structs/ContentDoc.d.ts", - "./node_modules/yjs/dist/src/structs/ContentEmbed.d.ts", - "./node_modules/yjs/dist/src/structs/ContentFormat.d.ts", - "./node_modules/yjs/dist/src/structs/ContentJSON.d.ts", - "./node_modules/yjs/dist/src/structs/ContentString.d.ts", - "./node_modules/yjs/dist/src/structs/ContentType.d.ts", - "./node_modules/yjs/dist/src/structs/GC.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/structs/Skip.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/types/YArray.d.ts", - "./node_modules/yjs/dist/src/types/YMap.d.ts", - "./node_modules/yjs/dist/src/types/YText.d.ts", - "./node_modules/yjs/dist/src/types/YXmlElement.d.ts", - "./node_modules/yjs/dist/src/types/YXmlEvent.d.ts", - "./node_modules/yjs/dist/src/types/YXmlFragment.d.ts", - "./node_modules/yjs/dist/src/types/YXmlHook.d.ts", - "./node_modules/yjs/dist/src/types/YXmlText.d.ts", - "./node_modules/yjs/dist/src/utils/AbstractConnector.d.ts", - "./node_modules/yjs/dist/src/utils/DeleteSet.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/EventHandler.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts", - "./node_modules/yjs/dist/src/utils/PermanentUserData.d.ts", - "./node_modules/yjs/dist/src/utils/RelativePosition.d.ts", - "./node_modules/yjs/dist/src/utils/Snapshot.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UndoManager.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts", - "./node_modules/yjs/dist/src/utils/YEvent.d.ts", - "./node_modules/yjs/dist/src/utils/encoding.d.ts", - "./node_modules/yjs/dist/src/utils/isParentOf.d.ts", - "./node_modules/yjs/dist/src/utils/logging.d.ts", - "./node_modules/yjs/dist/src/utils/updates.d.ts" - ], - "./node_modules/yjs/dist/src/structs/AbstractStruct.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/ContentAny.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/ContentBinary.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/ContentDeleted.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/ContentDoc.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/ContentEmbed.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/ContentFormat.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/ContentJSON.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/ContentString.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/ContentType.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/GC.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/AbstractStruct.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/Item.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/AbstractStruct.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/utils/DeleteSet.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/Skip.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/AbstractStruct.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/types/AbstractType.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/EventHandler.d.ts", - "./node_modules/yjs/dist/src/utils/Snapshot.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts", - "./node_modules/yjs/dist/src/utils/YEvent.d.ts" - ], - "./node_modules/yjs/dist/src/types/YArray.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/YEvent.d.ts" - ], - "./node_modules/yjs/dist/src/types/YMap.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/YEvent.d.ts" - ], - "./node_modules/yjs/dist/src/types/YText.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts", - "./node_modules/yjs/dist/src/utils/Snapshot.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/YEvent.d.ts" - ], - "./node_modules/yjs/dist/src/types/YXmlElement.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/types/YXmlFragment.d.ts", - "./node_modules/yjs/dist/src/types/YXmlText.d.ts", - "./node_modules/yjs/dist/src/utils/Snapshot.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts" - ], - "./node_modules/yjs/dist/src/types/YXmlEvent.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/types/YXmlElement.d.ts", - "./node_modules/yjs/dist/src/types/YXmlFragment.d.ts", - "./node_modules/yjs/dist/src/types/YXmlText.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/YEvent.d.ts" - ], - "./node_modules/yjs/dist/src/types/YXmlFragment.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/types/YXmlElement.d.ts", - "./node_modules/yjs/dist/src/types/YXmlEvent.d.ts", - "./node_modules/yjs/dist/src/types/YXmlHook.d.ts", - "./node_modules/yjs/dist/src/types/YXmlText.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts" - ], - "./node_modules/yjs/dist/src/types/YXmlHook.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/types/YMap.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts" - ], - "./node_modules/yjs/dist/src/types/YXmlText.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/types/YText.d.ts", - "./node_modules/yjs/dist/src/types/YXmlElement.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts" - ], - "./node_modules/yjs/dist/src/utils/AbstractConnector.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/lib0/observable.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts" - ], - "./node_modules/yjs/dist/src/utils/DeleteSet.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/GC.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/utils/Doc.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/lib0/observable.d.ts", - "./node_modules/lib0/random.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/types/YArray.d.ts", - "./node_modules/yjs/dist/src/types/YMap.d.ts", - "./node_modules/yjs/dist/src/types/YText.d.ts", - "./node_modules/yjs/dist/src/types/YXmlFragment.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/YEvent.d.ts" - ], - "./node_modules/yjs/dist/src/utils/EventHandler.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/yjs/dist/src/utils/ID.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/lib0/decoding.d.ts", - "./node_modules/lib0/encoding.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts" - ], - "./node_modules/yjs/dist/src/utils/PermanentUserData.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/types/YMap.d.ts", - "./node_modules/yjs/dist/src/utils/DeleteSet.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts" - ], - "./node_modules/yjs/dist/src/utils/RelativePosition.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/lib0/decoding.d.ts", - "./node_modules/lib0/encoding.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts" - ], - "./node_modules/yjs/dist/src/utils/Snapshot.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/DeleteSet.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/utils/StructStore.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/GC.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts" - ], - "./node_modules/yjs/dist/src/utils/Transaction.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/AbstractStruct.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/utils/DeleteSet.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts", - "./node_modules/yjs/dist/src/utils/YEvent.d.ts" - ], - "./node_modules/yjs/dist/src/utils/UndoManager.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/lib0/observable.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/utils/DeleteSet.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts" - ], - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/lib0/decoding.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts" - ], - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/lib0/encoding.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts" - ], - "./node_modules/yjs/dist/src/utils/YEvent.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/AbstractStruct.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts" - ], - "./node_modules/yjs/dist/src/utils/encoding.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/lib0/decoding.d.ts", - "./node_modules/yjs/dist/src/structs/GC.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/utils/isParentOf.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts" - ], - "./node_modules/yjs/dist/src/utils/logging.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts" - ], - "./node_modules/yjs/dist/src/utils/updates.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/GC.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/structs/Skip.d.ts", - "./node_modules/yjs/dist/src/utils/DeleteSet.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./src/constants.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./src/deepcoder.ts": [ - "./node_modules/@jupyterlab/cells/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./src/constants.ts", - "./src/utils.tsx" - ], - "./src/index.ts": [ - "./node_modules/@jupyterlab/application/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/index.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./src/constants.ts", - "./src/deepcoder.ts" - ], - "./src/utils.tsx": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/index.d.ts", - "./node_modules/@phosphor/commands/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ] - }, - "exportedModulesMap": { - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractComponent.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractComponent2.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractPureComponent.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractPureComponent2.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/alignment.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/boundary.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/classes.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/alignment.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/elevation.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/intent.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/position.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/colors.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/configureDom4.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/constructor.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/elevation.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/index.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractComponent.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractComponent2.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractPureComponent.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractPureComponent2.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/alignment.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/boundary.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/classes.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/colors.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/constructor.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/elevation.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/intent.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/keys.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/position.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/refs.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/intent.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/keys.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/position.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/props.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/intent.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/refs.d.ts", - "./node_modules/@blueprintjs/icons/lib/esm/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/refs.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/compareUtils.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/domUtils.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/functionUtils.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/index.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/refs.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/compareUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/domUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/functionUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/isDarkTheme.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/jsUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/reactUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/safeInvokeMember.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/isDarkTheme.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/configureDom4.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/jsUtils.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/reactUtils.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/safeInvokeMember.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/components/button/abstractButton.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/icon/icon.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/components/button/buttons.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/refs.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/button/abstractButton.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/components/collapse/collapse.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/components/forms/controls.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/components/forms/inputGroup.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/icon/icon.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/cjs/components/icon/icon.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/index.d.ts", - "./node_modules/@blueprintjs/icons/lib/esm/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/accessibility/focusStyleManager.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/accessibility/index.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/accessibility/focusStyleManager.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/abstractComponent.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/abstractComponent2.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/abstractPureComponent.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/abstractPureComponent2.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/alignment.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/boundary.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/classes.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/alignment.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/elevation.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/intent.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/position.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/colors.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/configureDom4.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/constructor.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/context.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/elevation.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/abstractComponent.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/abstractComponent2.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/abstractPureComponent.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/abstractPureComponent2.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/alignment.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/boundary.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/classes.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/colors.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/constructor.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/elevation.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/intent.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/keys.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/position.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/refs.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/intent.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/keys.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/position.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/intent.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/refs.d.ts", - "./node_modules/@blueprintjs/icons/lib/esm/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/refs.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/utils/compareUtils.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/utils/domUtils.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/utils/functionUtils.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/utils/index.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/refs.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/compareUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/domUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/functionUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/isDarkTheme.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/jsUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/reactUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/safeInvokeMember.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/utils/isDarkTheme.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/configureDom4.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/utils/jsUtils.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/utils/reactUtils.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/common/utils/safeInvokeMember.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/alert/alert.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/overlay/overlay.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/breadcrumbs/breadcrumb.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/breadcrumbs/breadcrumbs.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/breadcrumbs/breadcrumb.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/overflow-list/overflowList.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popover.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/button/abstractButton.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/button/buttonGroup.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/button/buttons.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/refs.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/button/abstractButton.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/callout/callout.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/card/card.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/collapse/collapse.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/collapsible-list/collapsibleList.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/boundary.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menuItem.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popover.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/context-menu/contextMenu.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/context-menu/contextMenuTarget.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/constructor.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/dialog.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/overlay/overlay.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/dialogStep.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/button/buttons.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/multistepDialog.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/button/buttons.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/dialog.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/dialogStep.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/divider/divider.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/drawer/drawer.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/position.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/overlay/overlay.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/editable-text/editableText.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/forms/controlGroup.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/forms/controls.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/forms/fileInput.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/forms/formGroup.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/forms/inputGroup.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/forms/numericInput.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/icons/lib/esm/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/forms/radioGroup.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/forms/textArea.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkey.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/hooks/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeyParser.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeys.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTypes.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysDialog.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkey.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysDialog2.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/dialog.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/hooks/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysEvents.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkey.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeyParser.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTypes.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTarget.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/constructor.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysEvents.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTypes.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTarget2.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/hooks/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTypes.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/index.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkey.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeyParser.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeys.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysDialog.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysDialog2.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTarget.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTarget2.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTypes.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/keyCombo.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/keyCombo.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/html-select/htmlSelect.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/html-table/htmlTable.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/html/html.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/icons/lib/esm/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/index.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/configureDom4.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/alert/alert.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/breadcrumbs/breadcrumb.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/breadcrumbs/breadcrumbs.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/button/buttonGroup.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/button/buttons.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/callout/callout.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/card/card.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/collapse/collapse.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/collapsible-list/collapsibleList.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/context-menu/contextMenu.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/context-menu/contextMenuTarget.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/dialog.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/dialogStep.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/multistepDialog.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/divider/divider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/drawer/drawer.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/editable-text/editableText.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/controlGroup.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/controls.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/fileInput.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/formGroup.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/inputGroup.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/numericInput.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/radioGroup.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/textArea.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/html-select/htmlSelect.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/html-table/htmlTable.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/html/html.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menu.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menuDivider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menuItem.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbar.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarDivider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarGroup.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarHeading.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/non-ideal-state/nonIdealState.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/overflow-list/overflowList.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/overlay/overlay.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack/panelProps.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack/panelStack.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack2/panelStack2.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack2/panelTypes.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popover.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popoverSharedProps.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/portal/portal.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/progress-bar/progressBar.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/resize-sensor/resizeObserverTypes.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/resize-sensor/resizeSensor.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/slider/handleProps.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/slider/multiSlider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/slider/rangeSlider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/slider/slider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/spinner/spinner.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tabs/tab.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tabs/tabs.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tag-input/tagInput.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tag/tag.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/text/text.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/toast/toast.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/toast/toaster.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tooltip/tooltip.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tree/tree.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tree/treeNode.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menu.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menuDivider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menuItem.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menuDivider.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menuItem.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popover.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbar.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarDivider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarGroup.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarHeading.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarDivider.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarGroup.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarHeading.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/non-ideal-state/nonIdealState.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/overflow-list/overflowList.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/boundary.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/overlay/overlay.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack/panelProps.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack/panelStack.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack/panelProps.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack2/panelStack2.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack2/panelTypes.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack2/panelTypes.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popover.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popoverSharedProps.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popoverSharedProps.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/overlay/overlay.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts", - "./node_modules/popper.js/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/portal/portal.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/context.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/progress-bar/progressBar.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/resize-sensor/resizeObserverTypes.d.ts": [ - "./node_modules/@juggle/resize-observer/lib/DOMRectReadOnly.d.ts", - "./node_modules/@juggle/resize-observer/lib/exports/resize-observer.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/resize-sensor/resizeSensor.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@juggle/resize-observer/lib/exports/resize-observer.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/slider/handleProps.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/slider/multiSlider.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/slider/handleProps.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/slider/rangeSlider.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/slider/multiSlider.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/slider/slider.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/slider/multiSlider.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/spinner/spinner.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/tabs/tab.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/tabs/tabs.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tabs/tab.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/tag-input/tagInput.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tag/tag.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/tag/tag.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/text/text.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/toast/toast.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/toast/toaster.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/toast/toast.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/tooltip/tooltip.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popover.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popoverSharedProps.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/tree/tree.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tree/treeNode.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/components/tree/treeNode.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/context/hotkeys/hotkeysProvider.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysDialog2.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/hooks/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/context/index.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/context/hotkeys/hotkeysProvider.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/hooks/hotkeys/hotkeyConfig.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/hooks/hotkeys/useHotkeys.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/hooks/hotkeys/hotkeyConfig.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/hooks/index.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/hooks/hotkeys/hotkeyConfig.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/hooks/hotkeys/useHotkeys.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/core/lib/esm/index.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/accessibility/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/context/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/hooks/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/icons/lib/esm/generated/iconSvgPaths.d.ts": [ - "./node_modules/@blueprintjs/icons/lib/esm/iconName.d.ts" - ], - "./node_modules/@blueprintjs/icons/lib/esm/iconName.d.ts": [ - "./node_modules/@blueprintjs/icons/lib/esm/generated/iconNames.d.ts" - ], - "./node_modules/@blueprintjs/icons/lib/esm/index.d.ts": [ - "./node_modules/@blueprintjs/icons/lib/esm/generated/iconContents.d.ts", - "./node_modules/@blueprintjs/icons/lib/esm/generated/iconNames.d.ts", - "./node_modules/@blueprintjs/icons/lib/esm/generated/iconSvgPaths.d.ts", - "./node_modules/@blueprintjs/icons/lib/esm/iconName.d.ts" - ], - "./node_modules/@blueprintjs/select/lib/cjs/common/classes.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/select/lib/cjs/common/index.d.ts": [ - "./node_modules/@blueprintjs/select/lib/cjs/common/classes.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/itemListRenderer.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/itemRenderer.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/listItemsProps.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/listItemsUtils.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/predicate.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/select/lib/cjs/common/itemListRenderer.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/index.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/listItemsUtils.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/select/lib/cjs/common/itemRenderer.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/select/lib/cjs/common/listItemsProps.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/index.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/itemListRenderer.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/itemRenderer.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/listItemsUtils.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/predicate.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@blueprintjs/select/lib/cjs/common/listItemsUtils.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/select/lib/cjs/common/predicate.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@blueprintjs/select/lib/cjs/components/select/select.d.ts": [ - "./node_modules/@blueprintjs/core/lib/esm/index.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@juggle/resize-observer/lib/ResizeObserver.d.ts": [ - "./node_modules/@juggle/resize-observer/lib/ResizeObserverCallback.d.ts", - "./node_modules/@juggle/resize-observer/lib/ResizeObserverOptions.d.ts" - ], - "./node_modules/@juggle/resize-observer/lib/ResizeObserverCallback.d.ts": [ - "./node_modules/@juggle/resize-observer/lib/ResizeObserver.d.ts", - "./node_modules/@juggle/resize-observer/lib/ResizeObserverEntry.d.ts" - ], - "./node_modules/@juggle/resize-observer/lib/ResizeObserverEntry.d.ts": [ - "./node_modules/@juggle/resize-observer/lib/DOMRectReadOnly.d.ts", - "./node_modules/@juggle/resize-observer/lib/ResizeObserverSize.d.ts" - ], - "./node_modules/@juggle/resize-observer/lib/ResizeObserverOptions.d.ts": [ - "./node_modules/@juggle/resize-observer/lib/ResizeObserverBoxOptions.d.ts" - ], - "./node_modules/@juggle/resize-observer/lib/exports/resize-observer.d.ts": [ - "./node_modules/@juggle/resize-observer/lib/ResizeObserver.d.ts", - "./node_modules/@juggle/resize-observer/lib/ResizeObserverEntry.d.ts", - "./node_modules/@juggle/resize-observer/lib/ResizeObserverSize.d.ts" - ], - "./node_modules/@jupyterlab/application/lib/connectionlost.d.ts": [ - "./node_modules/@jupyterlab/application/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/lib/frontend.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/application/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/lib/index.d.ts": [ - "./node_modules/@jupyterlab/application/lib/connectionlost.d.ts", - "./node_modules/@jupyterlab/application/lib/frontend.d.ts", - "./node_modules/@jupyterlab/application/lib/lab.d.ts", - "./node_modules/@jupyterlab/application/lib/layoutrestorer.d.ts", - "./node_modules/@jupyterlab/application/lib/mimerenderers.d.ts", - "./node_modules/@jupyterlab/application/lib/router.d.ts", - "./node_modules/@jupyterlab/application/lib/shell.d.ts", - "./node_modules/@jupyterlab/application/lib/status.d.ts", - "./node_modules/@jupyterlab/application/lib/tokens.d.ts", - "./node_modules/@jupyterlab/application/lib/treepathupdater.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/lib/lab.d.ts": [ - "./node_modules/@jupyterlab/application/lib/frontend.d.ts", - "./node_modules/@jupyterlab/application/lib/shell.d.ts", - "./node_modules/@jupyterlab/application/lib/status.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/lib/layoutrestorer.d.ts": [ - "./node_modules/@jupyterlab/application/lib/shell.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/index.d.ts", - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/lib/mimerenderers.d.ts": [ - "./node_modules/@jupyterlab/application/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/lib/router.d.ts": [ - "./node_modules/@jupyterlab/application/lib/tokens.d.ts", - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/lib/shell.d.ts": [ - "./node_modules/@jupyterlab/application/lib/frontend.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/lib/status.d.ts": [ - "./node_modules/@jupyterlab/application/lib/frontend.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/lib/tokens.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/lib/treepathupdater.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/node_modules/@jupyterlab/services/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/builder/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/config/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/contents/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/nbconvert/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/setting/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/workspace/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/node_modules/@jupyterlab/statedb/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/dataconnector.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/interfaces.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/restorablepool.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/statedb.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/node_modules/@jupyterlab/translation/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/base.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/gettext.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/server.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/application/node_modules/@jupyterlab/ui-components/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/FormComponentRegistry.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/blueprint.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/utils.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/apputils/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/clipboard.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/collapse.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/commandlinker.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/commandpalette.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/dialog.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/domutils.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/hoverbox.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/iframe.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/inputdialog.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/kernelstatuses.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/mainareawidget.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/menufactory.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/printing.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sanitizer.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/search.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sessioncontext.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/spinner.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/splash.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/styling.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/thememanager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/vdom.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/widgettracker.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/windowresolver.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/attachments/lib/index.d.ts": [ - "./node_modules/@jupyterlab/attachments/lib/model.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/attachments/lib/model.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/attachments/node_modules/@jupyterlab/nbformat/lib/index.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/attachments/node_modules/@jupyterlab/observables/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/modeldb.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablejson.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablelist.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablemap.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablestring.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/undoablelist.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/attachments/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/attachments/node_modules/@jupyterlab/rendermime/lib/index.d.ts": [ - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/attachmentmodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/factories.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/latex.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/mimemodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/outputmodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/registry.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/renderers.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/tokens.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/widgets.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/lib/celldragutils.d.ts": [ - "./node_modules/@jupyterlab/cells/lib/widget.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/lib/collapser.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/cells/lib/headerfooter.d.ts": [ - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/lib/celldragutils.d.ts", - "./node_modules/@jupyterlab/cells/lib/collapser.d.ts", - "./node_modules/@jupyterlab/cells/lib/headerfooter.d.ts", - "./node_modules/@jupyterlab/cells/lib/inputarea.d.ts", - "./node_modules/@jupyterlab/cells/lib/model.d.ts", - "./node_modules/@jupyterlab/cells/lib/placeholder.d.ts", - "./node_modules/@jupyterlab/cells/lib/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/lib/inputarea.d.ts": [ - "./node_modules/@jupyterlab/cells/lib/model.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/lib/model.d.ts": [ - "./node_modules/@jupyterlab/attachments/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/lib/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/lib/placeholder.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/cells/lib/widget.d.ts": [ - "./node_modules/@jupyterlab/cells/lib/headerfooter.d.ts", - "./node_modules/@jupyterlab/cells/lib/inputarea.d.ts", - "./node_modules/@jupyterlab/cells/lib/model.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/clipboard.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/collapse.d.ts": [ - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/commandlinker.d.ts": [ - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/commandpalette.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/dialog.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/widgettracker.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/domutils.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/hoverbox.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/iframe.d.ts": [ - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/clipboard.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/collapse.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/commandlinker.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/commandpalette.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/dialog.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/domutils.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/hoverbox.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/iframe.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/inputdialog.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/kernelstatuses.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/mainareawidget.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/menufactory.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/printing.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sanitizer.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/search.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sessioncontext.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/spinner.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/splash.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/styling.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/thememanager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/vdom.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/widgettracker.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/windowresolver.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/inputdialog.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/dialog.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/kernelstatuses.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sessioncontext.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/mainareawidget.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/printing.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/menufactory.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/printing.d.ts": [ - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sanitizer.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/search.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/vdom.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sessioncontext.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/spinner.d.ts": [ - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/splash.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/styling.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/thememanager.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/splash.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/tokens.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sessioncontext.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/factory.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/widget.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/factory.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/registry.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/registry.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/tokens.d.ts", - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/widget.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sessioncontext.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/vdom.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/vdom.d.ts": [ - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/widgettracker.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/windowresolver.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/editor.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/factory.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/editor.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/editor.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/factory.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/jsoneditor.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/mimetype.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/jsoneditor.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/editor.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/mimetype.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/tokens.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/factory.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/mimetype.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/widget.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/activitymonitor.d.ts": [ - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/activitymonitor.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/interfaces.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/markdowncodeblocks.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/pageconfig.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/path.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/text.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/time.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/url.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/interfaces.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/markdowncodeblocks.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/pageconfig.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/path.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/text.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/time.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/url.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/modeldb.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablejson.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablelist.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablemap.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablestring.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/undoablelist.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/modeldb.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablejson.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablemap.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablestring.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/undoablelist.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablejson.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablemap.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablelist.d.ts": [ - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablemap.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/modeldb.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablestring.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/modeldb.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/undoablelist.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablelist.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/rendermime/lib/index.d.ts": [ - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/attachmentmodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/factories.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/latex.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/mimemodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/outputmodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/registry.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/renderers.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/tokens.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/widgets.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/basemanager.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/builder/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/config/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/contents/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/builder/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/config/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/contents/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/nbconvert/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/setting/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/workspace/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/default.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/kernel.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/messages.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/default.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/kernel.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/messages.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/restapi.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/kernel.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/basemanager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/messages.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/restapi.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/index.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/manager.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/basemanager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/kernel.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/restapi.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/polling/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/messages.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/restapi.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/kernelspec.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/restapi.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/kernelspec.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/basemanager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/restapi.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/manager.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/basemanager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/kernelspec.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/restapi.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@lumino/polling/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/restapi.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/manager.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/builder/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/contents/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/nbconvert/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/setting/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/workspace/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/polling/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/nbconvert/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/restapi.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/session.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/manager.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/basemanager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/session.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/polling/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/restapi.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/session.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/index.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/setting/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/restapi.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/terminal.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/manager.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/basemanager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/terminal.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/polling/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/restapi.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/terminal.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/basemanager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/restapi.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/workspace/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/settingregistry.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/settingregistry.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/tokens.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/settingregistry.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/api.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/api.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/utils.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/ymodels.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/utils.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/api.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/index.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/ymodels.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/api.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/y-protocols/awareness.d.ts", - "./node_modules/yjs/dist/src/index.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/dataconnector.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/interfaces.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/dataconnector.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/interfaces.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/restorablepool.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/statedb.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/interfaces.d.ts": [ - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/restorablepool.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/interfaces.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/statedb.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/interfaces.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/tokens.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/tokens.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/interfaces.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/base.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/gettext.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/base.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/gettext.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/server.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/manager.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/server.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/tokens.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/FormComponentRegistry.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@rjsf/core/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/blueprint.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/intent.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/button/buttons.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/collapse/collapse.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/forms/controls.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/forms/inputGroup.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/components/select/select.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/htmlselect.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/interface.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/htmlselect.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/interface.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/menu.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/switch.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/interface.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/menu.d.ts": [ - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/switch.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/iconimports.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/labicon.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/iconimports.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/labicon.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/labicon.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/style/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/commandpalettesvg.d.ts": [ - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/commandpalettesvg.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/menusvg.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/tabbarsvg.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/menusvg.d.ts": [ - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/tabbarsvg.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/FormComponentRegistry.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/blueprint.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/utils.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/style/icon.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/typestyle/lib/types.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/style/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/style/icon.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/tokens.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/utils.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/coreutils/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/activitymonitor.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/interfaces.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/markdowncodeblocks.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/pageconfig.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/path.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/text.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/time.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/url.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/docregistry/lib/index.d.ts": [ - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/context.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/default.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/mimedocument.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/registry.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/mainmenu/lib/edit.d.ts": [ - "./node_modules/@jupyterlab/mainmenu/lib/tokens.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/mainmenu/lib/file.d.ts": [ - "./node_modules/@jupyterlab/mainmenu/lib/tokens.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/mainmenu/lib/help.d.ts": [ - "./node_modules/@jupyterlab/mainmenu/lib/tokens.d.ts", - "./node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/mainmenu/lib/index.d.ts": [ - "./node_modules/@jupyterlab/mainmenu/lib/edit.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/file.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/help.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/kernel.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/mainmenu.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/run.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/settings.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/tabs.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/tokens.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/view.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/mainmenu/lib/kernel.d.ts": [ - "./node_modules/@jupyterlab/mainmenu/lib/tokens.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/mainmenu/lib/mainmenu.d.ts": [ - "./node_modules/@jupyterlab/mainmenu/lib/edit.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/file.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/help.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/kernel.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/run.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/settings.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/tabs.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/tokens.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/view.d.ts", - "./node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/mainmenu/lib/run.d.ts": [ - "./node_modules/@jupyterlab/mainmenu/lib/tokens.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/mainmenu/lib/settings.d.ts": [ - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/mainmenu/lib/tabs.d.ts": [ - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/mainmenu/lib/tokens.d.ts": [ - "./node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/edit.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/file.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/help.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/kernel.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/run.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/settings.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/tabs.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/view.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/mainmenu/lib/view.d.ts": [ - "./node_modules/@jupyterlab/mainmenu/lib/tokens.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/actions.d.ts": [ - "./node_modules/@jupyterlab/cells/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/widget.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/default-toolbar.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/panel.d.ts", - "./node_modules/@jupyterlab/notebook/lib/widget.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/executionindicator.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/panel.d.ts", - "./node_modules/@jupyterlab/notebook/lib/widget.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/index.d.ts": [ - "./node_modules/@jupyterlab/notebook/lib/actions.d.ts", - "./node_modules/@jupyterlab/notebook/lib/default-toolbar.d.ts", - "./node_modules/@jupyterlab/notebook/lib/executionindicator.d.ts", - "./node_modules/@jupyterlab/notebook/lib/model.d.ts", - "./node_modules/@jupyterlab/notebook/lib/modelfactory.d.ts", - "./node_modules/@jupyterlab/notebook/lib/modestatus.d.ts", - "./node_modules/@jupyterlab/notebook/lib/notebooktools.d.ts", - "./node_modules/@jupyterlab/notebook/lib/panel.d.ts", - "./node_modules/@jupyterlab/notebook/lib/tokens.d.ts", - "./node_modules/@jupyterlab/notebook/lib/tracker.d.ts", - "./node_modules/@jupyterlab/notebook/lib/truststatus.d.ts", - "./node_modules/@jupyterlab/notebook/lib/widget.d.ts", - "./node_modules/@jupyterlab/notebook/lib/widgetfactory.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/model.d.ts": [ - "./node_modules/@jupyterlab/cells/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/modelfactory.d.ts": [ - "./node_modules/@jupyterlab/cells/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/model.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/modestatus.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/notebooktools.d.ts": [ - "./node_modules/@jupyterlab/cells/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/panel.d.ts", - "./node_modules/@jupyterlab/notebook/lib/tokens.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/panel.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/model.d.ts", - "./node_modules/@jupyterlab/notebook/lib/widget.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/tokens.d.ts": [ - "./node_modules/@jupyterlab/cells/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/notebooktools.d.ts", - "./node_modules/@jupyterlab/notebook/lib/panel.d.ts", - "./node_modules/@jupyterlab/notebook/lib/widgetfactory.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/tracker.d.ts": [ - "./node_modules/@jupyterlab/cells/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/panel.d.ts", - "./node_modules/@jupyterlab/notebook/lib/tokens.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/truststatus.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/widget.d.ts": [ - "./node_modules/@jupyterlab/cells/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/model.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/lib/widgetfactory.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/model.d.ts", - "./node_modules/@jupyterlab/notebook/lib/panel.d.ts", - "./node_modules/@jupyterlab/notebook/lib/widget.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/codeeditor/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/editor.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/factory.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/jsoneditor.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/mimetype.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/coreutils/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/activitymonitor.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/interfaces.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/markdowncodeblocks.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/pageconfig.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/path.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/text.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/time.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/url.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/awareness.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/index.d.ts": [ - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/awareness.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/mock.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/tokens.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/yprovider.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/mock.d.ts": [ - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/tokens.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/yprovider.d.ts": [ - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/y-websocket/dist/src/y-websocket.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/context.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/registry.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/default.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts": [ - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/context.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/default.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/mimedocument.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/registry.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/mimedocument.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/default.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/registry.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/registry.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/nbformat/lib/index.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/observables/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/modeldb.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablejson.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablelist.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablemap.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablestring.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/undoablelist.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/rendermime/lib/index.d.ts": [ - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/attachmentmodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/factories.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/latex.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/mimemodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/outputmodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/registry.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/renderers.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/tokens.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/widgets.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/services/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/builder/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/config/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/contents/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/nbconvert/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/setting/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/workspace/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/settingregistry/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/settingregistry.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/shared-models/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/api.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/utils.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/ymodels.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/translation/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/base.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/gettext.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/server.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/ui-components/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/FormComponentRegistry.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/blueprint.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/utils.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/lib/index.d.ts": [ - "./node_modules/@jupyterlab/outputarea/lib/model.d.ts", - "./node_modules/@jupyterlab/outputarea/lib/widget.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/lib/model.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/lib/widget.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/lib/model.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/apputils/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/clipboard.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/collapse.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/commandlinker.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/commandpalette.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/dialog.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/domutils.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/hoverbox.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/iframe.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/inputdialog.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/kernelstatuses.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/mainareawidget.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/menufactory.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/printing.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sanitizer.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/search.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sessioncontext.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/spinner.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/splash.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/styling.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/thememanager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/vdom.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/widgettracker.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/windowresolver.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/nbformat/lib/index.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/observables/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/modeldb.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablejson.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablelist.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablemap.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablestring.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/undoablelist.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/attachmentmodel.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/factories.d.ts": [ - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/index.d.ts": [ - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/attachmentmodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/factories.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/latex.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/mimemodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/outputmodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/registry.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/renderers.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/tokens.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/widgets.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/latex.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/mimemodel.d.ts": [ - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/outputmodel.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/registry.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/mimemodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/tokens.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/renderers.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/tokens.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/mimemodel.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/widgets.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/services/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/builder/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/config/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/contents/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/nbconvert/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/setting/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/workspace/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/translation/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/base.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/gettext.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/server.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/services/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/builder/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/config/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/contents/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/nbconvert/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/setting/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/workspace/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/settingregistry/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/settingregistry.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/statedb/lib/index.d.ts": [ - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/dataconnector.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/interfaces.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/restorablepool.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/statedb.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/tokens.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/translation/lib/base.d.ts": [ - "./node_modules/@jupyterlab/translation/lib/tokens.d.ts" - ], - "./node_modules/@jupyterlab/translation/lib/index.d.ts": [ - "./node_modules/@jupyterlab/translation/lib/base.d.ts", - "./node_modules/@jupyterlab/translation/lib/gettext.d.ts", - "./node_modules/@jupyterlab/translation/lib/manager.d.ts", - "./node_modules/@jupyterlab/translation/lib/server.d.ts", - "./node_modules/@jupyterlab/translation/lib/tokens.d.ts" - ], - "./node_modules/@jupyterlab/translation/lib/manager.d.ts": [ - "./node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/translation/lib/tokens.d.ts" - ], - "./node_modules/@jupyterlab/translation/lib/server.d.ts": [ - "./node_modules/@jupyterlab/services/lib/index.d.ts" - ], - "./node_modules/@jupyterlab/translation/lib/tokens.d.ts": [ - "./node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/statedb/lib/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/FormComponentRegistry.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@rjsf/core/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/blueprint.d.ts": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/intent.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/button/buttons.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/collapse/collapse.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/forms/controls.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/forms/inputGroup.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/components/select/select.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/components/htmlselect.d.ts": [ - "./node_modules/@jupyterlab/ui-components/lib/components/interface.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/icon/index.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/components/index.d.ts": [ - "./node_modules/@jupyterlab/ui-components/lib/components/htmlselect.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/components/interface.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/components/menu.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/components/switch.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/components/menu.d.ts": [ - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/components/switch.d.ts": [ - "./node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/icon/iconimports.d.ts": [ - "./node_modules/@jupyterlab/ui-components/lib/icon/labicon.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/icon/index.d.ts": [ - "./node_modules/@jupyterlab/ui-components/lib/icon/iconimports.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/icon/labicon.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/icon/labicon.d.ts": [ - "./node_modules/@jupyterlab/ui-components/lib/style/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/commandpalettesvg.d.ts": [ - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/index.d.ts": [ - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/commandpalettesvg.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/menusvg.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/tabbarsvg.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/menusvg.d.ts": [ - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/tabbarsvg.d.ts": [ - "./node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts": [ - "./node_modules/@jupyterlab/ui-components/lib/FormComponentRegistry.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/blueprint.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/components/index.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/icon/index.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/tokens.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/utils.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/style/icon.d.ts": [ - "./node_modules/typestyle/lib/types.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/style/index.d.ts": [ - "./node_modules/@jupyterlab/ui-components/lib/style/icon.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/lib/tokens.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/common/intent.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/components/button/buttons.d.ts": [ - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/common/refs.d.ts", - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/components/button/abstractButton.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/components/collapse/collapse.d.ts": [ - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/common/index.d.ts", - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/components/forms/controls.d.ts": [ - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/common/index.d.ts", - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/common/props.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/components/forms/inputGroup.d.ts": [ - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/common/index.d.ts", - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/common/props.d.ts", - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/components/icon/icon.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/select/lib/cjs/components/select/select.d.ts": [ - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/esm/index.d.ts", - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/select/lib/cjs/common/index.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@lumino/algorithm/types/chain.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts" - ], - "./node_modules/@lumino/algorithm/types/empty.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts" - ], - "./node_modules/@lumino/algorithm/types/enumerate.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts" - ], - "./node_modules/@lumino/algorithm/types/filter.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts" - ], - "./node_modules/@lumino/algorithm/types/find.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts" - ], - "./node_modules/@lumino/algorithm/types/index.d.ts": [ - "./node_modules/@lumino/algorithm/types/array.d.ts", - "./node_modules/@lumino/algorithm/types/chain.d.ts", - "./node_modules/@lumino/algorithm/types/empty.d.ts", - "./node_modules/@lumino/algorithm/types/enumerate.d.ts", - "./node_modules/@lumino/algorithm/types/filter.d.ts", - "./node_modules/@lumino/algorithm/types/find.d.ts", - "./node_modules/@lumino/algorithm/types/iter.d.ts", - "./node_modules/@lumino/algorithm/types/map.d.ts", - "./node_modules/@lumino/algorithm/types/range.d.ts", - "./node_modules/@lumino/algorithm/types/reduce.d.ts", - "./node_modules/@lumino/algorithm/types/repeat.d.ts", - "./node_modules/@lumino/algorithm/types/retro.d.ts", - "./node_modules/@lumino/algorithm/types/sort.d.ts", - "./node_modules/@lumino/algorithm/types/stride.d.ts", - "./node_modules/@lumino/algorithm/types/string.d.ts", - "./node_modules/@lumino/algorithm/types/take.d.ts", - "./node_modules/@lumino/algorithm/types/zip.d.ts" - ], - "./node_modules/@lumino/algorithm/types/map.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts" - ], - "./node_modules/@lumino/algorithm/types/range.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts" - ], - "./node_modules/@lumino/algorithm/types/reduce.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts" - ], - "./node_modules/@lumino/algorithm/types/repeat.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts" - ], - "./node_modules/@lumino/algorithm/types/retro.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts" - ], - "./node_modules/@lumino/algorithm/types/sort.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts" - ], - "./node_modules/@lumino/algorithm/types/stride.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts" - ], - "./node_modules/@lumino/algorithm/types/take.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts" - ], - "./node_modules/@lumino/algorithm/types/zip.d.ts": [ - "./node_modules/@lumino/algorithm/types/iter.d.ts" - ], - "./node_modules/@lumino/application/types/index.d.ts": [ - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/commands/types/index.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts" - ], - "./node_modules/@lumino/coreutils/types/index.common.d.ts": [ - "./node_modules/@lumino/coreutils/types/json.d.ts", - "./node_modules/@lumino/coreutils/types/mime.d.ts", - "./node_modules/@lumino/coreutils/types/promise.d.ts", - "./node_modules/@lumino/coreutils/types/token.d.ts" - ], - "./node_modules/@lumino/coreutils/types/index.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.common.d.ts", - "./node_modules/@lumino/coreutils/types/random.browser.d.ts", - "./node_modules/@lumino/coreutils/types/uuid.browser.d.ts" - ], - "./node_modules/@lumino/coreutils/types/random.browser.d.ts": [ - "./node_modules/@lumino/coreutils/types/random.d.ts" - ], - "./node_modules/@lumino/disposable/types/index.d.ts": [ - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts" - ], - "./node_modules/@lumino/messaging/types/index.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/polling/types/index.d.ts": [ - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/polling/types/poll.d.ts", - "./node_modules/@lumino/polling/types/ratelimiter.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/polling/types/poll.d.ts": [ - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/polling/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/polling/types/ratelimiter.d.ts": [ - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/polling/types/index.d.ts", - "./node_modules/@lumino/polling/types/poll.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@lumino/widgets/types/accordionlayout.d.ts": [ - "./node_modules/@lumino/widgets/types/splitlayout.d.ts", - "./node_modules/@lumino/widgets/types/title.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/accordionpanel.d.ts": [ - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/accordionlayout.d.ts", - "./node_modules/@lumino/widgets/types/splitlayout.d.ts", - "./node_modules/@lumino/widgets/types/splitpanel.d.ts", - "./node_modules/@lumino/widgets/types/title.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/boxlayout.d.ts": [ - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/panellayout.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/boxpanel.d.ts": [ - "./node_modules/@lumino/widgets/types/boxlayout.d.ts", - "./node_modules/@lumino/widgets/types/panel.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/commandpalette.d.ts": [ - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/contextmenu.d.ts": [ - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/widgets/types/menu.d.ts" - ], - "./node_modules/@lumino/widgets/types/docklayout.d.ts": [ - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/layout.d.ts", - "./node_modules/@lumino/widgets/types/tabbar.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/dockpanel.d.ts": [ - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/docklayout.d.ts", - "./node_modules/@lumino/widgets/types/tabbar.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/focustracker.d.ts": [ - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/gridlayout.d.ts": [ - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/layout.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/index.d.ts": [ - "./node_modules/@lumino/widgets/types/accordionlayout.d.ts", - "./node_modules/@lumino/widgets/types/accordionpanel.d.ts", - "./node_modules/@lumino/widgets/types/boxengine.d.ts", - "./node_modules/@lumino/widgets/types/boxlayout.d.ts", - "./node_modules/@lumino/widgets/types/boxpanel.d.ts", - "./node_modules/@lumino/widgets/types/commandpalette.d.ts", - "./node_modules/@lumino/widgets/types/contextmenu.d.ts", - "./node_modules/@lumino/widgets/types/docklayout.d.ts", - "./node_modules/@lumino/widgets/types/dockpanel.d.ts", - "./node_modules/@lumino/widgets/types/focustracker.d.ts", - "./node_modules/@lumino/widgets/types/gridlayout.d.ts", - "./node_modules/@lumino/widgets/types/layout.d.ts", - "./node_modules/@lumino/widgets/types/menu.d.ts", - "./node_modules/@lumino/widgets/types/menubar.d.ts", - "./node_modules/@lumino/widgets/types/panel.d.ts", - "./node_modules/@lumino/widgets/types/panellayout.d.ts", - "./node_modules/@lumino/widgets/types/scrollbar.d.ts", - "./node_modules/@lumino/widgets/types/singletonlayout.d.ts", - "./node_modules/@lumino/widgets/types/splitlayout.d.ts", - "./node_modules/@lumino/widgets/types/splitpanel.d.ts", - "./node_modules/@lumino/widgets/types/stackedlayout.d.ts", - "./node_modules/@lumino/widgets/types/stackedpanel.d.ts", - "./node_modules/@lumino/widgets/types/tabbar.d.ts", - "./node_modules/@lumino/widgets/types/tabpanel.d.ts", - "./node_modules/@lumino/widgets/types/title.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/layout.d.ts": [ - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/menu.d.ts": [ - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/menubar.d.ts": [ - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@lumino/widgets/types/menu.d.ts", - "./node_modules/@lumino/widgets/types/title.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/panel.d.ts": [ - "./node_modules/@lumino/widgets/types/panellayout.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/panellayout.d.ts": [ - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/widgets/types/layout.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/scrollbar.d.ts": [ - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/singletonlayout.d.ts": [ - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/widgets/types/layout.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/splitlayout.d.ts": [ - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/panellayout.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/splitpanel.d.ts": [ - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/panel.d.ts", - "./node_modules/@lumino/widgets/types/splitlayout.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/stackedlayout.d.ts": [ - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/widgets/types/layout.d.ts", - "./node_modules/@lumino/widgets/types/panellayout.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/stackedpanel.d.ts": [ - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/panel.d.ts", - "./node_modules/@lumino/widgets/types/stackedlayout.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/tabbar.d.ts": [ - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@lumino/widgets/types/title.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/tabpanel.d.ts": [ - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/stackedpanel.d.ts", - "./node_modules/@lumino/widgets/types/tabbar.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts" - ], - "./node_modules/@lumino/widgets/types/title.d.ts": [ - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts" - ], - "./node_modules/@lumino/widgets/types/widget.d.ts": [ - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/widgets/types/layout.d.ts", - "./node_modules/@lumino/widgets/types/title.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/array.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/chain.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/empty.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/enumerate.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/filter.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/find.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/index.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/array.d.ts", - "./node_modules/@phosphor/algorithm/lib/chain.d.ts", - "./node_modules/@phosphor/algorithm/lib/empty.d.ts", - "./node_modules/@phosphor/algorithm/lib/enumerate.d.ts", - "./node_modules/@phosphor/algorithm/lib/filter.d.ts", - "./node_modules/@phosphor/algorithm/lib/find.d.ts", - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@phosphor/algorithm/lib/map.d.ts", - "./node_modules/@phosphor/algorithm/lib/range.d.ts", - "./node_modules/@phosphor/algorithm/lib/reduce.d.ts", - "./node_modules/@phosphor/algorithm/lib/repeat.d.ts", - "./node_modules/@phosphor/algorithm/lib/retro.d.ts", - "./node_modules/@phosphor/algorithm/lib/sort.d.ts", - "./node_modules/@phosphor/algorithm/lib/stride.d.ts", - "./node_modules/@phosphor/algorithm/lib/string.d.ts", - "./node_modules/@phosphor/algorithm/lib/take.d.ts", - "./node_modules/@phosphor/algorithm/lib/zip.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/iter.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/map.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/range.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/reduce.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/repeat.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/retro.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/sort.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/stride.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/string.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/take.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/algorithm/lib/zip.d.ts": [ - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/commands/lib/index.d.ts": [ - "./node_modules/@phosphor/coreutils/lib/index.d.ts", - "./node_modules/@phosphor/disposable/lib/index.d.ts", - "./node_modules/@phosphor/signaling/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/coreutils/lib/index.d.ts": [ - "./node_modules/@phosphor/coreutils/lib/json.d.ts", - "./node_modules/@phosphor/coreutils/lib/mime.d.ts", - "./node_modules/@phosphor/coreutils/lib/promise.d.ts", - "./node_modules/@phosphor/coreutils/lib/random.d.ts", - "./node_modules/@phosphor/coreutils/lib/token.d.ts", - "./node_modules/@phosphor/coreutils/lib/uuid.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/coreutils/lib/json.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/coreutils/lib/mime.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/coreutils/lib/promise.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/coreutils/lib/random.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/coreutils/lib/token.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/coreutils/lib/uuid.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/disposable/lib/index.d.ts": [ - "./node_modules/@phosphor/signaling/lib/index.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@phosphor/signaling/lib/index.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@rjsf/core/index.d.ts": [ - "./node_modules/@rjsf/core/index.d.ts", - "./node_modules/@types/json-schema/index.d.ts", - "./node_modules/@types/react/index.d.ts" - ], - "./node_modules/@types/node/assert.d.ts": [ - "./node_modules/@types/node/assert.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/assert/strict.d.ts": [ - "./node_modules/@types/node/assert.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/async_hooks.d.ts": [ - "./node_modules/@types/node/async_hooks.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/buffer.d.ts": [ - "./node_modules/@types/node/buffer.d.ts", - "./node_modules/@types/node/crypto.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/child_process.d.ts": [ - "./node_modules/@types/node/child_process.d.ts", - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/fs.d.ts", - "./node_modules/@types/node/net.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/url.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/cluster.d.ts": [ - "./node_modules/@types/node/child_process.d.ts", - "./node_modules/@types/node/cluster.d.ts", - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/net.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/console.d.ts": [ - "./node_modules/@types/node/console.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/constants.d.ts": [ - "./node_modules/@types/node/constants.d.ts", - "./node_modules/@types/node/crypto.d.ts", - "./node_modules/@types/node/fs.d.ts", - "./node_modules/@types/node/os.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/crypto.d.ts": [ - "./node_modules/@types/node/crypto.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/tls.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/dgram.d.ts": [ - "./node_modules/@types/node/dgram.d.ts", - "./node_modules/@types/node/dns.d.ts", - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/net.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/diagnostics_channel.d.ts": [ - "./node_modules/@types/node/diagnostics_channel.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/dns.d.ts": [ - "./node_modules/@types/node/dns.d.ts", - "./node_modules/@types/node/dns/promises.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/dns/promises.d.ts": [ - "./node_modules/@types/node/dns.d.ts", - "./node_modules/@types/node/dns/promises.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/domain.d.ts": [ - "./node_modules/@types/node/domain.d.ts", - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/events.d.ts": [ - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/fs.d.ts": [ - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/fs.d.ts", - "./node_modules/@types/node/fs/promises.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/url.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/fs/promises.d.ts": [ - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/fs.d.ts", - "./node_modules/@types/node/fs/promises.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/stream/web.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/globals.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/node/worker_threads.d.ts" - ], - "./node_modules/@types/node/globals.global.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/http.d.ts": [ - "./node_modules/@types/node/http.d.ts", - "./node_modules/@types/node/net.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/url.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/http2.d.ts": [ - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/fs.d.ts", - "./node_modules/@types/node/http.d.ts", - "./node_modules/@types/node/http2.d.ts", - "./node_modules/@types/node/net.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/tls.d.ts", - "./node_modules/@types/node/url.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/https.d.ts": [ - "./node_modules/@types/node/http.d.ts", - "./node_modules/@types/node/https.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/tls.d.ts", - "./node_modules/@types/node/url.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/index.d.ts": [ - "./node_modules/@types/node/assert.d.ts", - "./node_modules/@types/node/assert/strict.d.ts", - "./node_modules/@types/node/async_hooks.d.ts", - "./node_modules/@types/node/buffer.d.ts", - "./node_modules/@types/node/child_process.d.ts", - "./node_modules/@types/node/cluster.d.ts", - "./node_modules/@types/node/console.d.ts", - "./node_modules/@types/node/constants.d.ts", - "./node_modules/@types/node/crypto.d.ts", - "./node_modules/@types/node/dgram.d.ts", - "./node_modules/@types/node/diagnostics_channel.d.ts", - "./node_modules/@types/node/dns.d.ts", - "./node_modules/@types/node/dns/promises.d.ts", - "./node_modules/@types/node/domain.d.ts", - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/fs.d.ts", - "./node_modules/@types/node/fs/promises.d.ts", - "./node_modules/@types/node/globals.d.ts", - "./node_modules/@types/node/globals.global.d.ts", - "./node_modules/@types/node/http.d.ts", - "./node_modules/@types/node/http2.d.ts", - "./node_modules/@types/node/https.d.ts", - "./node_modules/@types/node/inspector.d.ts", - "./node_modules/@types/node/module.d.ts", - "./node_modules/@types/node/net.d.ts", - "./node_modules/@types/node/os.d.ts", - "./node_modules/@types/node/path.d.ts", - "./node_modules/@types/node/perf_hooks.d.ts", - "./node_modules/@types/node/process.d.ts", - "./node_modules/@types/node/punycode.d.ts", - "./node_modules/@types/node/querystring.d.ts", - "./node_modules/@types/node/readline.d.ts", - "./node_modules/@types/node/readline/promises.d.ts", - "./node_modules/@types/node/repl.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/stream/consumers.d.ts", - "./node_modules/@types/node/stream/promises.d.ts", - "./node_modules/@types/node/stream/web.d.ts", - "./node_modules/@types/node/string_decoder.d.ts", - "./node_modules/@types/node/test.d.ts", - "./node_modules/@types/node/timers.d.ts", - "./node_modules/@types/node/timers/promises.d.ts", - "./node_modules/@types/node/tls.d.ts", - "./node_modules/@types/node/trace_events.d.ts", - "./node_modules/@types/node/tty.d.ts", - "./node_modules/@types/node/url.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/node/v8.d.ts", - "./node_modules/@types/node/vm.d.ts", - "./node_modules/@types/node/wasi.d.ts", - "./node_modules/@types/node/worker_threads.d.ts", - "./node_modules/@types/node/zlib.d.ts" - ], - "./node_modules/@types/node/inspector.d.ts": [ - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/inspector.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/module.d.ts": [ - "./node_modules/@types/node/module.d.ts", - "./node_modules/@types/node/url.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/net.d.ts": [ - "./node_modules/@types/node/dns.d.ts", - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/net.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/os.d.ts": [ - "./node_modules/@types/node/os.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/path.d.ts": [ - "./node_modules/@types/node/path.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/perf_hooks.d.ts": [ - "./node_modules/@types/node/async_hooks.d.ts", - "./node_modules/@types/node/perf_hooks.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/process.d.ts": [ - "./node_modules/@types/node/process.d.ts", - "./node_modules/@types/node/tty.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/node/worker_threads.d.ts" - ], - "./node_modules/@types/node/punycode.d.ts": [ - "./node_modules/@types/node/punycode.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/querystring.d.ts": [ - "./node_modules/@types/node/querystring.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/readline.d.ts": [ - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/readline.d.ts", - "./node_modules/@types/node/readline/promises.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/readline/promises.d.ts": [ - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/readline.d.ts", - "./node_modules/@types/node/readline/promises.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/repl.d.ts": [ - "./node_modules/@types/node/readline.d.ts", - "./node_modules/@types/node/repl.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/node/vm.d.ts" - ], - "./node_modules/@types/node/stream.d.ts": [ - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/stream/consumers.d.ts", - "./node_modules/@types/node/stream/promises.d.ts", - "./node_modules/@types/node/stream/web.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/stream/consumers.d.ts": [ - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/stream/consumers.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/stream/promises.d.ts": [ - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/stream/promises.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/stream/web.d.ts": [ - "./node_modules/@types/node/stream/web.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/string_decoder.d.ts": [ - "./node_modules/@types/node/string_decoder.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/test.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/timers.d.ts": [ - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/timers.d.ts", - "./node_modules/@types/node/timers/promises.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/timers/promises.d.ts": [ - "./node_modules/@types/node/timers.d.ts", - "./node_modules/@types/node/timers/promises.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/tls.d.ts": [ - "./node_modules/@types/node/crypto.d.ts", - "./node_modules/@types/node/net.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/tls.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/trace_events.d.ts": [ - "./node_modules/@types/node/trace_events.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/tty.d.ts": [ - "./node_modules/@types/node/net.d.ts", - "./node_modules/@types/node/tty.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/url.d.ts": [ - "./node_modules/@types/node/buffer.d.ts", - "./node_modules/@types/node/http.d.ts", - "./node_modules/@types/node/querystring.d.ts", - "./node_modules/@types/node/url.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/util.d.ts": [ - "./node_modules/@types/node/crypto.d.ts", - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/@types/node/v8.d.ts": [ - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/node/v8.d.ts" - ], - "./node_modules/@types/node/vm.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/node/vm.d.ts" - ], - "./node_modules/@types/node/wasi.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/node/wasi.d.ts" - ], - "./node_modules/@types/node/worker_threads.d.ts": [ - "./node_modules/@types/node/buffer.d.ts", - "./node_modules/@types/node/crypto.d.ts", - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/fs/promises.d.ts", - "./node_modules/@types/node/perf_hooks.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/url.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/node/vm.d.ts", - "./node_modules/@types/node/worker_threads.d.ts" - ], - "./node_modules/@types/node/zlib.d.ts": [ - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/node/zlib.d.ts" - ], - "./node_modules/@types/react/index.d.ts": [ - "./node_modules/@types/prop-types/index.d.ts", - "./node_modules/@types/react/global.d.ts", - "./node_modules/@types/scheduler/tracing.d.ts", - "./node_modules/csstype/index.d.ts" - ], - "./node_modules/lib0/decoding.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/lib0/encoding.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/lib0/observable.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/lib0/random.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2018.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2018.intl.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2018.promise.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2018.regexp.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2019.array.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2019.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2019.object.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2019.string.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2019.symbol.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2020.bigint.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2020.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2020.intl.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2020.promise.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2020.string.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typescript/lib/lib.esnext.intl.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/typestyle/lib/types.d.ts": [ - "./node_modules/typestyle/node_modules/csstype/index.d.ts" - ], - "./node_modules/y-protocols/awareness.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/lib0/observable.d.ts", - "./node_modules/yjs/dist/src/index.d.ts" - ], - "./node_modules/y-websocket/dist/src/y-websocket.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/lib0/decoding.d.ts", - "./node_modules/lib0/encoding.d.ts", - "./node_modules/lib0/observable.d.ts", - "./node_modules/y-protocols/awareness.d.ts", - "./node_modules/yjs/dist/src/index.d.ts" - ], - "./node_modules/yjs/dist/src/index.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/internals.d.ts" - ], - "./node_modules/yjs/dist/src/internals.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/AbstractStruct.d.ts", - "./node_modules/yjs/dist/src/structs/ContentAny.d.ts", - "./node_modules/yjs/dist/src/structs/ContentBinary.d.ts", - "./node_modules/yjs/dist/src/structs/ContentDeleted.d.ts", - "./node_modules/yjs/dist/src/structs/ContentDoc.d.ts", - "./node_modules/yjs/dist/src/structs/ContentEmbed.d.ts", - "./node_modules/yjs/dist/src/structs/ContentFormat.d.ts", - "./node_modules/yjs/dist/src/structs/ContentJSON.d.ts", - "./node_modules/yjs/dist/src/structs/ContentString.d.ts", - "./node_modules/yjs/dist/src/structs/ContentType.d.ts", - "./node_modules/yjs/dist/src/structs/GC.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/structs/Skip.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/types/YArray.d.ts", - "./node_modules/yjs/dist/src/types/YMap.d.ts", - "./node_modules/yjs/dist/src/types/YText.d.ts", - "./node_modules/yjs/dist/src/types/YXmlElement.d.ts", - "./node_modules/yjs/dist/src/types/YXmlEvent.d.ts", - "./node_modules/yjs/dist/src/types/YXmlFragment.d.ts", - "./node_modules/yjs/dist/src/types/YXmlHook.d.ts", - "./node_modules/yjs/dist/src/types/YXmlText.d.ts", - "./node_modules/yjs/dist/src/utils/AbstractConnector.d.ts", - "./node_modules/yjs/dist/src/utils/DeleteSet.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/EventHandler.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts", - "./node_modules/yjs/dist/src/utils/PermanentUserData.d.ts", - "./node_modules/yjs/dist/src/utils/RelativePosition.d.ts", - "./node_modules/yjs/dist/src/utils/Snapshot.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UndoManager.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts", - "./node_modules/yjs/dist/src/utils/YEvent.d.ts", - "./node_modules/yjs/dist/src/utils/encoding.d.ts", - "./node_modules/yjs/dist/src/utils/isParentOf.d.ts", - "./node_modules/yjs/dist/src/utils/logging.d.ts", - "./node_modules/yjs/dist/src/utils/updates.d.ts" - ], - "./node_modules/yjs/dist/src/structs/AbstractStruct.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/ContentAny.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/ContentBinary.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/ContentDeleted.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/ContentDoc.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/ContentEmbed.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/ContentFormat.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/ContentJSON.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/ContentString.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/ContentType.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/GC.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/AbstractStruct.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/Item.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/AbstractStruct.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/utils/DeleteSet.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/structs/Skip.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/AbstractStruct.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/types/AbstractType.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/EventHandler.d.ts", - "./node_modules/yjs/dist/src/utils/Snapshot.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts", - "./node_modules/yjs/dist/src/utils/YEvent.d.ts" - ], - "./node_modules/yjs/dist/src/types/YArray.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/YEvent.d.ts" - ], - "./node_modules/yjs/dist/src/types/YMap.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/YEvent.d.ts" - ], - "./node_modules/yjs/dist/src/types/YText.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts", - "./node_modules/yjs/dist/src/utils/Snapshot.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/YEvent.d.ts" - ], - "./node_modules/yjs/dist/src/types/YXmlElement.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/types/YXmlFragment.d.ts", - "./node_modules/yjs/dist/src/types/YXmlText.d.ts", - "./node_modules/yjs/dist/src/utils/Snapshot.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts" - ], - "./node_modules/yjs/dist/src/types/YXmlEvent.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/types/YXmlElement.d.ts", - "./node_modules/yjs/dist/src/types/YXmlFragment.d.ts", - "./node_modules/yjs/dist/src/types/YXmlText.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/YEvent.d.ts" - ], - "./node_modules/yjs/dist/src/types/YXmlFragment.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/types/YXmlElement.d.ts", - "./node_modules/yjs/dist/src/types/YXmlEvent.d.ts", - "./node_modules/yjs/dist/src/types/YXmlHook.d.ts", - "./node_modules/yjs/dist/src/types/YXmlText.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts" - ], - "./node_modules/yjs/dist/src/types/YXmlHook.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/types/YMap.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts" - ], - "./node_modules/yjs/dist/src/types/YXmlText.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/types/YText.d.ts", - "./node_modules/yjs/dist/src/types/YXmlElement.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts" - ], - "./node_modules/yjs/dist/src/utils/AbstractConnector.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/lib0/observable.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts" - ], - "./node_modules/yjs/dist/src/utils/DeleteSet.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/GC.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/utils/Doc.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/lib0/observable.d.ts", - "./node_modules/lib0/random.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/types/YArray.d.ts", - "./node_modules/yjs/dist/src/types/YMap.d.ts", - "./node_modules/yjs/dist/src/types/YText.d.ts", - "./node_modules/yjs/dist/src/types/YXmlFragment.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/YEvent.d.ts" - ], - "./node_modules/yjs/dist/src/utils/EventHandler.d.ts": [ - "./node_modules/@types/node/util.d.ts" - ], - "./node_modules/yjs/dist/src/utils/ID.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/lib0/decoding.d.ts", - "./node_modules/lib0/encoding.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts" - ], - "./node_modules/yjs/dist/src/utils/PermanentUserData.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/types/YMap.d.ts", - "./node_modules/yjs/dist/src/utils/DeleteSet.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts" - ], - "./node_modules/yjs/dist/src/utils/RelativePosition.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/lib0/decoding.d.ts", - "./node_modules/lib0/encoding.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts" - ], - "./node_modules/yjs/dist/src/utils/Snapshot.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/DeleteSet.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/utils/StructStore.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/GC.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts" - ], - "./node_modules/yjs/dist/src/utils/Transaction.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/AbstractStruct.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/utils/DeleteSet.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts", - "./node_modules/yjs/dist/src/utils/YEvent.d.ts" - ], - "./node_modules/yjs/dist/src/utils/UndoManager.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/lib0/observable.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/utils/DeleteSet.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts" - ], - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/lib0/decoding.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts" - ], - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/lib0/encoding.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts" - ], - "./node_modules/yjs/dist/src/utils/YEvent.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/AbstractStruct.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts" - ], - "./node_modules/yjs/dist/src/utils/encoding.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/lib0/decoding.d.ts", - "./node_modules/yjs/dist/src/structs/GC.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./node_modules/yjs/dist/src/utils/isParentOf.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts" - ], - "./node_modules/yjs/dist/src/utils/logging.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts" - ], - "./node_modules/yjs/dist/src/utils/updates.d.ts": [ - "./node_modules/@types/node/util.d.ts", - "./node_modules/yjs/dist/src/structs/GC.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/structs/Skip.d.ts", - "./node_modules/yjs/dist/src/utils/DeleteSet.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts" - ], - "./src/deepcoder.ts": [ - "./node_modules/@jupyterlab/cells/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/index.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts" - ], - "./src/index.ts": [ - "./node_modules/@jupyterlab/application/lib/index.d.ts" - ], - "./src/utils.tsx": [ - "./node_modules/@jupyterlab/notebook/lib/index.d.ts", - "./node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@phosphor/commands/lib/index.d.ts" - ] - }, - "semanticDiagnosticsPerFile": [ - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractComponent.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractComponent2.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractPureComponent.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/abstractPureComponent2.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/alignment.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/boundary.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/classes.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/colors.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/configureDom4.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/constructor.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/elevation.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/intent.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/keys.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/position.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/refs.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/compareUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/domUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/functionUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/index.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/isDarkTheme.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/jsUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/reactUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/common/utils/safeInvokeMember.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/button/abstractButton.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/button/buttons.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/collapse/collapse.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/forms/controls.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/forms/inputGroup.d.ts", - "./node_modules/@blueprintjs/core/lib/cjs/components/icon/icon.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/accessibility/focusStyleManager.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/accessibility/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/abstractComponent.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/abstractComponent2.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/abstractPureComponent.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/abstractPureComponent2.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/alignment.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/boundary.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/classes.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/colors.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/configureDom4.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/constructor.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/context.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/elevation.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/intent.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/keys.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/position.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/props.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/refs.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/compareUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/domUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/functionUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/isDarkTheme.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/jsUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/reactUtils.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/common/utils/safeInvokeMember.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/alert/alert.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/breadcrumbs/breadcrumb.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/breadcrumbs/breadcrumbs.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/button/abstractButton.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/button/buttonGroup.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/button/buttons.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/callout/callout.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/card/card.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/collapse/collapse.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/collapsible-list/collapsibleList.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/context-menu/contextMenu.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/context-menu/contextMenuTarget.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/dialog.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/dialogStep.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/dialog/multistepDialog.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/divider/divider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/drawer/drawer.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/editable-text/editableText.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/controlGroup.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/controls.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/fileInput.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/formGroup.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/inputGroup.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/numericInput.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/radioGroup.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/forms/textArea.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkey.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeyParser.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeys.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysDialog.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysDialog2.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysEvents.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTarget.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTarget2.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/hotkeysTypes.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/hotkeys/keyCombo.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/html-select/htmlSelect.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/html-table/htmlTable.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/html/html.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/icon/icon.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menu.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menuDivider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/menu/menuItem.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbar.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarDivider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarGroup.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/navbar/navbarHeading.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/non-ideal-state/nonIdealState.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/overflow-list/overflowList.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/overlay/overlay.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack/panelProps.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack/panelStack.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack2/panelStack2.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/panel-stack2/panelTypes.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popover.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/popover/popoverSharedProps.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/portal/portal.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/progress-bar/progressBar.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/resize-sensor/resizeObserverTypes.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/resize-sensor/resizeSensor.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/slider/handleProps.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/slider/multiSlider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/slider/rangeSlider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/slider/slider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/spinner/spinner.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tabs/tab.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tabs/tabs.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tag-input/tagInput.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tag/tag.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/text/text.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/toast/toast.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/toast/toaster.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tooltip/tooltip.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tree/tree.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/components/tree/treeNode.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/context/hotkeys/hotkeysProvider.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/context/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/hooks/hotkeys/hotkeyConfig.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/hooks/hotkeys/useHotkeys.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/hooks/index.d.ts", - "./node_modules/@blueprintjs/core/lib/esm/index.d.ts", - "./node_modules/@blueprintjs/icons/lib/esm/generated/iconContents.d.ts", - "./node_modules/@blueprintjs/icons/lib/esm/generated/iconNames.d.ts", - "./node_modules/@blueprintjs/icons/lib/esm/generated/iconSvgPaths.d.ts", - "./node_modules/@blueprintjs/icons/lib/esm/iconName.d.ts", - "./node_modules/@blueprintjs/icons/lib/esm/index.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/classes.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/index.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/itemListRenderer.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/itemRenderer.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/listItemsProps.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/listItemsUtils.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/common/predicate.d.ts", - "./node_modules/@blueprintjs/select/lib/cjs/components/select/select.d.ts", - "./node_modules/@juggle/resize-observer/lib/DOMRectReadOnly.d.ts", - "./node_modules/@juggle/resize-observer/lib/ResizeObserver.d.ts", - "./node_modules/@juggle/resize-observer/lib/ResizeObserverBoxOptions.d.ts", - "./node_modules/@juggle/resize-observer/lib/ResizeObserverCallback.d.ts", - "./node_modules/@juggle/resize-observer/lib/ResizeObserverEntry.d.ts", - "./node_modules/@juggle/resize-observer/lib/ResizeObserverOptions.d.ts", - "./node_modules/@juggle/resize-observer/lib/ResizeObserverSize.d.ts", - "./node_modules/@juggle/resize-observer/lib/exports/resize-observer.d.ts", - "./node_modules/@jupyterlab/application/lib/connectionlost.d.ts", - "./node_modules/@jupyterlab/application/lib/frontend.d.ts", - "./node_modules/@jupyterlab/application/lib/index.d.ts", - "./node_modules/@jupyterlab/application/lib/lab.d.ts", - "./node_modules/@jupyterlab/application/lib/layoutrestorer.d.ts", - "./node_modules/@jupyterlab/application/lib/mimerenderers.d.ts", - "./node_modules/@jupyterlab/application/lib/router.d.ts", - "./node_modules/@jupyterlab/application/lib/shell.d.ts", - "./node_modules/@jupyterlab/application/lib/status.d.ts", - "./node_modules/@jupyterlab/application/lib/tokens.d.ts", - "./node_modules/@jupyterlab/application/lib/treepathupdater.d.ts", - "./node_modules/@jupyterlab/application/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/application/node_modules/@jupyterlab/statedb/lib/index.d.ts", - "./node_modules/@jupyterlab/application/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/application/node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/attachments/lib/index.d.ts", - "./node_modules/@jupyterlab/attachments/lib/model.d.ts", - "./node_modules/@jupyterlab/attachments/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/attachments/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/attachments/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@jupyterlab/attachments/node_modules/@jupyterlab/rendermime/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/lib/celldragutils.d.ts", - "./node_modules/@jupyterlab/cells/lib/collapser.d.ts", - "./node_modules/@jupyterlab/cells/lib/headerfooter.d.ts", - "./node_modules/@jupyterlab/cells/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/lib/inputarea.d.ts", - "./node_modules/@jupyterlab/cells/lib/model.d.ts", - "./node_modules/@jupyterlab/cells/lib/placeholder.d.ts", - "./node_modules/@jupyterlab/cells/lib/widget.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/clipboard.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/collapse.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/commandlinker.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/commandpalette.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/dialog.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/domutils.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/hoverbox.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/iframe.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/inputdialog.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/kernelstatuses.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/mainareawidget.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/menufactory.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/printing.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sanitizer.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/search.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/sessioncontext.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/spinner.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/splash.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/styling.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/thememanager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/factory.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/registry.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/toolbar/widget.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/vdom.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/widgettracker.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/apputils/lib/windowresolver.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/editor.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/factory.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/jsoneditor.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/mimetype.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/codeeditor/lib/widget.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/activitymonitor.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/interfaces.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/markdowncodeblocks.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/pageconfig.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/path.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/text.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/time.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/coreutils/lib/url.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/modeldb.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablejson.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablelist.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablemap.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/observablestring.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/observables/lib/undoablelist.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/rendermime/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/basemanager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/builder/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/config/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/contents/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/default.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/kernel.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/messages.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernel/restapi.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/kernelspec.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/kernelspec/restapi.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/nbconvert/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/serverconnection.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/restapi.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/session/session.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/setting/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/restapi.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/terminal/terminal.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/services/lib/workspace/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/settingregistry.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/settingregistry/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/api.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/utils.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/shared-models/lib/ymodels.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/dataconnector.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/interfaces.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/restorablepool.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/statedb.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/statedb/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/base.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/gettext.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/manager.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/server.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/translation/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/FormComponentRegistry.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/blueprint.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/htmlselect.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/interface.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/menu.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/components/switch.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/iconimports.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/labicon.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/commandpalettesvg.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/menusvg.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/icon/widgets/tabbarsvg.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/style/icon.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/style/index.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/tokens.d.ts", - "./node_modules/@jupyterlab/cells/node_modules/@jupyterlab/ui-components/lib/utils.d.ts", - "./node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/docregistry/lib/index.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/edit.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/file.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/help.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/index.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/kernel.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/mainmenu.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/run.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/settings.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/tabs.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/tokens.d.ts", - "./node_modules/@jupyterlab/mainmenu/lib/view.d.ts", - "./node_modules/@jupyterlab/notebook/lib/actions.d.ts", - "./node_modules/@jupyterlab/notebook/lib/default-toolbar.d.ts", - "./node_modules/@jupyterlab/notebook/lib/executionindicator.d.ts", - "./node_modules/@jupyterlab/notebook/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/lib/model.d.ts", - "./node_modules/@jupyterlab/notebook/lib/modelfactory.d.ts", - "./node_modules/@jupyterlab/notebook/lib/modestatus.d.ts", - "./node_modules/@jupyterlab/notebook/lib/notebooktools.d.ts", - "./node_modules/@jupyterlab/notebook/lib/panel.d.ts", - "./node_modules/@jupyterlab/notebook/lib/tokens.d.ts", - "./node_modules/@jupyterlab/notebook/lib/tracker.d.ts", - "./node_modules/@jupyterlab/notebook/lib/truststatus.d.ts", - "./node_modules/@jupyterlab/notebook/lib/widget.d.ts", - "./node_modules/@jupyterlab/notebook/lib/widgetfactory.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/codeeditor/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/coreutils/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/awareness.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/mock.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/tokens.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docprovider/lib/yprovider.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/context.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/default.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/mimedocument.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/docregistry/lib/registry.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/rendermime/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/settingregistry/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/shared-models/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/notebook/node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/lib/model.d.ts", - "./node_modules/@jupyterlab/outputarea/lib/widget.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/apputils/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/nbformat/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/observables/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/attachmentmodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/factories.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/latex.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/mimemodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/outputmodel.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/registry.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/renderers.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/tokens.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/rendermime/lib/widgets.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/outputarea/node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/rendermime-interfaces/lib/index.d.ts", - "./node_modules/@jupyterlab/services/lib/index.d.ts", - "./node_modules/@jupyterlab/settingregistry/lib/index.d.ts", - "./node_modules/@jupyterlab/statedb/lib/index.d.ts", - "./node_modules/@jupyterlab/translation/lib/base.d.ts", - "./node_modules/@jupyterlab/translation/lib/gettext.d.ts", - "./node_modules/@jupyterlab/translation/lib/index.d.ts", - "./node_modules/@jupyterlab/translation/lib/manager.d.ts", - "./node_modules/@jupyterlab/translation/lib/server.d.ts", - "./node_modules/@jupyterlab/translation/lib/tokens.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/FormComponentRegistry.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/blueprint.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/components/htmlselect.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/components/index.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/components/interface.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/components/menu.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/components/switch.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/icon/iconimports.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/icon/index.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/icon/labicon.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/commandpalettesvg.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/index.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/menusvg.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/icon/widgets/tabbarsvg.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/index.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/style/icon.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/style/index.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/tokens.d.ts", - "./node_modules/@jupyterlab/ui-components/lib/utils.d.ts", - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/common/intent.d.ts", - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/components/button/buttons.d.ts", - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/components/collapse/collapse.d.ts", - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/components/forms/controls.d.ts", - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/core/lib/cjs/components/forms/inputGroup.d.ts", - "./node_modules/@jupyterlab/ui-components/node_modules/@blueprintjs/select/lib/cjs/components/select/select.d.ts", - "./node_modules/@lumino/algorithm/types/array.d.ts", - "./node_modules/@lumino/algorithm/types/chain.d.ts", - "./node_modules/@lumino/algorithm/types/empty.d.ts", - "./node_modules/@lumino/algorithm/types/enumerate.d.ts", - "./node_modules/@lumino/algorithm/types/filter.d.ts", - "./node_modules/@lumino/algorithm/types/find.d.ts", - "./node_modules/@lumino/algorithm/types/index.d.ts", - "./node_modules/@lumino/algorithm/types/iter.d.ts", - "./node_modules/@lumino/algorithm/types/map.d.ts", - "./node_modules/@lumino/algorithm/types/range.d.ts", - "./node_modules/@lumino/algorithm/types/reduce.d.ts", - "./node_modules/@lumino/algorithm/types/repeat.d.ts", - "./node_modules/@lumino/algorithm/types/retro.d.ts", - "./node_modules/@lumino/algorithm/types/sort.d.ts", - "./node_modules/@lumino/algorithm/types/stride.d.ts", - "./node_modules/@lumino/algorithm/types/string.d.ts", - "./node_modules/@lumino/algorithm/types/take.d.ts", - "./node_modules/@lumino/algorithm/types/zip.d.ts", - "./node_modules/@lumino/application/types/index.d.ts", - "./node_modules/@lumino/commands/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/index.common.d.ts", - "./node_modules/@lumino/coreutils/types/index.d.ts", - "./node_modules/@lumino/coreutils/types/json.d.ts", - "./node_modules/@lumino/coreutils/types/mime.d.ts", - "./node_modules/@lumino/coreutils/types/promise.d.ts", - "./node_modules/@lumino/coreutils/types/random.browser.d.ts", - "./node_modules/@lumino/coreutils/types/random.d.ts", - "./node_modules/@lumino/coreutils/types/token.d.ts", - "./node_modules/@lumino/coreutils/types/uuid.browser.d.ts", - "./node_modules/@lumino/disposable/types/index.d.ts", - "./node_modules/@lumino/messaging/types/index.d.ts", - "./node_modules/@lumino/polling/types/index.d.ts", - "./node_modules/@lumino/polling/types/poll.d.ts", - "./node_modules/@lumino/polling/types/ratelimiter.d.ts", - "./node_modules/@lumino/signaling/types/index.d.ts", - "./node_modules/@lumino/virtualdom/types/index.d.ts", - "./node_modules/@lumino/widgets/types/accordionlayout.d.ts", - "./node_modules/@lumino/widgets/types/accordionpanel.d.ts", - "./node_modules/@lumino/widgets/types/boxengine.d.ts", - "./node_modules/@lumino/widgets/types/boxlayout.d.ts", - "./node_modules/@lumino/widgets/types/boxpanel.d.ts", - "./node_modules/@lumino/widgets/types/commandpalette.d.ts", - "./node_modules/@lumino/widgets/types/contextmenu.d.ts", - "./node_modules/@lumino/widgets/types/docklayout.d.ts", - "./node_modules/@lumino/widgets/types/dockpanel.d.ts", - "./node_modules/@lumino/widgets/types/focustracker.d.ts", - "./node_modules/@lumino/widgets/types/gridlayout.d.ts", - "./node_modules/@lumino/widgets/types/index.d.ts", - "./node_modules/@lumino/widgets/types/layout.d.ts", - "./node_modules/@lumino/widgets/types/menu.d.ts", - "./node_modules/@lumino/widgets/types/menubar.d.ts", - "./node_modules/@lumino/widgets/types/panel.d.ts", - "./node_modules/@lumino/widgets/types/panellayout.d.ts", - "./node_modules/@lumino/widgets/types/scrollbar.d.ts", - "./node_modules/@lumino/widgets/types/singletonlayout.d.ts", - "./node_modules/@lumino/widgets/types/splitlayout.d.ts", - "./node_modules/@lumino/widgets/types/splitpanel.d.ts", - "./node_modules/@lumino/widgets/types/stackedlayout.d.ts", - "./node_modules/@lumino/widgets/types/stackedpanel.d.ts", - "./node_modules/@lumino/widgets/types/tabbar.d.ts", - "./node_modules/@lumino/widgets/types/tabpanel.d.ts", - "./node_modules/@lumino/widgets/types/title.d.ts", - "./node_modules/@lumino/widgets/types/widget.d.ts", - "./node_modules/@phosphor/algorithm/lib/array.d.ts", - "./node_modules/@phosphor/algorithm/lib/chain.d.ts", - "./node_modules/@phosphor/algorithm/lib/empty.d.ts", - "./node_modules/@phosphor/algorithm/lib/enumerate.d.ts", - "./node_modules/@phosphor/algorithm/lib/filter.d.ts", - "./node_modules/@phosphor/algorithm/lib/find.d.ts", - "./node_modules/@phosphor/algorithm/lib/index.d.ts", - "./node_modules/@phosphor/algorithm/lib/iter.d.ts", - "./node_modules/@phosphor/algorithm/lib/map.d.ts", - "./node_modules/@phosphor/algorithm/lib/range.d.ts", - "./node_modules/@phosphor/algorithm/lib/reduce.d.ts", - "./node_modules/@phosphor/algorithm/lib/repeat.d.ts", - "./node_modules/@phosphor/algorithm/lib/retro.d.ts", - "./node_modules/@phosphor/algorithm/lib/sort.d.ts", - "./node_modules/@phosphor/algorithm/lib/stride.d.ts", - "./node_modules/@phosphor/algorithm/lib/string.d.ts", - "./node_modules/@phosphor/algorithm/lib/take.d.ts", - "./node_modules/@phosphor/algorithm/lib/zip.d.ts", - "./node_modules/@phosphor/commands/lib/index.d.ts", - "./node_modules/@phosphor/coreutils/lib/index.d.ts", - "./node_modules/@phosphor/coreutils/lib/json.d.ts", - "./node_modules/@phosphor/coreutils/lib/mime.d.ts", - "./node_modules/@phosphor/coreutils/lib/promise.d.ts", - "./node_modules/@phosphor/coreutils/lib/random.d.ts", - "./node_modules/@phosphor/coreutils/lib/token.d.ts", - "./node_modules/@phosphor/coreutils/lib/uuid.d.ts", - "./node_modules/@phosphor/disposable/lib/index.d.ts", - "./node_modules/@phosphor/signaling/lib/index.d.ts", - "./node_modules/@rjsf/core/index.d.ts", - "./node_modules/@types/json-schema/index.d.ts", - "./node_modules/@types/node/assert.d.ts", - "./node_modules/@types/node/assert/strict.d.ts", - "./node_modules/@types/node/async_hooks.d.ts", - "./node_modules/@types/node/buffer.d.ts", - "./node_modules/@types/node/child_process.d.ts", - "./node_modules/@types/node/cluster.d.ts", - "./node_modules/@types/node/console.d.ts", - "./node_modules/@types/node/constants.d.ts", - "./node_modules/@types/node/crypto.d.ts", - "./node_modules/@types/node/dgram.d.ts", - "./node_modules/@types/node/diagnostics_channel.d.ts", - "./node_modules/@types/node/dns.d.ts", - "./node_modules/@types/node/dns/promises.d.ts", - "./node_modules/@types/node/domain.d.ts", - "./node_modules/@types/node/events.d.ts", - "./node_modules/@types/node/fs.d.ts", - "./node_modules/@types/node/fs/promises.d.ts", - "./node_modules/@types/node/globals.d.ts", - "./node_modules/@types/node/globals.global.d.ts", - "./node_modules/@types/node/http.d.ts", - "./node_modules/@types/node/http2.d.ts", - "./node_modules/@types/node/https.d.ts", - "./node_modules/@types/node/index.d.ts", - "./node_modules/@types/node/inspector.d.ts", - "./node_modules/@types/node/module.d.ts", - "./node_modules/@types/node/net.d.ts", - "./node_modules/@types/node/os.d.ts", - "./node_modules/@types/node/path.d.ts", - "./node_modules/@types/node/perf_hooks.d.ts", - "./node_modules/@types/node/process.d.ts", - "./node_modules/@types/node/punycode.d.ts", - "./node_modules/@types/node/querystring.d.ts", - "./node_modules/@types/node/readline.d.ts", - "./node_modules/@types/node/readline/promises.d.ts", - "./node_modules/@types/node/repl.d.ts", - "./node_modules/@types/node/stream.d.ts", - "./node_modules/@types/node/stream/consumers.d.ts", - "./node_modules/@types/node/stream/promises.d.ts", - "./node_modules/@types/node/stream/web.d.ts", - "./node_modules/@types/node/string_decoder.d.ts", - "./node_modules/@types/node/test.d.ts", - "./node_modules/@types/node/timers.d.ts", - "./node_modules/@types/node/timers/promises.d.ts", - "./node_modules/@types/node/tls.d.ts", - "./node_modules/@types/node/trace_events.d.ts", - "./node_modules/@types/node/tty.d.ts", - "./node_modules/@types/node/url.d.ts", - "./node_modules/@types/node/util.d.ts", - "./node_modules/@types/node/v8.d.ts", - "./node_modules/@types/node/vm.d.ts", - "./node_modules/@types/node/wasi.d.ts", - "./node_modules/@types/node/worker_threads.d.ts", - "./node_modules/@types/node/zlib.d.ts", - "./node_modules/@types/prop-types/index.d.ts", - "./node_modules/@types/react/global.d.ts", - "./node_modules/@types/react/index.d.ts", - "./node_modules/@types/scheduler/tracing.d.ts", - "./node_modules/csstype/index.d.ts", - "./node_modules/lib0/decoding.d.ts", - "./node_modules/lib0/encoding.d.ts", - "./node_modules/lib0/observable.d.ts", - "./node_modules/lib0/random.d.ts", - "./node_modules/popper.js/index.d.ts", - "./node_modules/typescript/lib/lib.dom.d.ts", - "./node_modules/typescript/lib/lib.dom.iterable.d.ts", - "./node_modules/typescript/lib/lib.es2015.collection.d.ts", - "./node_modules/typescript/lib/lib.es2015.core.d.ts", - "./node_modules/typescript/lib/lib.es2015.d.ts", - "./node_modules/typescript/lib/lib.es2015.generator.d.ts", - "./node_modules/typescript/lib/lib.es2015.iterable.d.ts", - "./node_modules/typescript/lib/lib.es2015.promise.d.ts", - "./node_modules/typescript/lib/lib.es2015.proxy.d.ts", - "./node_modules/typescript/lib/lib.es2015.reflect.d.ts", - "./node_modules/typescript/lib/lib.es2015.symbol.d.ts", - "./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", - "./node_modules/typescript/lib/lib.es2016.array.include.d.ts", - "./node_modules/typescript/lib/lib.es2016.d.ts", - "./node_modules/typescript/lib/lib.es2017.d.ts", - "./node_modules/typescript/lib/lib.es2017.full.d.ts", - "./node_modules/typescript/lib/lib.es2017.intl.d.ts", - "./node_modules/typescript/lib/lib.es2017.object.d.ts", - "./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", - "./node_modules/typescript/lib/lib.es2017.string.d.ts", - "./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", - "./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", - "./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", - "./node_modules/typescript/lib/lib.es2018.d.ts", - "./node_modules/typescript/lib/lib.es2018.intl.d.ts", - "./node_modules/typescript/lib/lib.es2018.promise.d.ts", - "./node_modules/typescript/lib/lib.es2018.regexp.d.ts", - "./node_modules/typescript/lib/lib.es2019.array.d.ts", - "./node_modules/typescript/lib/lib.es2019.d.ts", - "./node_modules/typescript/lib/lib.es2019.object.d.ts", - "./node_modules/typescript/lib/lib.es2019.string.d.ts", - "./node_modules/typescript/lib/lib.es2019.symbol.d.ts", - "./node_modules/typescript/lib/lib.es2020.bigint.d.ts", - "./node_modules/typescript/lib/lib.es2020.d.ts", - "./node_modules/typescript/lib/lib.es2020.intl.d.ts", - "./node_modules/typescript/lib/lib.es2020.promise.d.ts", - "./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", - "./node_modules/typescript/lib/lib.es2020.string.d.ts", - "./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", - "./node_modules/typescript/lib/lib.es5.d.ts", - "./node_modules/typescript/lib/lib.esnext.intl.d.ts", - "./node_modules/typescript/lib/lib.scripthost.d.ts", - "./node_modules/typescript/lib/lib.webworker.importscripts.d.ts", - "./node_modules/typestyle/lib/types.d.ts", - "./node_modules/typestyle/node_modules/csstype/index.d.ts", - "./node_modules/y-protocols/awareness.d.ts", - "./node_modules/y-websocket/dist/src/y-websocket.d.ts", - "./node_modules/yjs/dist/src/index.d.ts", - "./node_modules/yjs/dist/src/internals.d.ts", - "./node_modules/yjs/dist/src/structs/AbstractStruct.d.ts", - "./node_modules/yjs/dist/src/structs/ContentAny.d.ts", - "./node_modules/yjs/dist/src/structs/ContentBinary.d.ts", - "./node_modules/yjs/dist/src/structs/ContentDeleted.d.ts", - "./node_modules/yjs/dist/src/structs/ContentDoc.d.ts", - "./node_modules/yjs/dist/src/structs/ContentEmbed.d.ts", - "./node_modules/yjs/dist/src/structs/ContentFormat.d.ts", - "./node_modules/yjs/dist/src/structs/ContentJSON.d.ts", - "./node_modules/yjs/dist/src/structs/ContentString.d.ts", - "./node_modules/yjs/dist/src/structs/ContentType.d.ts", - "./node_modules/yjs/dist/src/structs/GC.d.ts", - "./node_modules/yjs/dist/src/structs/Item.d.ts", - "./node_modules/yjs/dist/src/structs/Skip.d.ts", - "./node_modules/yjs/dist/src/types/AbstractType.d.ts", - "./node_modules/yjs/dist/src/types/YArray.d.ts", - "./node_modules/yjs/dist/src/types/YMap.d.ts", - "./node_modules/yjs/dist/src/types/YText.d.ts", - "./node_modules/yjs/dist/src/types/YXmlElement.d.ts", - "./node_modules/yjs/dist/src/types/YXmlEvent.d.ts", - "./node_modules/yjs/dist/src/types/YXmlFragment.d.ts", - "./node_modules/yjs/dist/src/types/YXmlHook.d.ts", - "./node_modules/yjs/dist/src/types/YXmlText.d.ts", - "./node_modules/yjs/dist/src/utils/AbstractConnector.d.ts", - "./node_modules/yjs/dist/src/utils/DeleteSet.d.ts", - "./node_modules/yjs/dist/src/utils/Doc.d.ts", - "./node_modules/yjs/dist/src/utils/EventHandler.d.ts", - "./node_modules/yjs/dist/src/utils/ID.d.ts", - "./node_modules/yjs/dist/src/utils/PermanentUserData.d.ts", - "./node_modules/yjs/dist/src/utils/RelativePosition.d.ts", - "./node_modules/yjs/dist/src/utils/Snapshot.d.ts", - "./node_modules/yjs/dist/src/utils/StructStore.d.ts", - "./node_modules/yjs/dist/src/utils/Transaction.d.ts", - "./node_modules/yjs/dist/src/utils/UndoManager.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateDecoder.d.ts", - "./node_modules/yjs/dist/src/utils/UpdateEncoder.d.ts", - "./node_modules/yjs/dist/src/utils/YEvent.d.ts", - "./node_modules/yjs/dist/src/utils/encoding.d.ts", - "./node_modules/yjs/dist/src/utils/isParentOf.d.ts", - "./node_modules/yjs/dist/src/utils/logging.d.ts", - "./node_modules/yjs/dist/src/utils/updates.d.ts", - "./src/constants.ts", - "./src/deepcoder.ts", - "./src/index.ts", - "./src/utils.tsx" - ] - }, - "version": "4.1.6" -} \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/.eslintignore b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/.eslintignore deleted file mode 100644 index fffa32fdf63..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/.eslintignore +++ /dev/null @@ -1,8 +0,0 @@ -node_modules -dist -coverage -**/*.d.ts -tests - -**/__tests__ -ui-tests diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/.eslintrc.js b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/.eslintrc.js deleted file mode 100644 index 665374bf0ea..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/.eslintrc.js +++ /dev/null @@ -1,39 +0,0 @@ -module.exports = { - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/eslint-recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:prettier/recommended' - ], - parser: '@typescript-eslint/parser', - parserOptions: { - project: 'tsconfig.json', - sourceType: 'module' - }, - plugins: ['@typescript-eslint'], - rules: { - '@typescript-eslint/naming-convention': [ - 'error', - { - selector: 'interface', - format: ['PascalCase'], - custom: { - regex: '^I[A-Z]', - match: true - } - } - ], - '@typescript-eslint/no-unused-vars': ['warn', { args: 'none' }], - '@typescript-eslint/no-explicit-any': 'off', - '@typescript-eslint/no-namespace': 'off', - '@typescript-eslint/no-use-before-define': 'off', - '@typescript-eslint/quotes': [ - 'error', - 'single', - { avoidEscape: true, allowTemplateLiterals: false } - ], - curly: ['error', 'all'], - eqeqeq: 'error', - 'prefer-arrow-callback': 'error' - } -}; diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/.prettierignore b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/.prettierignore deleted file mode 100644 index 74d9f680374..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/.prettierignore +++ /dev/null @@ -1,5 +0,0 @@ -node_modules -**/node_modules -**/lib -**/package.json -neural_compressor_ext_lab_alibaba diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/.prettierrc b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/.prettierrc deleted file mode 100644 index d0824a69c14..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/.prettierrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "singleQuote": true, - "trailingComma": "none", - "arrowParens": "avoid", - "endOfLine": "auto" -} diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/.stylelintrc b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/.stylelintrc deleted file mode 100644 index 0e1ff30327c..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/.stylelintrc +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": [ - "stylelint-config-recommended", - "stylelint-config-standard", - "stylelint-prettier/recommended" - ], - "rules": { - "property-no-vendor-prefix": null, - "selector-no-vendor-prefix": null, - "value-no-vendor-prefix": null - } -} diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/CHANGELOG.md b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/CHANGELOG.md deleted file mode 100644 index 2d352af421a..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/CHANGELOG.md +++ /dev/null @@ -1,5 +0,0 @@ -# Changelog - - - - diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/DEVELOP.md b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/DEVELOP.md deleted file mode 100644 index f469c541684..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/DEVELOP.md +++ /dev/null @@ -1,59 +0,0 @@ -# neural_compressor_ext_lab_alibaba - -A JupyterLab extension. - -## Requirements - -- JupyterLab >= 3.0 - -## Contributing - -### Development install - -Note: You will need NodeJS to build the extension package. - -The `jlpm` command is JupyterLab's pinned version of -[yarn](https://yarnpkg.com/) that is installed with JupyterLab. You may use -`yarn` or `npm` in lieu of `jlpm` below. - -```bash -# Clone the repo to your local environment -# Change directory to the neural_compressor_ext_lab_alibaba directory -# Install package in development mode -pip install -e . -# Link your development version of the extension with JupyterLab -jupyter labextension develop . --overwrite -# Rebuild extension Typescript source after making changes -jlpm build -``` - -You can watch the source directory and run JupyterLab at the same time in different terminals to watch for changes in the extension's source and automatically rebuild the extension. - -```bash -# Watch the source directory in one terminal, automatically rebuilding when needed -jlpm watch -# Run JupyterLab in another terminal -jupyter lab -``` - -With the watch command running, every saved change will immediately be built locally and available in your running JupyterLab. Refresh JupyterLab to load the change in your browser (you may need to wait several seconds for the extension to be rebuilt). - -By default, the `jlpm build` command generates the source maps for this extension to make it easier to debug using the browser dev tools. To also generate source maps for the JupyterLab core extensions, you can run the following command: - -```bash -jupyter lab build --minimize=False -``` - -### Development uninstall - -```bash -pip uninstall neural_compressor_ext_lab_alibaba -``` - -In development mode, you will also need to remove the symlink created by `jupyter labextension develop` -command. To find its location, you can run `jupyter labextension list` to figure out where the `labextensions` -folder is located. Then you can remove the symlink named `neural_compressor_ext_lab_alibaba` within that folder. - -### Packaging the extension - -See [RELEASE](RELEASE.md) diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/LICENSE b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/LICENSE deleted file mode 100644 index dc6287b0a4d..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -BSD 3-Clause License - -Copyright (c) 2022, Neural_Coder -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/MANIFEST.in b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/MANIFEST.in deleted file mode 100644 index 64a9817c7cd..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/MANIFEST.in +++ /dev/null @@ -1,24 +0,0 @@ -include LICENSE -include *.md -include pyproject.toml - -include package.json -include install.json -include ts*.json -include yarn.lock - -graft neural_compressor_ext_lab_alibaba/labextension - -# Javascript files -graft src -graft style -prune **/node_modules -prune lib -prune binder - -# Patterns to exclude from any directory -global-exclude *~ -global-exclude *.pyc -global-exclude *.pyo -global-exclude .git -global-exclude .ipynb_checkpoints diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/PKG-INFO b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/PKG-INFO deleted file mode 100644 index a6fbb58be34..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/PKG-INFO +++ /dev/null @@ -1,130 +0,0 @@ -Metadata-Version: 2.1 -Name: neural_compressor_ext_lab_alibaba -Version: 0.1.0 -Summary: A JupyterLab extension. -Project-URL: Homepage, https://github.com/intel-sandbox/neural-coder/tree/lab_ext_ts/neural_coder/extensions -Project-URL: Bug Tracker, https://github.com/intel-sandbox/neural-coder/tree/lab_ext_ts/neural_coder/extensions/issues -Project-URL: Repository, https://github.com/intel-sandbox/neural-coder/tree/lab_ext_ts/neural_coder/extensions.git -Author-email: Neural_Coder -License: BSD 3-Clause License - - Copyright (c) 2022, Neural_Coder - All rights reserved. - - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. Neither the name of the copyright holder nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -License-File: LICENSE -Classifier: Framework :: Jupyter -Classifier: Framework :: Jupyter :: JupyterLab -Classifier: Framework :: Jupyter :: JupyterLab :: 3 -Classifier: Framework :: Jupyter :: JupyterLab :: Extensions -Classifier: Framework :: Jupyter :: JupyterLab :: Extensions :: Prebuilt -Classifier: License :: OSI Approved :: BSD License -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Requires-Python: >=3.6 -Provides-Extra: test -Description-Content-Type: text/markdown - -# neural_compressor_ext_lab_alibaba - -[![Github Actions Status](https://github.com/intel-sandbox/neural-coder/tree/lab_ext_ts/neural_coder/extensions/workflows/Build/badge.svg)](https://github.com/intel-sandbox/neural-coder/tree/lab_ext_ts/neural_coder/extensions/actions/workflows/build.yml)[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/intel-sandbox/neural-coder/tree/lab_ext_ts/neural_coder/extensions/main?urlpath=lab) -A JupyterLab extension. - -## Requirements - -- JupyterLab >= 3.0 - -## Install - -To install the extension, execute: - -```bash -pip install neural_compressor_ext_lab_alibaba -``` - -## Uninstall - -To remove the extension, execute: - -```bash -pip uninstall neural_compressor_ext_lab_alibaba -``` - -## Contributing - -### Development install - -Note: You will need NodeJS to build the extension package. - -The `jlpm` command is JupyterLab's pinned version of -[yarn](https://yarnpkg.com/) that is installed with JupyterLab. You may use -`yarn` or `npm` in lieu of `jlpm` below. - -```bash -# Clone the repo to your local environment -# Change directory to the neural_compressor_ext_lab_alibaba directory -# Install package in development mode -pip install -e . -# Link your development version of the extension with JupyterLab -jupyter labextension develop . --overwrite -# Rebuild extension Typescript source after making changes -jlpm build -``` - -You can watch the source directory and run JupyterLab at the same time in different terminals to watch for changes in the extension's source and automatically rebuild the extension. - -```bash -# Watch the source directory in one terminal, automatically rebuilding when needed -jlpm watch -# Run JupyterLab in another terminal -jupyter lab -``` - -With the watch command running, every saved change will immediately be built locally and available in your running JupyterLab. Refresh JupyterLab to load the change in your browser (you may need to wait several seconds for the extension to be rebuilt). - -By default, the `jlpm build` command generates the source maps for this extension to make it easier to debug using the browser dev tools. To also generate source maps for the JupyterLab core extensions, you can run the following command: - -```bash -jupyter lab build --minimize=False -``` - -### Development uninstall - -```bash -pip uninstall neural_compressor_ext_lab_alibaba -``` - -In development mode, you will also need to remove the symlink created by `jupyter labextension develop` -command. To find its location, you can run `jupyter labextension list` to figure out where the `labextensions` -folder is located. Then you can remove the symlink named `neural_compressor_ext_lab_alibaba` within that folder. - -### Packaging the extension - -See [RELEASE](RELEASE.md) diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/RELEASE.md b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/RELEASE.md deleted file mode 100644 index 0ee2050c023..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/RELEASE.md +++ /dev/null @@ -1,61 +0,0 @@ -# Making a new release of neural_compressor_ext_lab_alibaba - -The extension can be published to `PyPI` and `npm` manually or using the [Jupyter Releaser](https://github.com/jupyter-server/jupyter_releaser). - -## Manual release - -### Python package - -This extension can be distributed as Python -packages. All of the Python -packaging instructions in the `pyproject.toml` file to wrap your extension in a -Python package. Before generating a package, we first need to install `build`. - -```bash -pip install build twine hatch -``` - -To create a Python source package (`.tar.gz`) and the binary package (`.whl`) in the `dist/` directory, do: - -```bash -python -m build -``` - -> `python setup.py sdist bdist_wheel` is deprecated and will not work for this package. - -Then to upload the package to PyPI, do: - -```bash -twine upload dist/* -``` - -### NPM package - -To publish the frontend part of the extension as a NPM package, do: - -```bash -npm login -npm publish --access public -``` - -## Automated releases with the Jupyter Releaser - -The extension repository should already be compatible with the Jupyter Releaser. - -Check out the [workflow documentation](https://github.com/jupyter-server/jupyter_releaser#typical-workflow) for more information. - -Here is a summary of the steps to cut a new release: - -- Fork the [`jupyter-releaser` repo](https://github.com/jupyter-server/jupyter_releaser) -- Add `ADMIN_GITHUB_TOKEN`, `PYPI_TOKEN` and `NPM_TOKEN` to the Github Secrets in the fork -- Go to the Actions panel -- Run the "Draft Changelog" workflow -- Merge the Changelog PR -- Run the "Draft Release" workflow -- Run the "Publish Release" workflow - -## Publishing to `conda-forge` - -If the package is not on conda forge yet, check the documentation to learn how to add it: https://conda-forge.org/docs/maintainer/adding_pkgs.html - -Otherwise a bot should pick up the new version publish to PyPI, and open a new PR on the feedstock repository automatically. diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/binder/environment.yml b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/binder/environment.yml deleted file mode 100644 index 953736aa9f6..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/binder/environment.yml +++ /dev/null @@ -1,21 +0,0 @@ -# a mybinder.org-ready environment for demoing neural_compressor_ext_lab_alibaba -# this environment may also be used locally on Linux/MacOS/Windows, e.g. -# -# conda env update --file binder/environment.yml -# conda activate neural-compressor-ext-lab-alibaba-demo -# -name: neural-compressor-ext-lab-alibaba-demo - -channels: - - conda-forge - -dependencies: - # runtime dependencies - - python >=3.8,<3.9.0a0 - - jupyterlab >=3,<4.0.0a0 - # labextension build dependencies - - nodejs >=14,<15 - - pip - - wheel - # additional packages for demos - # - ipywidgets diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/binder/postBuild b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/binder/postBuild deleted file mode 100755 index ff83152d38c..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/binder/postBuild +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env python3 -""" perform a development install of neural_compressor_ext_lab_alibaba - - On Binder, this will run _after_ the environment has been fully created from - the environment.yml in this directory. - - This script should also run locally on Linux/MacOS/Windows: - - python3 binder/postBuild -""" -import subprocess -import sys -from pathlib import Path - - -ROOT = Path.cwd() - -def _(*args, **kwargs): - """ Run a command, echoing the args - - fails hard if something goes wrong - """ - print("\n\t", " ".join(args), "\n") - return_code = subprocess.call(args, **kwargs) - if return_code != 0: - print("\nERROR", return_code, " ".join(args)) - sys.exit(return_code) - -# verify the environment is self-consistent before even starting -_(sys.executable, "-m", "pip", "check") - -# install the labextension -_(sys.executable, "-m", "pip", "install", "-e", ".") -_(sys.executable, "-m", "jupyter", "labextension", "develop", "--overwrite", ".") - -# verify the environment the extension didn't break anything -_(sys.executable, "-m", "pip", "check") - -# list the extensions -_("jupyter", "server", "extension", "list") - -# initially list installed extensions to determine if there are any surprises -_("jupyter", "labextension", "list") - - -print("JupyterLab with neural_compressor_ext_lab_alibaba is ready to run with:\n") -print("\tjupyter lab\n") diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/install.json b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/install.json deleted file mode 100644 index 88b31057db0..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/install.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "packageManager": "python", - "packageName": "neural_compressor_ext_lab_alibaba", - "uninstallInstructions": "Use your Python package manager (pip, conda, etc.) to uninstall the package neural_compressor_ext_lab_alibaba" -} diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/constants.d.ts b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/constants.d.ts deleted file mode 100644 index 071e86ae2c1..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/constants.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -export declare namespace Constants { - const SHORT_PLUGIN_NAME = "neural_compressor_ext_lab"; - const WORK_PATH = "neural_coder_workspace/"; - const ICON_FORMAT_ALL_SVG = ""; - const ICON_RUN = ""; - const SVG = ""; - const LONG_PLUGIN_NAME: string; - const SETTINGS_SECTION: string; - const COMMAND_SECTION_NAME = "Jupyterlab Code Optimizer"; - const PLUGIN_VERSION = "0.1.0"; -} diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/constants.js b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/constants.js deleted file mode 100644 index 1735f2d0bcb..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/constants.js +++ /dev/null @@ -1,16 +0,0 @@ -export var Constants; -(function (Constants) { - Constants.SHORT_PLUGIN_NAME = 'neural_compressor_ext_lab'; - // const processs = require('process') - // export const WORK_PATH = processs.env.HOME + "/lab_workspace/" - // const os = require('os'); - // export const WORK_PATH = os.homedir + "/lab_workspace/" - Constants.WORK_PATH = 'neural_coder_workspace/'; - Constants.ICON_FORMAT_ALL_SVG = ''; - Constants.ICON_RUN = ''; - Constants.SVG = ''; - Constants.LONG_PLUGIN_NAME = `@rya/${Constants.SHORT_PLUGIN_NAME}`; - Constants.SETTINGS_SECTION = `${Constants.LONG_PLUGIN_NAME}:settings`; - Constants.COMMAND_SECTION_NAME = 'Jupyterlab Code Optimizer'; - Constants.PLUGIN_VERSION = '0.1.0'; -})(Constants || (Constants = {})); diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/deepcoder.d.ts b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/deepcoder.d.ts deleted file mode 100644 index dcf8ddfba2a..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/deepcoder.d.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Cell, CodeCell } from '@jupyterlab/cells'; -import { ToolbarButton } from '@jupyterlab/apputils'; -import { Widget } from '@lumino/widgets'; -import { INotebookTracker, NotebookPanel, Notebook } from '@jupyterlab/notebook'; -declare class JupyterlabCodeOptimizer { - protected working: boolean; - protected panel: NotebookPanel; - private tmp_path; - log_path: string; - tmp_log_path: string; - rand: number; - markdown: Cell | undefined; - cells: CodeCell[]; - constructor(panel: NotebookPanel); - optimizeCode(code: string[], formatter: string, name: string, next: string, options: string | undefined, notebook: boolean, panel: NotebookPanel, cell: CodeCell, run?: ToolbarButton | undefined): Promise; -} -export declare class JupyterlabNotebookCodeOptimizer extends JupyterlabCodeOptimizer { - protected notebookname: string; - protected notebookTracker: INotebookTracker; - constructor(notebookTracker: INotebookTracker, panel: NotebookPanel); - optimizeAction(config: any, formatter?: string): Promise; - optimizeAllCodeCells(config?: string, formatter?: string, notebook?: Notebook, run?: ToolbarButton): Promise; - private getCodeCells; - private optimizeCells; - applicable(formatter: string, currentWidget: Widget): boolean | null; -} -export {}; diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/deepcoder.js b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/deepcoder.js deleted file mode 100644 index 2c0d221d59a..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/deepcoder.js +++ /dev/null @@ -1,268 +0,0 @@ -import { NotebookActions } from '@jupyterlab/notebook'; -import NotebookUtilities from "./utils"; -import { Constants } from './constants'; -class JupyterlabCodeOptimizer { - constructor(panel) { - this.working = false; - this.panel = panel; - console.log("path,,,", Constants.WORK_PATH); - this.tmp_path = Constants.WORK_PATH + "tmp.py"; - this.rand = NotebookUtilities.GetRandomNum(0, 200); - this.log_path = Constants.WORK_PATH + "NeuralCoder" + this.rand + ".log"; - this.tmp_log_path = Constants.WORK_PATH + "NeuralCoder_tmp" + ".log"; - this.cells = []; - } - async optimizeCode(code, formatter, name, next, options, notebook, panel, cell, run) { - let codes = []; - code.forEach(function (value) { - value = value.replace(/('\\n')/g, '^^^'); - value = value.replace(/\\n"/g, '###'); - value = value.replace(/\\n'/g, '###'); - value = value.replace(/"\\n/g, '@@'); - value = value.replace(/'\\n/g, '@@'); - value = value.replace(/\n/g, '\\n'); - value = value.replace(/"/g, '+++'); - value = value.replace(/,/g, '$'); - codes.push(value); - }); - let gen_code = `code = "${codes}"\ncodes = code.split(',')\nwith open( '${this.tmp_path}', 'w+' ) as f:\n for i in range(0,len(codes)):\n f.write('# this is the beginning of a single code snippet\\n')\n code_list = codes[i].replace('$',',').replace('+++','\"').split('\\n')\n for line in code_list:\n if('split(^^^)' in line):\n line=line.replace('split(^^^)', 'split(\\'\\\\n\\')')\n if('###' in line):\n line=line.replace('###', '\\\\n\"')\n if('@@' in line):\n line=line.replace('@@', '\"\\\\n')\n f.write(line+'\\n')`; - const expr = { code_list: `code_list` }; - NotebookUtilities.sendKernelRequestFromNotebook(panel, gen_code, expr, false); - if (options === 'normal') { - let runcode = `from neural_coder import enable\nenable(code="${this.tmp_path}",features=["${formatter}"], overwrite=True)`; - let expr = { sum: ` ` }; - NotebookUtilities.sendKernelRequestFromNotebook(panel, runcode, expr, false); - let run_code1 = `with open("${this.tmp_path}", 'r') as f:\n optimized_code = f.read()\n`; - let expr1 = { optimizedCode: "optimized_code" }; - let result2 = NotebookUtilities.sendKernelRequestFromNotebook(panel, run_code1, expr1, false); - result2.then(value => { - var _a, _b, _c, _d; - let optimizedTexts = Object.values(value.optimizedCode.data)[0]; - let optimizeCodes = optimizedTexts.split('# this is the beginning of a single code snippet\\n').slice(1); - optimizeCodes[optimizeCodes.length - 1] = optimizeCodes[optimizeCodes.length - 1].slice(0, -3); - for (let i = 0; i < optimizeCodes.length; ++i) { - const cell = this.cells[i]; - const currentTexts = this.cells.map(cell => cell.model.value.text); - const currentText = currentTexts[i]; - let optimizedtext = optimizeCodes[i]; - optimizedtext = optimizedtext.replace(/\\'\\\\n\\'/g, "^^^"); - optimizedtext = optimizedtext.replace(/\\\\n"/g, "+++"); - optimizedtext = optimizedtext.replace(/\\\\n'/g, "+++"); - optimizedtext = optimizedtext.replace(/"\\\\n/g, "@@@"); - optimizedtext = optimizedtext.replace(/'\\\\n/g, "@@@"); - optimizedtext = optimizedtext.replace(/\\n/g, '\n'); - optimizedtext = optimizedtext.replace(/\\'/g, "'"); - optimizedtext = optimizedtext.replace(/\^\^\^/g, "'\\n'"); - optimizedtext = optimizedtext.replace(/\+\+\+/g, "\\n\""); - optimizedtext = optimizedtext.replace(/\@\@\@/g, "\"\\n"); - if (cell.model.value.text === currentText) { - cell.model.value.text = optimizedtext; - } - const run_svg = document.createElement("svg"); - run_svg.innerHTML = Constants.ICON_RUN; - (_d = (_c = (_b = (_a = run === null || run === void 0 ? void 0 : run.node.firstChild) === null || _a === void 0 ? void 0 : _a.firstChild) === null || _b === void 0 ? void 0 : _b.firstChild) === null || _c === void 0 ? void 0 : _c.firstChild) === null || _d === void 0 ? void 0 : _d.replaceWith(run_svg); - } - }); - } - else { - if (formatter === '') { - if (this.markdown) { - this.markdown.model.value.text += "[NeuralCoder INFO] Enabling and Benchmarking for The Original Model ...... \n"; - } - let runcode1 = `with open("${this.log_path}", 'a' ) as f:\n f.write("[NeuralCoder INFO] Enabling and Benchmarking for The Original Model ......\\n")`; - let expr1 = { path: "" }; - NotebookUtilities.sendKernelRequestFromNotebook(panel, runcode1, expr1, false); - let runcode = `from neural_coder import enable\nperfomance, mode, path = enable(code="${this.tmp_path}",features=[], run_bench=True, args="${options}")\nwith open(path + '/bench.log', 'r') as f:\n logs = f.readlines()\nlog_line = logs[4]\nlog = log_line.split("[")[1].split("]")[0]`; - let expr = { path: "path", log: "log" }; - let result = NotebookUtilities.sendKernelRequestFromNotebook(panel, runcode, expr, false); - let fps; - result.then(value => { - fps = Object.values(value.log.data)[0]; - if (this.markdown) { - this.markdown.model.value.text += `[NeuralCoder INFO] Benchmark Result (Performance) of The Original Model is ${fps} (FPS) \n`; - } - let text = `[NeuralCoder INFO] Benchmark Result (Performance) of The Original Model is ${fps} (FPS)\\n`; - let runcode = `with open("${this.log_path}", 'a' ) as f:\n f.write("${text}")`; - let expr = { path: "" }; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode, expr, false); - if (this.markdown) { - this.markdown.model.value.text += `[NeuralCoder INFO] Enabling and Benchmarking for ${next} ...... \n`; - } - let runcode1 = `with open("${this.log_path}", 'a' ) as f:\n f.write("[NeuralCoder INFO] Enabling and Benchmarking for ${next} ......\\n")`; - let expr1 = { path: "" }; - NotebookUtilities.sendKernelRequestFromNotebook(panel, runcode1, expr1, false); - let runcode2 = `with open("${this.tmp_log_path}", 'a' ) as f:\n f.write("${text}")`; - let expr2 = { path: "" }; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode2, expr2, false); - }); - } - else { - let runcode = `from neural_coder import enable\nperfomance, mode, path = enable(code="${this.tmp_path}", features=["${formatter}"], run_bench=True, args="${options}")\nwith open(path + '/bench.log', 'r') as f:\n logs = f.readlines()\nlog_line = logs[4]\nlog = log_line.split("[")[1].split("]")[0]`; - let expr = { path: "path", log: "log" }; - let result = NotebookUtilities.sendKernelRequestFromNotebook(panel, runcode, expr, false); - let fps; - result.then(value => { - fps = Object.values(value.log.data)[0]; - if (this.markdown) { - this.markdown.model.value.text += `[NeuralCoder INFO] Benchmark Result (Performance) of ${name} is ${fps} (FPS) \n`; - } - let text = `[NeuralCoder INFO] Benchmark Result (Performance) of ${name} is ${fps} (FPS)\\n`; - let runcode = `with open("${this.log_path}", 'a' ) as f:\n f.write("${text}")`; - let expr = { path: "" }; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode, expr, false); - if (next !== '') { - if (this.markdown) { - this.markdown.model.value.text += `[NeuralCoder INFO] Enabling and Benchmarking for ${next} ...... \n`; - } - let runcode2 = `with open("${this.log_path}", 'a' ) as f:\n f.write("[NeuralCoder INFO] Enabling and Benchmarking for ${next} ......\\n")`; - let expr2 = { path: "" }; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode2, expr2, false); - } - let runcode2 = `with open("${this.tmp_log_path}", 'a' ) as f:\n f.write("${text}")`; - let expr2 = { path: "" }; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode2, expr2, false); - if (formatter === 'pytorch_aliblade') { - let read_log = `import re\nwith open("${this.tmp_log_path}", 'r') as f:\n logs = f.readlines()\n fps_list=[]\n for log_line in logs[-2:]:\n pat = r\'\\d+\\.?\\d+'\n fps = re.search(pat,log_line).group()\n fps_list.append(float(fps))\nmaxi = max(fps_list)\nindex = fps_list.index(maxi)\nboost = round(maxi/fps_list[0],1)\nfeatures=['','pytorch_aliblade',]\nfeature_name=['','Alibaba Blade-DISC']\nbest_feature = features[index]\nbest_name = feature_name[index]\n`; - let read_expr = { boost: "boost", best_feature: "best_feature", best_name: "best_name" }; - let read_result = NotebookUtilities.sendKernelRequestFromNotebook(this.panel, read_log, read_expr, false); - read_result.then(value => { - var _a, _b, _c, _d; - console.log("resresres", value); - let boost = Object.values(value.boost.data)[0]; - let best_name = Object.values(value.best_name.data)[0]; - // let optimizedTexts = Object.values(value.optimizeCode.data)[0] as string - // let optimizeCodes = optimizedTexts.split('# this is the beginning of a single code snippet\\n').slice(1,) - if (this.markdown) { - this.markdown.model.value.text += `[NeuralCoder INFO] The Best Intel Optimization: ${best_name} \n`; - this.markdown.model.value.text += `[NeuralCoder INFO] You can get up to ${boost}X performance boost. \n`; - } - // optimizeCodes[optimizeCodes.length-1] = optimizeCodes[optimizeCodes.length-1].slice(0,-3) - // for (let i = 0; i < optimizeCodes.length; ++i) { - // const cell = this.cells[i]; - // const currentTexts = this.cells.map(cell => cell.model.value.text); - // const currentText = currentTexts[i]; - // let optimizedtext = optimizeCodes[i]; - // optimizedtext = optimizedtext.replace(/\\'\\\\n\\'/g, "^^^") - // optimizedtext = optimizedtext.replace(/\\\\n"/g, "+++") - // optimizedtext = optimizedtext.replace(/\\\\n'/g, "+++") - // optimizedtext = optimizedtext.replace(/"\\\\n/g, "@@@") - // optimizedtext = optimizedtext.replace(/'\\\\n/g, "@@@") - // optimizedtext = optimizedtext.replace(/\\n/g,'\n') - // optimizedtext = optimizedtext.replace(/\\'/g,"'") - // optimizedtext = optimizedtext.replace(/\^\^\^/g, "'\\n'") - // optimizedtext = optimizedtext.replace(/\+\+\+/g, "\\n\"") - // optimizedtext = optimizedtext.replace(/\@\@\@/g, "\"\\n") - // if (cell.model.value.text === currentText) { - // cell.model.value.text = optimizedtext; - // } - // } - let command = "lscpu | grep 'Model name'"; - let get_hardware = `import subprocess\nsubp = subprocess.Popen("${command}",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding="utf-8")\nsubp.wait(2)\nhardware = subp.communicate()[0].replace("Model name:","").strip()`; - let expr_hardware = { hardware: "hardware" }; - let hard_res = NotebookUtilities.sendKernelRequestFromNotebook(this.panel, get_hardware, expr_hardware, false); - hard_res.then(value => { - let hard = Object.values(value.hardware.data)[0]; - if (this.markdown) { - this.markdown.model.value.text += `[NeuralCoder INFO] HardWare: ${hard} \n`; - this.markdown.model.value.text += `[NeuralCoder INFO] The log was saved to neural_coder_workspace\\NeuralCoder${this.rand}.log \n`; - } - }); - const run_svg = document.createElement("svg"); - run_svg.innerHTML = Constants.ICON_RUN; - (_d = (_c = (_b = (_a = run === null || run === void 0 ? void 0 : run.node.firstChild) === null || _a === void 0 ? void 0 : _a.firstChild) === null || _b === void 0 ? void 0 : _b.firstChild) === null || _c === void 0 ? void 0 : _c.firstChild) === null || _d === void 0 ? void 0 : _d.replaceWith(run_svg); - }); - } - }); - } - } - } -} -export class JupyterlabNotebookCodeOptimizer extends JupyterlabCodeOptimizer { - constructor(notebookTracker, panel) { - super(panel); - this.notebookTracker = notebookTracker; - this.notebookname = ''; - } - async optimizeAction(config, formatter) { - return this.optimizeCells(true, config, formatter); - } - async optimizeAllCodeCells(config, formatter, notebook, run) { - return this.optimizeCells(false, config, formatter, notebook, run); - } - getCodeCells(ifMarkdown = true, notebook) { - if (!this.notebookTracker.currentWidget) { - return []; - } - const codeCells = []; - notebook = notebook || this.notebookTracker.currentWidget.content; - this.notebookname = notebook.title.label; - let count = 0; - notebook.widgets.forEach((cell) => { - if (cell.model.type === 'code') { - count += 1; - codeCells.push(cell); - } - }); - if (ifMarkdown) { - NotebookActions.insertBelow(notebook); - this.notebookTracker.currentWidget.content.activeCellIndex = count + 1; - NotebookActions.changeCellType(notebook, 'markdown'); - const activeCell = notebook.activeCell; - if (activeCell) { - this.markdown = activeCell; - } - } - this.cells = codeCells; - return codeCells; - } - async optimizeCells(selectedOnly, config, formatter, notebook, run) { - if (this.working) { - return new Promise((resolve, reject) => { - resolve("false!"); - }); - } - this.working = true; - const optimize_type = formatter !== undefined ? formatter : 'pytorch_aliblade'; - if (optimize_type === 'auto') { - selectedOnly = true; - } - else { - selectedOnly = false; - } - const selectedCells = this.getCodeCells(selectedOnly, notebook); - let cell = selectedCells[selectedCells.length - 1]; - if (selectedCells.length === 0) { - this.working = false; - return new Promise((resolve, reject) => { - resolve("false!"); - }); - } - const currentTexts = selectedCells.map(cell => cell.model.value.text); - if (optimize_type === 'auto') { - if (this.markdown) { - // this.markdown.model.value.text = `[NeuralCoder INFO] Auto-Quant Started ...... \n`; - this.markdown.model.value.text += `[NeuralCoder INFO] Code: User code from Jupyter Lab notebook "${this.notebookname}" \n`; - this.markdown.model.value.text += `[NeuralCoder INFO] Benchmark Mode: Throughput \n`; - } - let runcode2 = `with open('${this.log_path}', 'a' ) as f:\n f.write("[NeuralCoder INFO] Code: User code from Jupyter Lab notebook '${this.notebookname}'\\n")`; - let expr2 = { path: "" }; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode2, expr2, false); - let runcode3 = `with open('${this.log_path}', 'a' ) as f:\n f.write("[NeuralCoder INFO] Benchmark Mode: Throughput\\n")`; - let expr3 = { path: "" }; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode3, expr3, false); - await this.optimizeCode(currentTexts, '', 'The Original Model', 'Alibaba-Blade', config, true, this.panel, cell, run); - await this.optimizeCode(currentTexts, 'pytorch_aliblade', 'Alibaba-Blade', '', config, true, this.panel, cell, run); - } - else { - await this.optimizeCode(currentTexts, optimize_type, "", "", "normal", true, this.panel, cell, run); - } - this.working = false; - return new Promise((resolve, reject) => { - resolve("success!"); - }); - } - applicable(formatter, currentWidget) { - const currentNotebookWidget = this.notebookTracker.currentWidget; - return currentNotebookWidget && currentWidget === currentNotebookWidget; - } -} diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/index.d.ts b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/index.d.ts deleted file mode 100644 index f256eada9ba..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/index.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { JupyterFrontEndPlugin } from '@jupyterlab/application'; -/** - * Initialization data for the neural_compressor_ext_lab extension. - */ -declare const plugin: JupyterFrontEndPlugin; -export default plugin; diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/index.js b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/index.js deleted file mode 100644 index 67e449a4dc4..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/index.js +++ /dev/null @@ -1,95 +0,0 @@ -import { INotebookTracker } from '@jupyterlab/notebook'; -import { ToolbarButton, showDialog, Dialog } from '@jupyterlab/apputils'; -import { ISettingRegistry } from '@jupyterlab/settingregistry'; -import { IMainMenu } from '@jupyterlab/mainmenu'; -import { LabIcon } from '@jupyterlab/ui-components'; -import { Widget } from '@lumino/widgets'; -import { JupyterlabNotebookCodeOptimizer } from './deepcoder'; -import { Constants } from './constants'; -class neural_compressor_ext_lab { - constructor(app, tracker, notebookpanel) { - this.app = app; - this.tracker = tracker; - this.notebookpanel = notebookpanel; - this.setupWidgetExtension(); - this.config = ''; - } - createNew(nb) { - this.notebookpanel = nb; - this.notebookCodeOptimizer = new JupyterlabNotebookCodeOptimizer(this.tracker, this.notebookpanel); - const svg = document.createElement("svg"); - svg.innerHTML = Constants.ICON_FORMAT_ALL_SVG; - const run_svg = document.createElement("svg"); - run_svg.innerHTML = Constants.ICON_RUN; - const div = document.createElement("div"); - div.setAttribute("class", "wrapper"); - const span = document.createElement("span"); - span.setAttribute("class", "f1ozlkqi"); - span.innerHTML = Constants.SVG; - const selector = document.createElement("select"); - selector.setAttribute("class", "aselector"); - selector.id = "NeuralCoder"; - const option1 = document.createElement("option"); - option1.value = "pytorch_aliblade"; - option1.innerText = "Alibaba Blade-DISC"; - const option2 = document.createElement("option"); - option2.value = "auto"; - option2.innerText = "Auto Benchmark"; - option1.selected = true; - selector.options.add(option1); - selector.options.add(option2); - div.appendChild(selector); - div.appendChild(span); - const selector_widget = new Widget(); - selector_widget.node.appendChild(div); - selector_widget.addClass("aselector"); - let notebookCodeOptimizer = this.notebookCodeOptimizer; - let config = this.config; - const dia_input = document.createElement("input"); - const dia_widget = new Widget(); - dia_widget.node.appendChild(dia_input); - dia_widget.addClass("dialog"); - const run_button = new ToolbarButton({ - tooltip: 'NeuralCoder', - icon: new LabIcon({ - name: "run", - svgstr: Constants.ICON_RUN - }), - onClick: async function () { - var _a, _b, _c, _d; - (_d = (_c = (_b = (_a = run_button.node.firstChild) === null || _a === void 0 ? void 0 : _a.firstChild) === null || _b === void 0 ? void 0 : _b.firstChild) === null || _c === void 0 ? void 0 : _c.firstChild) === null || _d === void 0 ? void 0 : _d.replaceWith(svg); - if (selector.options[selector.selectedIndex].value === 'auto') { - await showDialog({ - title: 'Please input execute parameters:', - body: dia_widget, - buttons: [Dialog.okButton({ label: 'Confirm' })] - }).then(result => { - if (result.button.accept) { - config = dia_input.value; - } - }); - } - await notebookCodeOptimizer.optimizeAllCodeCells(config, selector.options[selector.selectedIndex].value, undefined, run_button); - } - }); - nb.toolbar.insertItem(11, "nc", run_button); - nb.toolbar.insertItem(12, "selector", selector_widget); - } - setupWidgetExtension() { - this.app.docRegistry.addWidgetExtension('Notebook', this); - } -} -/** - * Initialization data for the neural_compressor_ext_lab extension. - */ -const plugin = { - id: 'neural_compressor_ext_lab:plugin', - autoStart: true, - requires: [INotebookTracker, IMainMenu], - optional: [ISettingRegistry], - activate: (app, tracker, notebookpanel) => { - new neural_compressor_ext_lab(app, tracker, notebookpanel); - console.log('JupyterLab extension neural_compressor_ext_lab is activated!'); - } -}; -export default plugin; diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/test.d.ts b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/test.d.ts deleted file mode 100644 index cb0ff5c3b54..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/test.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/test.js b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/test.js deleted file mode 100644 index f6d0eee3a16..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/test.js +++ /dev/null @@ -1,4 +0,0 @@ -const processs = require('process'); -console.log(processs.env.HOME + "lab_workspace/"); -import { homedir } from 'os'; -console.log(homedir); diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/utils.d.ts b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/utils.d.ts deleted file mode 100644 index 8b7a2173767..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/utils.d.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { NotebookPanel } from '@jupyterlab/notebook'; -import { Kernel } from '@jupyterlab/services'; -import { CommandRegistry } from '@phosphor/commands'; -export default class NotebookUtilities { - /** - * generate random number - * @Min - * @Max - */ - static GetRandomNum(Min: number, Max: number): number; - /** - * Builds an HTML container by sanitizing a list of strings and converting - * them in valid HTML - * @param msg A list of string with HTML formatting - * @returns a HTMLDivElement composed of a list of spans with formatted text - */ - private static buildDialogBody; - /** - * Opens a pop-up dialog in JupyterLab to display a simple message. - * @param title The title for the message popup - * @param msg The message as an array of strings - * @param buttonLabel The label to use for the button. Default is 'OK' - * @param buttonClassName The classname to give to the 'ok' button - * @returns Promise - A promise once the message is closed. - */ - static showMessage(title: string, msg: string[], buttonLabel?: string, buttonClassName?: string): Promise; - /** - * Opens a pop-up dialog in JupyterLab to display a yes/no dialog. - * @param title The title for the message popup - * @param msg The message - * @param acceptLabel The label to use for the accept button. Default is 'YES' - * @param rejectLabel The label to use for the reject button. Default is 'NO' - * @param yesButtonClassName The classname to give to the accept button. - * @param noButtonClassName The classname to give to the cancel button. - * @returns Promise - A promise once the message is closed. - */ - static showYesNoDialog(title: string, msg: string[], acceptLabel?: string, rejectLabel?: string, yesButtonClassName?: string, noButtonClassName?: string): Promise; - /** - * Opens a pop-up dialog in JupyterLab with various information and button - * triggering reloading the page. - * @param title The title for the message popup - * @param msg The message - * @param buttonLabel The label to use for the button. Default is 'Refresh' - * @param buttonClassName The classname to give to the 'refresh' button. - * @returns Promise - A promise once the message is closed. - */ - static showRefreshDialog(title: string, msg: string[], buttonLabel?: string, buttonClassName?: string): Promise; - /** - * @description Creates a new JupyterLab notebook for use by the application - * @param command The command registry - * @returns Promise - A promise containing the notebook panel object that was created (if successful). - */ - static createNewNotebook(command: CommandRegistry): Promise; - /** - * Safely saves the Jupyter notebook document contents to disk - * @param notebookPanel The notebook panel containing the notebook to save - */ - static saveNotebook(notebookPanel: NotebookPanel): Promise; - /** - * Convert the notebook contents to JSON - * @param notebookPanel The notebook panel containing the notebook to serialize - */ - static notebookToJSON(notebookPanel: NotebookPanel): any; - /** - * @description Gets the value of a key from specified notebook's metadata. - * @param notebookPanel The notebook to get meta data from. - * @param key The key of the value. - * @returns any -The value of the metadata. Returns null if the key doesn't exist. - */ - static getMetaData(notebookPanel: NotebookPanel, key: string): any; - /** - * @description Sets the key value pair in the notebook's metadata. - * If the key doesn't exists it will add one. - * @param notebookPanel The notebook to set meta data in. - * @param key The key of the value to create. - * @param value The value to set. - * @param save Default is false. Whether the notebook should be saved after the meta data is set. - * Note: This function will not wait for the save to complete, it only sends a save request. - * @returns The old value for the key, or undefined if it did not exist. - */ - static setMetaData(notebookPanel: NotebookPanel, key: string, value: any, save?: boolean): any; - /** - * @description This function runs code directly in the notebook's kernel and then evaluates the - * result and returns it as a promise. - * @param kernel The kernel to run the code in. - * @param runCode The code to run in the kernel. - * @param userExpressions The expressions used to capture the desired info from the executed code. - * @param runSilent Default is false. If true, kernel will execute as quietly as possible. - * store_history will be set to false, and no broadcast on IOPUB channel will be made. - * @param storeHistory Default is false. If true, the code executed will be stored in the kernel's history - * and the counter which is shown in the cells will be incremented to reflect code was run. - * @param allowStdIn Default is false. If true, code running in kernel can prompt user for input using - * an input_request message. - * @param stopOnError Default is false. If True, does not abort the execution queue, if an exception is encountered. - * This allows the queued execution of multiple execute_requests, even if they generate exceptions. - * @returns Promise - A promise containing the execution results of the code as an object with - * keys based on the user_expressions. - * @example - * //The code - * const code = "a=123\nb=456\nsum=a+b"; - * //The user expressions - * const expr = {sum: "sum",prod: "a*b",args:"[a,b,sum]"}; - * //Async function call (returns a promise) - * sendKernelRequest(notebookPanel, code, expr,false); - * //Result when promise resolves: - * { - * sum:{status:"ok",data:{"text/plain":"579"},metadata:{}}, - * prod:{status:"ok",data:{"text/plain":"56088"},metadata:{}}, - * args:{status:"ok",data:{"text/plain":"[123, 456, 579]"}} - * } - * @see For more information on JupyterLab messages: - * https://jupyter-client.readthedocs.io/en/latest/messaging.html#execution-results - */ - static sendKernelRequest(kernel: Kernel.IKernelConnection | null | undefined, runCode: string, userExpressions: any, runSilent?: boolean, storeHistory?: boolean, allowStdIn?: boolean, stopOnError?: boolean): Promise; - /** - * Same as method sendKernelRequest but passing - * a NotebookPanel instead of a Kernel - */ - static sendKernelRequestFromNotebook(notebookPanel: NotebookPanel, runCode: string, userExpressions: any, runSilent?: boolean, storeHistory?: boolean, allowStdIn?: boolean, stopOnError?: boolean): Promise; -} diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/utils.js b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/utils.js deleted file mode 100644 index 5ac72df1071..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/lib/utils.js +++ /dev/null @@ -1,270 +0,0 @@ -/* - * Copyright 2019-2020 The Kale Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { Dialog, showDialog } from '@jupyterlab/apputils'; -// @ts-ignore -import SanitizedHTML from 'react-sanitized-html'; -import * as React from 'react'; -export default class NotebookUtilities { - /** - * generate random number - * @Min - * @Max - */ - static GetRandomNum(Min, Max) { - let Range; - Range = Max - Min; - var Rand = Math.random(); - return (Min + Math.round(Rand * Range)); - } - /** - * Builds an HTML container by sanitizing a list of strings and converting - * them in valid HTML - * @param msg A list of string with HTML formatting - * @returns a HTMLDivElement composed of a list of spans with formatted text - */ - static buildDialogBody(msg) { - return (React.createElement("div", null, msg.map((s, i) => { - return (React.createElement(React.Fragment, { key: `msg-${i}` }, - React.createElement(SanitizedHTML, { allowedAttributes: { a: ['href'] }, allowedTags: ['b', 'i', 'em', 'strong', 'a', 'pre'], html: s }), - React.createElement("br", null))); - }))); - } - /** - * Opens a pop-up dialog in JupyterLab to display a simple message. - * @param title The title for the message popup - * @param msg The message as an array of strings - * @param buttonLabel The label to use for the button. Default is 'OK' - * @param buttonClassName The classname to give to the 'ok' button - * @returns Promise - A promise once the message is closed. - */ - static async showMessage(title, msg, buttonLabel = 'Dismiss', buttonClassName = '') { - const buttons = [ - Dialog.okButton({ label: buttonLabel, className: buttonClassName }), - ]; - const messageBody = this.buildDialogBody(msg); - await showDialog({ title, buttons, body: messageBody }); - } - /** - * Opens a pop-up dialog in JupyterLab to display a yes/no dialog. - * @param title The title for the message popup - * @param msg The message - * @param acceptLabel The label to use for the accept button. Default is 'YES' - * @param rejectLabel The label to use for the reject button. Default is 'NO' - * @param yesButtonClassName The classname to give to the accept button. - * @param noButtonClassName The classname to give to the cancel button. - * @returns Promise - A promise once the message is closed. - */ - static async showYesNoDialog(title, msg, acceptLabel = 'YES', rejectLabel = 'NO', yesButtonClassName = '', noButtonClassName = '') { - const buttons = [ - Dialog.okButton({ label: acceptLabel, className: yesButtonClassName }), - Dialog.cancelButton({ label: rejectLabel, className: noButtonClassName }), - ]; - const messageBody = this.buildDialogBody(msg); - const result = await showDialog({ title, buttons, body: messageBody }); - return result.button.label === acceptLabel; - } - /** - * Opens a pop-up dialog in JupyterLab with various information and button - * triggering reloading the page. - * @param title The title for the message popup - * @param msg The message - * @param buttonLabel The label to use for the button. Default is 'Refresh' - * @param buttonClassName The classname to give to the 'refresh' button. - * @returns Promise - A promise once the message is closed. - */ - static async showRefreshDialog(title, msg, buttonLabel = 'Refresh', buttonClassName = '') { - await this.showMessage(title, msg, buttonLabel, buttonClassName); - location.reload(); - } - /** - * @description Creates a new JupyterLab notebook for use by the application - * @param command The command registry - * @returns Promise - A promise containing the notebook panel object that was created (if successful). - */ - static async createNewNotebook(command) { - const notebook = await command.execute('notebook:create-new', { - activate: true, - path: '', - preferredLanguage: '', - }); - await notebook.session.ready; - return notebook; - } - /** - * Safely saves the Jupyter notebook document contents to disk - * @param notebookPanel The notebook panel containing the notebook to save - */ - static async saveNotebook(notebookPanel) { - if (notebookPanel) { - await notebookPanel.context.ready; - notebookPanel.context.save(); - return true; - } - return false; - } - /** - * Convert the notebook contents to JSON - * @param notebookPanel The notebook panel containing the notebook to serialize - */ - static notebookToJSON(notebookPanel) { - if (notebookPanel.content.model) { - return notebookPanel.content.model.toJSON(); - } - return null; - } - /** - * @description Gets the value of a key from specified notebook's metadata. - * @param notebookPanel The notebook to get meta data from. - * @param key The key of the value. - * @returns any -The value of the metadata. Returns null if the key doesn't exist. - */ - static getMetaData(notebookPanel, key) { - if (!notebookPanel) { - throw new Error('The notebook is null or undefined. No meta data available.'); - } - if (notebookPanel.model && notebookPanel.model.metadata.has(key)) { - return notebookPanel.model.metadata.get(key); - } - return null; - } - /** - * @description Sets the key value pair in the notebook's metadata. - * If the key doesn't exists it will add one. - * @param notebookPanel The notebook to set meta data in. - * @param key The key of the value to create. - * @param value The value to set. - * @param save Default is false. Whether the notebook should be saved after the meta data is set. - * Note: This function will not wait for the save to complete, it only sends a save request. - * @returns The old value for the key, or undefined if it did not exist. - */ - static setMetaData(notebookPanel, key, value, save = false) { - var _a; - if (!notebookPanel) { - throw new Error('The notebook is null or undefined. No meta data available.'); - } - const oldVal = (_a = notebookPanel.model) === null || _a === void 0 ? void 0 : _a.metadata.set(key, value); - if (save) { - this.saveNotebook(notebookPanel); - } - return oldVal; - } - // /** - // * Get a new Kernel, not tied to a Notebook - // * Source code here: https://github.com/jupyterlab/jupyterlab/tree/473348d25bcb258ca2f0c127dd8fb5b193217135/packages/services - // */ - // public static async createNewKernel() { - // // Get info about the available kernels and start a new one. - // let options: Kernel.IOptions = await Kernel.getSpecs().then(kernelSpecs => { - // // console.log('Default spec:', kernelSpecs.default); - // // console.log('Available specs', Object.keys(kernelSpecs.kernelspecs)); - // // use the default name - // return { name: kernelSpecs.default }; - // }); - // return await Kernel.startNew(options).then(_kernel => { - // return _kernel; - // }); - // } - // // TODO: We can use this context manager to execute commands inside a new kernel - // // and be sure that it will be disposed of at the end. - // // Another approach could be to create a kale_rpc Kernel, as a singleton, - // // created at startup. The only (possible) drawback is that we can not name - // // a kernel instance with a custom id/name, so when refreshing JupyterLab we would - // // not recognize the kernel. A solution could be to have a kernel spec dedicated to kale rpc calls. - // public static async executeWithNewKernel(action: Function, args: any[] = []) { - // // create brand new kernel - // const _k = await this.createNewKernel(); - // // execute action inside kernel - // const res = await action(_k, ...args); - // // close kernel - // _k.shutdown(); - // // return result - // return res; - // } - /** - * @description This function runs code directly in the notebook's kernel and then evaluates the - * result and returns it as a promise. - * @param kernel The kernel to run the code in. - * @param runCode The code to run in the kernel. - * @param userExpressions The expressions used to capture the desired info from the executed code. - * @param runSilent Default is false. If true, kernel will execute as quietly as possible. - * store_history will be set to false, and no broadcast on IOPUB channel will be made. - * @param storeHistory Default is false. If true, the code executed will be stored in the kernel's history - * and the counter which is shown in the cells will be incremented to reflect code was run. - * @param allowStdIn Default is false. If true, code running in kernel can prompt user for input using - * an input_request message. - * @param stopOnError Default is false. If True, does not abort the execution queue, if an exception is encountered. - * This allows the queued execution of multiple execute_requests, even if they generate exceptions. - * @returns Promise - A promise containing the execution results of the code as an object with - * keys based on the user_expressions. - * @example - * //The code - * const code = "a=123\nb=456\nsum=a+b"; - * //The user expressions - * const expr = {sum: "sum",prod: "a*b",args:"[a,b,sum]"}; - * //Async function call (returns a promise) - * sendKernelRequest(notebookPanel, code, expr,false); - * //Result when promise resolves: - * { - * sum:{status:"ok",data:{"text/plain":"579"},metadata:{}}, - * prod:{status:"ok",data:{"text/plain":"56088"},metadata:{}}, - * args:{status:"ok",data:{"text/plain":"[123, 456, 579]"}} - * } - * @see For more information on JupyterLab messages: - * https://jupyter-client.readthedocs.io/en/latest/messaging.html#execution-results - */ - static async sendKernelRequest(kernel, runCode, userExpressions, runSilent = false, storeHistory = false, allowStdIn = false, stopOnError = false) { - if (!kernel) { - throw new Error('Kernel is null or undefined.'); - } - // Wait for kernel to be ready before sending request - // await kernel.status; - const message = await kernel.requestExecute({ - allow_stdin: allowStdIn, - code: runCode, - silent: runSilent, - stop_on_error: stopOnError, - store_history: storeHistory, - user_expressions: userExpressions, - }).done; - const content = message.content; - if (content.status !== 'ok') { - // If response is not 'ok', throw contents as error, log code - const msg = `Code caused an error:\n${runCode}`; - console.error(msg); - if (content.traceback) { - content.traceback.forEach((line) => console.log(line.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, ''))); - } - throw content; - } - // Return user_expressions of the content - return content.user_expressions; - } - /** - * Same as method sendKernelRequest but passing - * a NotebookPanel instead of a Kernel - */ - static async sendKernelRequestFromNotebook(notebookPanel, runCode, userExpressions, runSilent = false, storeHistory = false, allowStdIn = false, stopOnError = false) { - var _a, _b, _c, _d; - if (!notebookPanel) { - throw new Error('Notebook is null or undefined.'); - } - // Wait for notebook panel to be ready - await notebookPanel.activate; - await ((_a = notebookPanel.sessionContext) === null || _a === void 0 ? void 0 : _a.ready); - console.log('get kernel', (_b = notebookPanel.sessionContext.session) === null || _b === void 0 ? void 0 : _b.kernel); - return this.sendKernelRequest((_d = (_c = notebookPanel.sessionContext) === null || _c === void 0 ? void 0 : _c.session) === null || _d === void 0 ? void 0 : _d.kernel, runCode, userExpressions, runSilent, storeHistory, allowStdIn, stopOnError); - } -} diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/neural_compressor_ext_lab_alibaba/__init__.py b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/neural_compressor_ext_lab_alibaba/__init__.py deleted file mode 100644 index 74c4e9f68fc..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/neural_compressor_ext_lab_alibaba/__init__.py +++ /dev/null @@ -1,34 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -import json -from pathlib import Path - -from ._version import __version__ - - -HERE = Path(__file__).parent.resolve() - - -with (HERE / "labextension" / "package.json").open() as fid: - data = json.load(fid) - - -def _jupyter_labextension_paths(): - return [{ - "src": "labextension", - "dest": data["name"] - }] - diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/neural_compressor_ext_lab_alibaba/_version.py b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/neural_compressor_ext_lab_alibaba/_version.py deleted file mode 100644 index 508854434da..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/neural_compressor_ext_lab_alibaba/_version.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import json -from pathlib import Path - -__all__ = ["__version__"] - -__version__ = "0.1.0" diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/neural_compressor_ext_lab_alibaba/labextension/build_log.json b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/neural_compressor_ext_lab_alibaba/labextension/build_log.json deleted file mode 100644 index 17e19a6ab10..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/neural_compressor_ext_lab_alibaba/labextension/build_log.json +++ /dev/null @@ -1,641 +0,0 @@ -[ - { - "bail": false, - "module": { - "rules": [ - { - "test": {}, - "use": [ - "style-loader", - "css-loader" - ] - }, - { - "test": {}, - "use": "raw-loader" - }, - { - "test": {}, - "use": "raw-loader" - }, - { - "test": {}, - "use": "file-loader" - }, - { - "test": {}, - "use": "file-loader" - }, - { - "test": {}, - "use": "url-loader?limit=10000&mimetype=application/font-woff" - }, - { - "test": {}, - "use": "url-loader?limit=10000&mimetype=application/font-woff" - }, - { - "test": {}, - "use": "url-loader?limit=10000&mimetype=application/octet-stream" - }, - { - "test": {}, - "use": "file-loader" - }, - { - "test": {}, - "issuer": {}, - "use": { - "loader": "svg-url-loader", - "options": { - "encoding": "none", - "limit": 10000 - } - } - }, - { - "test": {}, - "issuer": {}, - "use": { - "loader": "raw-loader" - } - }, - { - "test": {}, - "type": "javascript/auto" - }, - { - "test": {}, - "resolve": { - "fullySpecified": false - } - }, - { - "test": {}, - "resolve": { - "fullySpecified": false - } - }, - { - "test": {}, - "use": "file-loader" - } - ] - }, - "resolve": { - "alias": { - "@phosphor/algorithm$": "/home/demo/jupyter_lab_workspace/neural_compressor_ext_lab_alibaba/node_modules/@lumino/algorithm/dist/index.js", - "@phosphor/application$": "/home/demo/jupyter_lab_workspace/neural_compressor_ext_lab_alibaba/node_modules/@lumino/application/dist/index.js", - "@phosphor/commands$": "/home/demo/jupyter_lab_workspace/neural_compressor_ext_lab_alibaba/node_modules/@lumino/commands/dist/index.js", - "@phosphor/coreutils$": "/home/demo/jupyter_lab_workspace/neural_compressor_ext_lab_alibaba/node_modules/@lumino/coreutils/dist/index.node.js", - "@phosphor/disposable$": "/home/demo/jupyter_lab_workspace/neural_compressor_ext_lab_alibaba/node_modules/@lumino/disposable/dist/index.js", - "@phosphor/domutils$": "/home/demo/jupyter_lab_workspace/neural_compressor_ext_lab_alibaba/node_modules/@lumino/domutils/dist/index.js", - "@phosphor/dragdrop$": "/home/demo/jupyter_lab_workspace/neural_compressor_ext_lab_alibaba/node_modules/@lumino/dragdrop/dist/index.js", - "@phosphor/dragdrop/style": "/home/demo/jupyter_lab_workspace/neural_compressor_ext_lab_alibaba/node_modules/@lumino/widgets/style", - "@phosphor/messaging$": "/home/demo/jupyter_lab_workspace/neural_compressor_ext_lab_alibaba/node_modules/@lumino/messaging/dist/index.js", - "@phosphor/properties$": "/home/demo/jupyter_lab_workspace/neural_compressor_ext_lab_alibaba/node_modules/@lumino/properties/dist/index.js", - "@phosphor/signaling": "/home/demo/jupyter_lab_workspace/neural_compressor_ext_lab_alibaba/node_modules/@lumino/signaling/dist/index.js", - "@phosphor/widgets/style": "/home/demo/jupyter_lab_workspace/neural_compressor_ext_lab_alibaba/node_modules/@lumino/widgets/style", - "@phosphor/virtualdom$": "/home/demo/jupyter_lab_workspace/neural_compressor_ext_lab_alibaba/node_modules/@lumino/virtualdom/dist/index.js", - "@phosphor/widgets$": "/home/demo/jupyter_lab_workspace/neural_compressor_ext_lab_alibaba/node_modules/@lumino/widgets/dist/index.js" - }, - "fallback": { - "url": false, - "buffer": false, - "crypto": false, - "path": "/home/demo/jupyter_lab_workspace/neural_compressor_ext_lab_alibaba/node_modules/path-browserify/index.js", - "process": "/home/demo/jupyter_lab_workspace/neural_compressor_ext_lab_alibaba/node_modules/process/browser.js" - } - }, - "watchOptions": { - "poll": 500, - "aggregateTimeout": 1000 - }, - "output": { - "hashFunction": "sha256", - "filename": "[name].[contenthash].js", - "path": "/home/demo/jupyter_lab_workspace/neural_compressor_ext_lab_alibaba/neural_compressor_ext_lab_alibaba/labextension/static", - "publicPath": "auto" - }, - "plugins": [ - { - "definitions": { - "process": "process/browser" - } - }, - { - "_options": { - "name": "neural_compressor_ext_lab_alibaba", - "library": { - "type": "var", - "name": [ - "_JUPYTERLAB", - "neural_compressor_ext_lab_alibaba" - ] - }, - "filename": "remoteEntry.[contenthash].js", - "exposes": { - "./index": "/home/demo/jupyter_lab_workspace/neural_compressor_ext_lab_alibaba/lib/index.js", - "./extension": "/home/demo/jupyter_lab_workspace/neural_compressor_ext_lab_alibaba/lib/index.js", - "./style": "/home/demo/jupyter_lab_workspace/neural_compressor_ext_lab_alibaba/style/index.js" - }, - "shared": { - "@jupyterlab/application": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/application-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/apputils-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/cell-toolbar-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/celltags-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/codemirror-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/completer-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/console-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/coreutils": { - "requiredVersion": "^5.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/csvviewer-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/debugger-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/docmanager-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/docprovider-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/documentsearch-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/extensionmanager-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/filebrowser-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/fileeditor-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/help-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/htmlviewer-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/hub-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/imageviewer-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/inspector-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/javascript-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/json-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/launcher-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/logconsole-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/mainmenu-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/markdownviewer-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/mathjax2-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/notebook-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/pdf-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/rendermime-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/running-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/settingeditor-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/shortcuts-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/statusbar-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/terminal-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/theme-dark-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/theme-light-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/toc-extension": { - "requiredVersion": "^5.4.7", - "import": false - }, - "@jupyterlab/tooltip-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/translation-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/ui-components-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/vdom-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/vega5-extension": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/apputils": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/attachments": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/cell-toolbar": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/cells": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/celltags": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/codeeditor": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/codemirror": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/completer": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/console": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/csvviewer": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/debugger": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/docmanager": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/docprovider": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/docregistry": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/documentsearch": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/extensionmanager": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/filebrowser": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/fileeditor": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/htmlviewer": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/imageviewer": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/inspector": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/launcher": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/logconsole": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/mainmenu": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/markdownviewer": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/mathjax2": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/metapackage": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/nbconvert-css": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/nbformat": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/notebook": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/observables": { - "requiredVersion": "^4.4.7", - "import": false - }, - "@jupyterlab/outputarea": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/property-inspector": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/rendermime": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/rendermime-interfaces": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/running": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@jupyterlab/services": { - "requiredVersion": "^6.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/settingeditor": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/settingregistry": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/shared-models": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/statedb": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/statusbar": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/terminal": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/toc": { - "requiredVersion": "^5.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/tooltip": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/translation": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/ui-components": { - "requiredVersion": "^3.4.7", - "import": false, - "singleton": true - }, - "@jupyterlab/vdom": { - "requiredVersion": "^3.4.7", - "import": false - }, - "@lumino/algorithm": { - "requiredVersion": "^1.9.0", - "import": false, - "singleton": true - }, - "@lumino/application": { - "requiredVersion": "^1.27.0", - "import": false, - "singleton": true - }, - "@lumino/commands": { - "requiredVersion": "^1.19.0", - "import": false, - "singleton": true - }, - "@lumino/coreutils": { - "requiredVersion": "^1.11.0", - "import": false, - "singleton": true - }, - "@lumino/disposable": { - "requiredVersion": "^1.10.0", - "import": false, - "singleton": true - }, - "@lumino/domutils": { - "requiredVersion": "^1.8.0", - "import": false, - "singleton": true - }, - "@lumino/dragdrop": { - "requiredVersion": "^1.13.0", - "import": false, - "singleton": true - }, - "@lumino/messaging": { - "requiredVersion": "^1.10.0", - "import": false, - "singleton": true - }, - "@lumino/properties": { - "requiredVersion": "^1.8.0", - "import": false, - "singleton": true - }, - "@lumino/signaling": { - "requiredVersion": "^1.10.0", - "import": false, - "singleton": true - }, - "@lumino/virtualdom": { - "requiredVersion": "^1.14.0", - "import": false, - "singleton": true - }, - "@lumino/widgets": { - "requiredVersion": "^1.33.0", - "import": false, - "singleton": true - }, - "react": { - "requiredVersion": "^17.0.1", - "import": false, - "singleton": true - }, - "react-dom": { - "requiredVersion": "^17.0.1", - "import": false, - "singleton": true - }, - "yjs": { - "requiredVersion": "^13.5.17", - "import": false, - "singleton": true - }, - "@phosphor/commands": {}, - "react-sanitized-html": {}, - "neural_compressor_ext_lab_alibaba": { - "version": "0.1.0", - "singleton": true, - "import": "/home/demo/jupyter_lab_workspace/neural_compressor_ext_lab_alibaba/lib/index.js" - } - } - } - }, - {} - ], - "mode": "development", - "devtool": "source-map", - "entry": {} - } -] \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/neural_compressor_ext_lab_alibaba/labextension/package.json b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/neural_compressor_ext_lab_alibaba/labextension/package.json deleted file mode 100644 index 5267a840a5f..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/neural_compressor_ext_lab_alibaba/labextension/package.json +++ /dev/null @@ -1,109 +0,0 @@ -{ - "name": "neural_compressor_ext_lab_alibaba", - "version": "0.1.0", - "description": "A JupyterLab extension.", - "keywords": [ - "jupyter", - "jupyterlab", - "jupyterlab-extension" - ], - "homepage": "https://github.com/intel-sandbox/neural-coder/tree/lab_ext_ts/neural_coder/extensions", - "bugs": { - "url": "https://github.com/intel-sandbox/neural-coder/tree/lab_ext_ts/neural_coder/extensions/issues" - }, - "license": "BSD-3-Clause", - "author": { - "name": "Neural_Coder", - "email": "rya.ashs@gmail.com" - }, - "files": [ - "lib/**/*.{d.ts,eot,gif,html,jpg,js,js.map,json,png,svg,woff2,ttf}", - "style/**/*.{css,js,eot,gif,html,jpg,json,png,svg,woff2,ttf}" - ], - "main": "lib/index.js", - "types": "lib/index.d.ts", - "style": "style/index.css", - "repository": { - "type": "git", - "url": "https://github.com/intel-sandbox/neural-coder/tree/lab_ext_ts/neural_coder/extensions.git" - }, - "scripts": { - "build": "jlpm build:lib && jlpm build:labextension:dev", - "build:prod": "jlpm clean && jlpm build:lib && jlpm build:labextension", - "build:labextension": "jupyter labextension build .", - "build:labextension:dev": "jupyter labextension build --development True .", - "build:lib": "tsc", - "clean": "jlpm clean:lib", - "clean:lib": "rimraf lib tsconfig.tsbuildinfo", - "clean:lintcache": "rimraf .eslintcache .stylelintcache", - "clean:labextension": "rimraf neural_compressor_ext_lab_alibaba/labextension", - "clean:all": "jlpm clean:lib && jlpm clean:labextension && jlpm clean:lintcache", - "eslint": "jlpm eslint:check --fix", - "eslint:check": "eslint . --cache --ext .ts,.tsx", - "install:extension": "jlpm build", - "lint": "jlpm stylelint && jlpm prettier && jlpm eslint", - "lint:check": "jlpm stylelint:check && jlpm prettier:check && jlpm eslint:check", - "prettier": "jlpm prettier:base --write --list-different", - "prettier:base": "prettier \"**/*{.ts,.tsx,.js,.jsx,.css,.json,.md}\"", - "prettier:check": "jlpm prettier:base --check", - "stylelint": "jlpm stylelint:check --fix", - "stylelint:check": "stylelint --cache \"style/**/*.css\"", - "watch": "run-p watch:src watch:labextension", - "watch:src": "tsc -w", - "watch:labextension": "jupyter labextension watch ." - }, - "dependencies": { - "@jupyterlab/application": "^3.1.0", - "@jupyterlab/docregistry": "^3.4.7", - "@jupyterlab/mainmenu": "^3.4.7", - "@jupyterlab/notebook": "^3.4.7", - "@phosphor/commands": "^1.7.2", - "react": "^16.2.0", - "react-sanitized-html": "^2.0.0" - }, - "devDependencies": { - "@jupyterlab/builder": "^3.1.0", - "@typescript-eslint/eslint-plugin": "^4.8.1", - "@typescript-eslint/parser": "^4.8.1", - "eslint": "^7.14.0", - "eslint-config-prettier": "^6.15.0", - "eslint-plugin-prettier": "^3.1.4", - "npm-run-all": "^4.1.5", - "prettier": "^2.1.1", - "rimraf": "^3.0.2", - "stylelint": "^14.3.0", - "stylelint-config-prettier": "^9.0.3", - "stylelint-config-recommended": "^6.0.0", - "stylelint-config-standard": "~24.0.0", - "stylelint-prettier": "^2.0.0", - "typescript": "~4.1.3" - }, - "sideEffects": [ - "style/*.css", - "style/index.js" - ], - "styleModule": "style/index.js", - "publishConfig": { - "access": "public" - }, - "jupyterlab": { - "extension": true, - "outputDir": "neural_compressor_ext_lab_alibaba/labextension", - "_build": { - "load": "static/remoteEntry.a3e9c30ec2e72660969d.js", - "extension": "./extension", - "style": "./style" - } - }, - "jupyter-releaser": { - "hooks": { - "before-build-npm": [ - "python -m pip install jupyterlab~=3.1", - "jlpm" - ], - "before-build-python": [ - "jlpm clean:all" - ] - } - } -} diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/package.json b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/package.json deleted file mode 100644 index 41dcad5c323..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/package.json +++ /dev/null @@ -1,115 +0,0 @@ -{ - "name": "neural_compressor_ext_lab_alibaba", - "version": "0.1.0", - "description": "A JupyterLab extension.", - "keywords": [ - "jupyter", - "jupyterlab", - "jupyterlab-extension" - ], - "homepage": "https://github.com/intel/neural-compressor/tree/master/neural_coder/extensions/neural_compressor_ext_lab", - "bugs": { - "url": "https://github.com/intel/neural-compressor/tree/master/neural_coder/extensions/neural_compressor_ext_lab" - }, - "license": "BSD-3-Clause", - "author": { - "name": "neural_compressor_ext_lab", - "email": "inc.maintainers@intel.com" - }, - "files": [ - "lib/**/*.{d.ts,eot,gif,html,jpg,js,js.map,json,png,svg,woff2,ttf}", - "style/**/*.{css,js,eot,gif,html,jpg,json,png,svg,woff2,ttf}" - ], - "main": "lib/index.js", - "types": "lib/index.d.ts", - "style": "style/index.css", - "repository": { - "type": "git", - "url": "https://github.com/intel/neural-compressor.git" - }, - "scripts": { - "preinstall": "npx npm-force-resolutions", - "build": "jlpm build:lib && jlpm build:labextension:dev", - "build:prod": "jlpm clean && jlpm build:lib && jlpm build:labextension", - "build:labextension": "jupyter labextension build .", - "build:labextension:dev": "jupyter labextension build --development True .", - "build:lib": "tsc", - "clean": "jlpm clean:lib", - "clean:lib": "rimraf lib tsconfig.tsbuildinfo", - "clean:lintcache": "rimraf .eslintcache .stylelintcache", - "clean:labextension": "rimraf neural_compressor_ext_lab_alibaba/labextension", - "clean:all": "jlpm clean:lib && jlpm clean:labextension && jlpm clean:lintcache", - "eslint": "jlpm eslint:check --fix", - "eslint:check": "eslint . --cache --ext .ts,.tsx", - "install:extension": "jlpm build", - "lint": "jlpm stylelint && jlpm prettier && jlpm eslint", - "lint:check": "jlpm stylelint:check && jlpm prettier:check && jlpm eslint:check", - "prettier": "jlpm prettier:base --write --list-different", - "prettier:base": "prettier \"**/*{.ts,.tsx,.js,.jsx,.css,.json,.md}\"", - "prettier:check": "jlpm prettier:base --check", - "stylelint": "jlpm stylelint:check --fix", - "stylelint:check": "stylelint --cache \"style/**/*.css\"", - "watch": "run-p watch:src watch:labextension", - "watch:src": "tsc -w", - "watch:labextension": "jupyter labextension watch ." - }, - "dependencies": { - "@jupyterlab/application": "^3.1.0", - "@jupyterlab/docregistry": "^3.4.7", - "@jupyterlab/mainmenu": "^3.4.7", - "@jupyterlab/notebook": "^3.4.7", - "@phosphor/commands": "^1.7.2", - "loader-utils": "^2.0.4", - "react": "^17.0.2", - "react-sanitized-html": "^2.0.0" - }, - "devDependencies": { - "@jupyterlab/builder": "^3.1.0", - "@typescript-eslint/eslint-plugin": "^4.8.1", - "@typescript-eslint/parser": "^4.8.1", - "eslint": "^7.14.0", - "eslint-config-prettier": "^6.15.0", - "eslint-plugin-prettier": "^3.1.4", - "got": "^12.5.3", - "json5": "^2.2.2", - "jsonwebtoken": "^9.0.0", - "npm-run-all": "^4.1.5", - "prettier": "^2.1.1", - "rimraf": "^3.0.2", - "stylelint": "^15.6.0", - "stylelint-config-prettier": "^9.0.3", - "stylelint-config-recommended": "^12.0.0", - "stylelint-config-standard": "~33.0.0", - "stylelint-prettier": "^2.0.0", - "typescript": "~4.1.3" - }, - "sideEffects": [ - "style/*.css", - "style/index.js" - ], - "styleModule": "style/index.js", - "publishConfig": { - "access": "public" - }, - "jupyterlab": { - "extension": true, - "outputDir": "neural_compressor_ext_lab_alibaba/labextension" - }, - "jupyter-releaser": { - "hooks": { - "before-build-npm": [ - "python -m pip install jupyterlab~=3.1", - "jlpm" - ], - "before-build-python": [ - "jlpm clean:all" - ] - } - }, - "resolutions": { - "got": "^11.8.5", - "loader-utils": "^2.0.4", - "json5": "^2.2.2", - "jsonwebtoken": "^9.0.0" - } -} diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/pyproject.toml b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/pyproject.toml deleted file mode 100644 index 19944847c94..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/pyproject.toml +++ /dev/null @@ -1,68 +0,0 @@ -[build-system] -requires = ["hatchling>=1.3.1", "jupyterlab>=3.4.7,<4.0.0", "hatch-nodejs-version"] -build-backend = "hatchling.build" - -[project] -name = "neural_compressor_ext_lab_alibaba" -readme = "README.md" -license = { file = "LICENSE" } -requires-python = ">=3.6" -classifiers = [ - "Framework :: Jupyter", - "Framework :: Jupyter :: JupyterLab", - "Framework :: Jupyter :: JupyterLab :: 3", - "Framework :: Jupyter :: JupyterLab :: Extensions", - "Framework :: Jupyter :: JupyterLab :: Extensions :: Prebuilt", - "License :: OSI Approved :: BSD License", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", -] -dependencies = [ -] -dynamic = ["version", "description", "authors", "urls", "keywords"] - -[project.optional-dependencies] -test = [ -] - -[tool.hatch.version] -source = "nodejs" - -[tool.hatch.metadata.hooks.nodejs] -fields = ["description", "authors", "urls"] - -[tool.hatch.build] -artifacts = ["neural_compressor_ext_lab_alibaba/labextension"] - -[tool.hatch.build.targets.wheel.shared-data] -"neural_compressor_ext_lab_alibaba/labextension" = "share/jupyter/labextensions/neural_compressor_ext_lab_alibaba" -"install.json" = "share/jupyter/labextensions/neural_compressor_ext_lab_alibaba/install.json" - -[tool.hatch.build.targets.sdist] -exclude = [".github"] - -[tool.hatch.build.hooks.jupyter-builder] -dependencies = ["hatch-jupyter-builder>=0.5"] -build-function = "hatch_jupyter_builder.npm_builder" -ensured-targets = [ - "neural_compressor_ext_lab_alibaba/labextension/static/style.js", - "neural_compressor_ext_lab_alibaba//labextension/package.json", -] -skip-if-exists = ["neural_compressor_ext_lab_alibaba/labextension/static/style.js"] - -[tool.hatch.build.hooks.jupyter-builder.build-kwargs] -build_cmd = "build:prod" -npm = ["jlpm"] - -[tool.hatch.build.hooks.jupyter-builder.editable-build-kwargs] -build_cmd = "install:extension" -npm = ["jlpm"] -source_dir = "src" -build_dir = "neural_compressor_ext_lab_alibaba/labextension" - -[tool.jupyter-releaser.options] -version_cmd = "hatch version" diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/setup.py b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/setup.py deleted file mode 100644 index afff1d065ea..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/setup.py +++ /dev/null @@ -1,16 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -__import__('setuptools').setup() diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/src/constants.ts b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/src/constants.ts deleted file mode 100644 index e476aa49f4b..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/src/constants.ts +++ /dev/null @@ -1,16 +0,0 @@ - - -export namespace Constants { - export const SHORT_PLUGIN_NAME = 'neural_compressor_ext_lab'; - export const WORK_PATH = 'neural_coder_workspace/' - export const ICON_FORMAT_ALL_SVG = - '' - export const ICON_RUN = - '' - export const SVG = '' - export const LONG_PLUGIN_NAME = `@rya/${SHORT_PLUGIN_NAME}`; - export const SETTINGS_SECTION = `${LONG_PLUGIN_NAME}:settings`; - export const COMMAND_SECTION_NAME = 'Jupyterlab Code Optimizer'; - export const PLUGIN_VERSION = '0.1.0'; - } - \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/src/deepcoder.ts b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/src/deepcoder.ts deleted file mode 100644 index 766666c26a1..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/src/deepcoder.ts +++ /dev/null @@ -1,330 +0,0 @@ -import { Cell, CodeCell } from '@jupyterlab/cells'; -import { ToolbarButton} from '@jupyterlab/apputils'; -import { Widget } from '@lumino/widgets'; -import { INotebookTracker,NotebookPanel, Notebook, NotebookActions} from '@jupyterlab/notebook'; -import NotebookUtilities from "./utils" -import { Constants } from './constants'; - - -class JupyterlabCodeOptimizer { - protected working: boolean; - protected panel :NotebookPanel; - private tmp_path: string; - public log_path:string; - public tmp_log_path:string; - public rand:number - public markdown: Cell | undefined - public cells:CodeCell[]; - constructor(panel: NotebookPanel) { - this.working = false; - this.panel = panel - this.tmp_path = Constants.WORK_PATH+"tmp.py" - this.rand = NotebookUtilities.GetRandomNum(0,200) - this.log_path = Constants.WORK_PATH + "NeuralCoder"+this.rand+".log"; - this.tmp_log_path = Constants.WORK_PATH+ "NeuralCoder_tmp"+".log"; - this.cells = []; - } - - - async optimizeCode( - code: string[], - formatter: string, - name:string, - next:string, - options: string | undefined, - notebook: boolean, - panel: NotebookPanel, - cell:CodeCell, - run?:ToolbarButton|undefined, - ){ - let codes: string[] = [] - code.forEach(function (value) { - value = value.replace(/('\\n')/g, '^^^') - value = value.replace(/\\n"/g, '###') - value = value.replace(/\\n'/g, '###') - value = value.replace(/"\\n/g, '@@') - value = value.replace(/'\\n/g, '@@') - value = value.replace(/\n/g, '\\n') - value = value.replace(/"/g, '+++') - value = value.replace(/,/g, '$') - codes.push(value) - }) - - let gen_code = `code = "${codes}"\ncodes = code.split(',')\nwith open( '${this.tmp_path}', 'w+' ) as f:\n for i in range(0,len(codes)):\n f.write('# this is the beginning of a single code snippet\\n')\n code_list = codes[i].replace('$',',').replace('+++','\"').split('\\n')\n for line in code_list:\n if('split(^^^)' in line):\n line=line.replace('split(^^^)', 'split(\\'\\\\n\\')')\n if('###' in line):\n line=line.replace('###', '\\\\n\"')\n if('@@' in line):\n line=line.replace('@@', '\"\\\\n')\n f.write(line+'\\n')` - const expr = {code_list: `code_list`}; - NotebookUtilities.sendKernelRequestFromNotebook(panel, gen_code, expr,false); - - if(options === 'normal'){ - let runcode = `from neural_coder import enable\nenable(code="${this.tmp_path}",features=["${formatter}"], overwrite=True)`; - let expr = {sum: ` `}; - NotebookUtilities.sendKernelRequestFromNotebook(panel, runcode, expr,false); - let run_code1 = `with open("${this.tmp_path}", 'r') as f:\n optimized_code = f.read()\n` - let expr1 = {optimizedCode : "optimized_code"} - let result2 = NotebookUtilities.sendKernelRequestFromNotebook(panel,run_code1,expr1,false) - result2.then(value=>{ - let optimizedTexts = Object.values(value.optimizedCode.data)[0] as string - let optimizeCodes = optimizedTexts.split('# this is the beginning of a single code snippet\\n').slice(1,) - optimizeCodes[optimizeCodes.length-1] = optimizeCodes[optimizeCodes.length-1].slice(0,-3) - for (let i = 0; i < optimizeCodes.length; ++i) { - const cell = this.cells[i]; - const currentTexts = this.cells.map(cell => cell.model.value.text); - const currentText = currentTexts[i]; - let optimizedtext = optimizeCodes[i]; - optimizedtext = optimizedtext.replace(/\\'\\\\n\\'/g, "^^^") - optimizedtext = optimizedtext.replace(/\\\\n"/g, "+++") - optimizedtext = optimizedtext.replace(/\\\\n'/g, "+++") - optimizedtext = optimizedtext.replace(/"\\\\n/g, "@@@") - optimizedtext = optimizedtext.replace(/'\\\\n/g, "@@@") - optimizedtext = optimizedtext.replace(/\\n/g,'\n') - optimizedtext = optimizedtext.replace(/\\'/g,"'") - optimizedtext = optimizedtext.replace(/\^\^\^/g, "'\\n'") - optimizedtext = optimizedtext.replace(/\+\+\+/g, "\\n\"") - optimizedtext = optimizedtext.replace(/\@\@\@/g, "\"\\n") - if (cell.model.value.text === currentText) { - cell.model.value.text = optimizedtext; - } - const run_svg = document.createElement("svg") - run_svg.innerHTML = Constants.ICON_RUN - run?.node.firstChild?.firstChild?.firstChild?.firstChild?.replaceWith(run_svg) - } - }) - - }else{ - if(formatter === ''){ - if (this.markdown){ - this.markdown.model.value.text += "[NeuralCoder INFO] Enabling and Benchmarking for The Original Model ...... \n" - } - let runcode1 = `with open("${this.log_path}", 'a' ) as f:\n f.write("[NeuralCoder INFO] Enabling and Benchmarking for The Original Model ......\\n")` - let expr1 = {path: ""}; - NotebookUtilities.sendKernelRequestFromNotebook(panel, runcode1, expr1,false); - - let runcode = `from neural_coder import enable\nperfomance, mode, path = enable(code="${this.tmp_path}",features=[], run_bench=True, args="${options}")\nwith open(path + '/bench.log', 'r') as f:\n logs = f.readlines()\nlog_line = logs[4]\nlog = log_line.split("[")[1].split("]")[0]` - let expr = {path: "path",log:"log"}; - let result = NotebookUtilities.sendKernelRequestFromNotebook(panel, runcode, expr,false); - let fps : String ; - result.then( value => { - fps = Object.values(value.log.data)[0] as string; - if (this.markdown){ - this.markdown.model.value.text += `[NeuralCoder INFO] Benchmark Result (Performance) of The Original Model is ${fps} (FPS) \n` - } - let text = `[NeuralCoder INFO] Benchmark Result (Performance) of The Original Model is ${fps} (FPS)\\n` - let runcode = `with open("${this.log_path}", 'a' ) as f:\n f.write("${text}")` - let expr = {path: ""}; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode, expr,false); - if (this.markdown){ - this.markdown.model.value.text += `[NeuralCoder INFO] Enabling and Benchmarking for ${next} ...... \n` - } - let runcode1 = `with open("${this.log_path}", 'a' ) as f:\n f.write("[NeuralCoder INFO] Enabling and Benchmarking for ${next} ......\\n")` - let expr1 = {path: ""}; - NotebookUtilities.sendKernelRequestFromNotebook(panel, runcode1, expr1,false); - let runcode2 = `with open("${this.tmp_log_path}", 'a' ) as f:\n f.write("${text}")` - let expr2 = {path: ""}; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode2, expr2,false); - }) - - }else{ - - let runcode = `from neural_coder import enable\nperfomance, mode, path = enable(code="${this.tmp_path}", features=["${formatter}"], run_bench=True, args="${options}")\nwith open(path + '/bench.log', 'r') as f:\n logs = f.readlines()\nlog_line = logs[4]\nlog = log_line.split("[")[1].split("]")[0]` - let expr = {path: "path",log:"log"}; - let result = NotebookUtilities.sendKernelRequestFromNotebook(panel, runcode, expr,false); - let fps:string; - result.then( value => { - fps = Object.values(value.log.data)[0] as string; - if(this.markdown){ - this.markdown.model.value.text += `[NeuralCoder INFO] Benchmark Result (Performance) of ${name} is ${fps} (FPS) \n` - } - let text = `[NeuralCoder INFO] Benchmark Result (Performance) of ${name} is ${fps} (FPS)\\n` - let runcode = `with open("${this.log_path}", 'a' ) as f:\n f.write("${text}")` - let expr = {path: ""}; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode, expr,false); - if (next !== ''){ - if(this.markdown){ - this.markdown.model.value.text += `[NeuralCoder INFO] Enabling and Benchmarking for ${next} ...... \n` - } - let runcode2 = `with open("${this.log_path}", 'a' ) as f:\n f.write("[NeuralCoder INFO] Enabling and Benchmarking for ${next} ......\\n")` - let expr2 = {path: ""}; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode2, expr2,false); - } - let runcode2 = `with open("${this.tmp_log_path}", 'a' ) as f:\n f.write("${text}")` - let expr2 = {path: ""}; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode2, expr2,false); - - if (formatter === 'pytorch_aliblade'){ - let read_log = `import re\nwith open("${this.tmp_log_path}", 'r') as f:\n logs = f.readlines()\n fps_list=[]\n for log_line in logs[-2:]:\n pat = r\'\\d+\\.?\\d+'\n fps = re.search(pat,log_line).group()\n fps_list.append(float(fps))\nmaxi = max(fps_list)\nindex = fps_list.index(maxi)\nboost = round(maxi/fps_list[0],1)\nfeatures=['','pytorch_aliblade',]\nfeature_name=['','Alibaba Blade-DISC']\nbest_feature = features[index]\nbest_name = feature_name[index]\n` - let read_expr = {boost:"boost",best_feature:"best_feature",best_name:"best_name"} - let read_result = NotebookUtilities.sendKernelRequestFromNotebook(this.panel, read_log, read_expr,false); - read_result.then(value =>{ - let boost = Object.values(value.boost.data)[0] as string; - let best_name = Object.values(value.best_name.data)[0] as string; - if(this.markdown){ - this.markdown.model.value.text += `[NeuralCoder INFO] The Best Intel Optimization: ${best_name} \n` - this.markdown.model.value.text += `[NeuralCoder INFO] You can get up to ${boost}X performance boost. \n` - } - let command = "lscpu | grep 'Model name'" - let get_hardware = `import subprocess\nsubp = subprocess.Popen("${command}",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE,encoding="utf-8")\nsubp.wait(2)\nhardware = subp.communicate()[0].replace("Model name:","").strip()` - let expr_hardware = {hardware: "hardware"} - let hard_res = NotebookUtilities.sendKernelRequestFromNotebook(this.panel, get_hardware, expr_hardware,false); - hard_res.then(value =>{ - let hard = Object.values(value.hardware.data)[0] as string; - if(this.markdown){ - this.markdown.model.value.text += `[NeuralCoder INFO] HardWare: ${hard} \n` - this.markdown.model.value.text += `[NeuralCoder INFO] The log was saved to neural_coder_workspace\\NeuralCoder${this.rand}.log \n` - } - }) - const run_svg = document.createElement("svg") - run_svg.innerHTML = Constants.ICON_RUN - run?.node.firstChild?.firstChild?.firstChild?.firstChild?.replaceWith(run_svg) - }) - } - }) - } - } - } - } - - - export class JupyterlabNotebookCodeOptimizer extends JupyterlabCodeOptimizer { - protected notebookname: string; - protected notebookTracker: INotebookTracker; - - constructor( - notebookTracker: INotebookTracker, - panel: NotebookPanel - ) { - super(panel); - this.notebookTracker = notebookTracker; - this.notebookname = ''; - } - - public async optimizeAction(config: any, formatter?: string) { - return this.optimizeCells(true, config, formatter); - } - - - public async optimizeAllCodeCells( - config?: string, - formatter?: string, - notebook?: Notebook, - run?: ToolbarButton - ):Promise { - return this.optimizeCells(false, config, formatter, notebook, run); - } - - private getCodeCells(ifMarkdown = true, notebook?: Notebook): CodeCell[] { - if (!this.notebookTracker.currentWidget) { - return []; - } - const codeCells: CodeCell[] = []; - notebook = notebook || this.notebookTracker.currentWidget.content; - this.notebookname = notebook.title.label - let count = 0; - notebook.widgets.forEach((cell: Cell) => { - if (cell.model.type === 'code') { - count += 1; - codeCells.push(cell as CodeCell); - } - }); - - if(ifMarkdown){ - NotebookActions.insertBelow(notebook); - this.notebookTracker.currentWidget.content.activeCellIndex = count + 1; - NotebookActions.changeCellType(notebook, 'markdown') - const activeCell = notebook.activeCell; - if (activeCell){ - this.markdown = activeCell - } - } - - - this.cells = codeCells - return codeCells; - } - - private async optimizeCells( - selectedOnly: boolean, - config?: string, - formatter?: string, - notebook?: Notebook, - run?: ToolbarButton|undefined - ):Promise{ - if (this.working) { - return new Promise((resolve, reject) => { - resolve("false!") - }); - } - this.working = true; - const optimize_type = formatter !== undefined ? formatter : 'pytorch_aliblade'; - if(optimize_type === 'auto'){ - selectedOnly = true - }else{selectedOnly = false} - - const selectedCells = this.getCodeCells(selectedOnly, notebook); - let cell = selectedCells[selectedCells.length-1] - if (selectedCells.length === 0) { - this.working = false; - return new Promise((resolve, reject) => { - resolve("false!") - }); - } - const currentTexts = selectedCells.map(cell => cell.model.value.text); - if (optimize_type === 'auto'){ - - if (this.markdown){ - this.markdown.model.value.text += `[NeuralCoder INFO] Code: User code from Jupyter Lab notebook "${this.notebookname}" \n` - this.markdown.model.value.text += `[NeuralCoder INFO] Benchmark Mode: Throughput \n` - } - let runcode2 = `with open('${this.log_path}', 'a' ) as f:\n f.write("[NeuralCoder INFO] Code: User code from Jupyter Lab notebook '${this.notebookname}'\\n")` - let expr2 = {path: ""}; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode2, expr2,false); - let runcode3 = `with open('${this.log_path}', 'a' ) as f:\n f.write("[NeuralCoder INFO] Benchmark Mode: Throughput\\n")` - let expr3 = {path: ""}; - NotebookUtilities.sendKernelRequestFromNotebook(this.panel, runcode3, expr3,false); - await this.optimizeCode( - currentTexts, - '', - 'The Original Model', - 'Alibaba-Blade', - config, - true, - this.panel, - cell, - run - ); - await this.optimizeCode( - currentTexts, - 'pytorch_aliblade', - 'Alibaba-Blade', - '', - config, - true, - this.panel, - cell, - run, - ); - - }else{ - await this.optimizeCode( - currentTexts, - optimize_type, - "", - "", - "normal", - true, - this.panel, - cell, - run, - ); - } - this.working = false; - return new Promise((resolve, reject) => { - resolve("success!") - }); - } - applicable(formatter: string, currentWidget: Widget) { - const currentNotebookWidget = this.notebookTracker.currentWidget; - return currentNotebookWidget && currentWidget === currentNotebookWidget; - } - - } - - \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/src/index.ts b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/src/index.ts deleted file mode 100644 index c86bad70587..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/src/index.ts +++ /dev/null @@ -1,136 +0,0 @@ -import { DocumentRegistry } from '@jupyterlab/docregistry'; -import { - JupyterFrontEnd, - JupyterFrontEndPlugin -} from '@jupyterlab/application'; -import { INotebookTracker,NotebookPanel, INotebookModel} from '@jupyterlab/notebook'; -import { -ToolbarButton, showDialog, Dialog } from '@jupyterlab/apputils'; -import { ISettingRegistry } from '@jupyterlab/settingregistry'; -import { IMainMenu } from '@jupyterlab/mainmenu'; -import { LabIcon } from '@jupyterlab/ui-components'; -import { Widget } from '@lumino/widgets'; -import { JupyterlabNotebookCodeOptimizer } from './deepcoder'; -import { Constants } from './constants'; - - -class neural_compressor_ext_lab - implements DocumentRegistry.IWidgetExtension { - private app: JupyterFrontEnd; - private tracker: INotebookTracker; - private notebookpanel: NotebookPanel; - private config: string; - private notebookCodeOptimizer: JupyterlabNotebookCodeOptimizer | undefined; - - constructor( - app: JupyterFrontEnd, - tracker: INotebookTracker, - notebookpanel:NotebookPanel - ) { - this.app = app; - this.tracker = tracker; - this.notebookpanel = notebookpanel; - this.setupWidgetExtension(); - this.config = '' - } - - public createNew( - nb: NotebookPanel, - ) { - this.notebookpanel = nb; - this.notebookCodeOptimizer = new JupyterlabNotebookCodeOptimizer( - this.tracker, - this.notebookpanel - ); - const svg = document.createElement("svg") - svg.innerHTML = Constants.ICON_FORMAT_ALL_SVG - const run_svg = document.createElement("svg") - run_svg.innerHTML = Constants.ICON_RUN - const div = document.createElement("div"); - div.setAttribute("class","wrapper") - const span = document.createElement("span"); - span.setAttribute("class","f1ozlkqi") - span.innerHTML = Constants.SVG; - const selector = document.createElement("select"); - selector.setAttribute("class","aselector") - selector.id = "NeuralCoder" - const option1 = document.createElement("option"); - option1.value = "pytorch_aliblade"; - option1.innerText = "Alibaba Blade-DISC"; - const option2 = document.createElement("option"); - option2.value = "auto"; - option2.innerText = "Auto Benchmark"; - option1.selected=true; - - selector.options.add(option1) - selector.options.add(option2) - div.appendChild(selector) - div.appendChild(span) - const selector_widget = new Widget(); - selector_widget.node.appendChild(div) - selector_widget.addClass("aselector") - let notebookCodeOptimizer = this.notebookCodeOptimizer; - let config = this.config; - - const dia_input = document.createElement("input") - const dia_widget = new Widget(); - dia_widget.node.appendChild(dia_input) - dia_widget.addClass("dialog") - - const run_button = new ToolbarButton({ - tooltip: 'NeuralCoder', - icon: new LabIcon({ - name: "run", - svgstr:Constants.ICON_RUN - }), - onClick: async function (){ - run_button.node.firstChild?.firstChild?.firstChild?.firstChild?.replaceWith(svg) - if (selector.options[selector.selectedIndex].value === 'auto'){ - await showDialog({ - title:'Please input execute parameters:', - body: dia_widget, - buttons: [Dialog.okButton({ label: 'Confirm' })] - }).then(result => { - if (result.button.accept) { - config = dia_input.value - } - }) - } - await notebookCodeOptimizer.optimizeAllCodeCells(config,selector.options[selector.selectedIndex].value,undefined,run_button); - } - }); - nb.toolbar.insertItem(11,"nc",run_button) - nb.toolbar.insertItem(12,"selector",selector_widget) - - } - - private setupWidgetExtension() { - this.app.docRegistry.addWidgetExtension('Notebook', this); - } -} - - - -/** - * Initialization data for the neural_compressor_ext_lab extension. - */ -const plugin: JupyterFrontEndPlugin = { - id: 'neural_compressor_ext_lab:plugin', - autoStart: true, - requires: [INotebookTracker,IMainMenu], - optional: [ISettingRegistry], - activate: ( - app: JupyterFrontEnd, - tracker: INotebookTracker, - notebookpanel: NotebookPanel - ) => { - new neural_compressor_ext_lab( - app, - tracker, - notebookpanel - ); - console.log('JupyterLab extension neural_compressor_ext_lab is activated!'); - } -}; - -export default plugin; diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/src/utils.tsx b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/src/utils.tsx deleted file mode 100644 index f76b2f20d40..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/src/utils.tsx +++ /dev/null @@ -1,366 +0,0 @@ -/* - * Copyright 2019-2020 The Kale Authors - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { Dialog, showDialog } from '@jupyterlab/apputils'; -import { NotebookPanel } from '@jupyterlab/notebook'; -import { KernelMessage, Kernel } from '@jupyterlab/services'; -import { CommandRegistry } from '@phosphor/commands'; -// @ts-ignore -import SanitizedHTML from 'react-sanitized-html'; -import * as React from 'react'; -import { ReactElement } from 'react'; - - - -export default class NotebookUtilities { - /** - * generate random number - * @Min - * @Max - */ - public static GetRandomNum(Min:number, Max:number):number { - let Range : number; - Range = Max - Min; - var Rand = Math.random(); - return (Min + Math.round(Rand * Range)); - } - /** - * Builds an HTML container by sanitizing a list of strings and converting - * them in valid HTML - * @param msg A list of string with HTML formatting - * @returns a HTMLDivElement composed of a list of spans with formatted text - */ - private static buildDialogBody(msg: string[]): ReactElement { - return ( -
- {msg.map((s: string, i: number) => { - return ( - - -
-
- ); - })} -
- ); - } - - /** - * Opens a pop-up dialog in JupyterLab to display a simple message. - * @param title The title for the message popup - * @param msg The message as an array of strings - * @param buttonLabel The label to use for the button. Default is 'OK' - * @param buttonClassName The classname to give to the 'ok' button - * @returns Promise - A promise once the message is closed. - */ - public static async showMessage( - title: string, - msg: string[], - buttonLabel: string = 'Dismiss', - buttonClassName: string = '', - ): Promise { - const buttons: ReadonlyArray = [ - Dialog.okButton({ label: buttonLabel, className: buttonClassName }), - ]; - const messageBody = this.buildDialogBody(msg); - await showDialog({ title, buttons, body: messageBody }); - } - - /** - * Opens a pop-up dialog in JupyterLab to display a yes/no dialog. - * @param title The title for the message popup - * @param msg The message - * @param acceptLabel The label to use for the accept button. Default is 'YES' - * @param rejectLabel The label to use for the reject button. Default is 'NO' - * @param yesButtonClassName The classname to give to the accept button. - * @param noButtonClassName The classname to give to the cancel button. - * @returns Promise - A promise once the message is closed. - */ - public static async showYesNoDialog( - title: string, - msg: string[], - acceptLabel: string = 'YES', - rejectLabel: string = 'NO', - yesButtonClassName: string = '', - noButtonClassName: string = '', - ): Promise { - const buttons: ReadonlyArray = [ - Dialog.okButton({ label: acceptLabel, className: yesButtonClassName }), - Dialog.cancelButton({ label: rejectLabel, className: noButtonClassName }), - ]; - const messageBody = this.buildDialogBody(msg); - const result = await showDialog({ title, buttons, body: messageBody }); - return result.button.label === acceptLabel; - } - - /** - * Opens a pop-up dialog in JupyterLab with various information and button - * triggering reloading the page. - * @param title The title for the message popup - * @param msg The message - * @param buttonLabel The label to use for the button. Default is 'Refresh' - * @param buttonClassName The classname to give to the 'refresh' button. - * @returns Promise - A promise once the message is closed. - */ - public static async showRefreshDialog( - title: string, - msg: string[], - buttonLabel: string = 'Refresh', - buttonClassName: string = '', - ): Promise { - await this.showMessage(title, msg, buttonLabel, buttonClassName); - location.reload(); - } - - /** - * @description Creates a new JupyterLab notebook for use by the application - * @param command The command registry - * @returns Promise - A promise containing the notebook panel object that was created (if successful). - */ - public static async createNewNotebook( - command: CommandRegistry, - ): Promise { - const notebook: any = await command.execute('notebook:create-new', { - activate: true, - path: '', - preferredLanguage: '', - }); - await notebook.session.ready; - return notebook; - } - - /** - * Safely saves the Jupyter notebook document contents to disk - * @param notebookPanel The notebook panel containing the notebook to save - */ - public static async saveNotebook( - notebookPanel: NotebookPanel, - ): Promise { - if (notebookPanel) { - await notebookPanel.context.ready; - notebookPanel.context.save(); - return true; - } - return false; - } - - /** - * Convert the notebook contents to JSON - * @param notebookPanel The notebook panel containing the notebook to serialize - */ - public static notebookToJSON(notebookPanel: NotebookPanel): any { - if (notebookPanel.content.model) { - return notebookPanel.content.model.toJSON(); - } - return null; - } - - /** - * @description Gets the value of a key from specified notebook's metadata. - * @param notebookPanel The notebook to get meta data from. - * @param key The key of the value. - * @returns any -The value of the metadata. Returns null if the key doesn't exist. - */ - public static getMetaData(notebookPanel: NotebookPanel, key: string): any { - if (!notebookPanel) { - throw new Error( - 'The notebook is null or undefined. No meta data available.', - ); - } - if (notebookPanel.model && notebookPanel.model.metadata.has(key)) { - return notebookPanel.model.metadata.get(key); - } - return null; - } - - /** - * @description Sets the key value pair in the notebook's metadata. - * If the key doesn't exists it will add one. - * @param notebookPanel The notebook to set meta data in. - * @param key The key of the value to create. - * @param value The value to set. - * @param save Default is false. Whether the notebook should be saved after the meta data is set. - * Note: This function will not wait for the save to complete, it only sends a save request. - * @returns The old value for the key, or undefined if it did not exist. - */ - public static setMetaData( - notebookPanel: NotebookPanel, - key: string, - value: any, - save: boolean = false, - ): any { - if (!notebookPanel) { - throw new Error( - 'The notebook is null or undefined. No meta data available.', - ); - } - const oldVal = notebookPanel.model?.metadata.set(key, value); - if (save) { - this.saveNotebook(notebookPanel); - } - return oldVal; - } - - // /** - // * Get a new Kernel, not tied to a Notebook - // * Source code here: https://github.com/jupyterlab/jupyterlab/tree/473348d25bcb258ca2f0c127dd8fb5b193217135/packages/services - // */ - // public static async createNewKernel() { - // // Get info about the available kernels and start a new one. - // let options: Kernel.IOptions = await Kernel.getSpecs().then(kernelSpecs => { - // // console.log('Default spec:', kernelSpecs.default); - // // console.log('Available specs', Object.keys(kernelSpecs.kernelspecs)); - // // use the default name - // return { name: kernelSpecs.default }; - // }); - // return await Kernel.startNew(options).then(_kernel => { - // return _kernel; - // }); - // } - - // // TODO: We can use this context manager to execute commands inside a new kernel - // // and be sure that it will be disposed of at the end. - // // Another approach could be to create a kale_rpc Kernel, as a singleton, - // // created at startup. The only (possible) drawback is that we can not name - // // a kernel instance with a custom id/name, so when refreshing JupyterLab we would - // // not recognize the kernel. A solution could be to have a kernel spec dedicated to kale rpc calls. - // public static async executeWithNewKernel(action: Function, args: any[] = []) { - // // create brand new kernel - // const _k = await this.createNewKernel(); - // // execute action inside kernel - // const res = await action(_k, ...args); - // // close kernel - // _k.shutdown(); - // // return result - // return res; - // } - - /** - * @description This function runs code directly in the notebook's kernel and then evaluates the - * result and returns it as a promise. - * @param kernel The kernel to run the code in. - * @param runCode The code to run in the kernel. - * @param userExpressions The expressions used to capture the desired info from the executed code. - * @param runSilent Default is false. If true, kernel will execute as quietly as possible. - * store_history will be set to false, and no broadcast on IOPUB channel will be made. - * @param storeHistory Default is false. If true, the code executed will be stored in the kernel's history - * and the counter which is shown in the cells will be incremented to reflect code was run. - * @param allowStdIn Default is false. If true, code running in kernel can prompt user for input using - * an input_request message. - * @param stopOnError Default is false. If True, does not abort the execution queue, if an exception is encountered. - * This allows the queued execution of multiple execute_requests, even if they generate exceptions. - * @returns Promise - A promise containing the execution results of the code as an object with - * keys based on the user_expressions. - * @example - * //The code - * const code = "a=123\nb=456\nsum=a+b"; - * //The user expressions - * const expr = {sum: "sum",prod: "a*b",args:"[a,b,sum]"}; - * //Async function call (returns a promise) - * sendKernelRequest(notebookPanel, code, expr,false); - * //Result when promise resolves: - * { - * sum:{status:"ok",data:{"text/plain":"579"},metadata:{}}, - * prod:{status:"ok",data:{"text/plain":"56088"},metadata:{}}, - * args:{status:"ok",data:{"text/plain":"[123, 456, 579]"}} - * } - * @see For more information on JupyterLab messages: - * https://jupyter-client.readthedocs.io/en/latest/messaging.html#execution-results - */ - public static async sendKernelRequest( - kernel: Kernel.IKernelConnection| null | undefined, - runCode: string, - userExpressions: any, - runSilent: boolean = false, - storeHistory: boolean = false, - allowStdIn: boolean = false, - stopOnError: boolean = false, - ): Promise { - if (!kernel) { - throw new Error('Kernel is null or undefined.'); - } - - // Wait for kernel to be ready before sending request - // await kernel.status; - - const message: KernelMessage.IShellMessage = await kernel.requestExecute({ - allow_stdin: allowStdIn, - code: runCode, - silent: runSilent, - stop_on_error: stopOnError, - store_history: storeHistory, - user_expressions: userExpressions, - }).done; - - const content: any = message.content; - - if (content.status !== 'ok') { - // If response is not 'ok', throw contents as error, log code - const msg: string = `Code caused an error:\n${runCode}`; - console.error(msg); - if (content.traceback) { - content.traceback.forEach((line: string) => - console.log( - line.replace( - /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, - '', - ), - ), - ); - } - throw content; - } - // Return user_expressions of the content - return content.user_expressions; - } - - /** - * Same as method sendKernelRequest but passing - * a NotebookPanel instead of a Kernel - */ - public static async sendKernelRequestFromNotebook( - notebookPanel: NotebookPanel, - runCode: string, - userExpressions: any, - runSilent: boolean = false, - storeHistory: boolean = false, - allowStdIn: boolean = false, - stopOnError: boolean = false, - ) { - if (!notebookPanel) { - throw new Error('Notebook is null or undefined.'); - } - - // Wait for notebook panel to be ready - await notebookPanel.activate; - await notebookPanel.sessionContext?.ready; - console.log('get kernel',notebookPanel.sessionContext.session?.kernel) - return this.sendKernelRequest( - notebookPanel.sessionContext?.session?.kernel, - runCode, - userExpressions, - runSilent, - storeHistory, - allowStdIn, - stopOnError, - ); - } - - } diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/style/base.css b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/style/base.css deleted file mode 100644 index 16b572c0e9a..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/style/base.css +++ /dev/null @@ -1,636 +0,0 @@ -/* - See the JupyterLab Developer Guide for useful CSS Patterns: - - https://jupyterlab.readthedocs.io/en/stable/developer/css.html -*/ -.lds-ripple { - display: flex; - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - margin: auto; - width: 80px; - height: 80px; -} -.lds-ripple div { - position: absolute; - left: 0; - top: 0; - right: 0; - bottom: 0; - margin: auto; - border: 4px solid rgb(245, 131, 55); - opacity: 1; - border-radius: 50%; - animation: lds-ripple 1s cubic-bezier(0, 0.2, 0.8, 1) infinite; -} -.lds-ripple div:nth-child(2) { - animation-delay: -0.5s; -} -@keyframes lds-ripple { - 0% { - left: 0; - top: 0; - right: 0; - bottom: 0; - margin: auto; - width: 0; - height: 0; - opacity: 0; - } - 4.9% { - left: 0; - top: 0; - right: 0; - bottom: 0; - margin: auto; - width: 0; - height: 0; - opacity: 0; - } - 5% { - left: 0; - top: 0; - right: 0; - bottom: 0; - margin: auto; - width: 0; - height: 0; - opacity: 1; - } - 100% { - top: 0px; - left: 0px; - width: 72px; - height: 72px; - opacity: 0; - } -} - - -/* CSS */ -.button-62 { - background: linear-gradient(to bottom right, #EF4765, #FF9A5A); - border: 0; - border-radius: 12px; - color: #FFFFFF; - cursor: pointer; - display: inline-block; - font-family: -apple-system,system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif; - font-size: 16px; - font-weight: 500; - line-height: 2.5; - outline: transparent; - padding: 0 1rem; - text-align: center; - text-decoration: none; - transition: box-shadow .2s ease-in-out; - user-select: none; - -webkit-user-select: none; - touch-action: manipulation; - white-space: nowrap; -} - -.button-62:not([disabled]):focus { - box-shadow: 0 0 .25rem rgba(0, 0, 0, 0.5), -.125rem -.125rem 1rem rgba(239, 71, 101, 0.5), .125rem .125rem 1rem rgba(255, 154, 90, 0.5); -} - -.button-62:not([disabled]):hover { - box-shadow: 0 0 .25rem rgba(0, 0, 0, 0.5), -.125rem -.125rem 1rem rgba(239, 71, 101, 0.5), .125rem .125rem 1rem rgba(255, 154, 90, 0.5); -} - -.aselector select { - background-color: initial; - border: none; - border-radius: 0; - box-shadow: none; - color: var(--jp-ui-font-color0); - display: block; - font-size: var(--jp-ui-font-size1); - height: 24px; - line-height: 14px; - padding: 0 25px 0 10px; - text-align: left; - -moz-appearance: none; - -webkit-appearance: none; -} - -/* Use our own theme for hover and option styles */ -.aselector select:hover, -.aselector select > option { - background-color: var(--jp-layout-color2); - color: var(--jp-ui-font-color0); -} -select { - box-sizing: border-box; -} - -.font{ -background-color: initial; -border: none; -height: 21px; -border-radius: 0; -font-weight:500; -color: var(--jp-ui-font-color0); -display: block; -line-height: 22.5px; -padding: 0 25px 0 10px; -font-size: var(--jp-ui-font-size1); -} -.wrapper { - display: flex; -} -.f1ozlkqi { - pointer-events: none; -} - -.palybutton{ - background-image: '/home2/longxin/Neural_Coder_EXT/style/icons8-circled-play.gif'; -} -.loading{ - - background-image: url("data:image/svg+xml,"); - background-size: contain; -} - -.dialog{ -body { - margin: 0; - height: 100vh; - width:600px; - display: flex; - align-items: center; - justify-content: center; - overflow: hidden; - font-family: "Poppins", sans-serif; - background: #e3d0b6; -} - -#cookie-policy { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - width: 460px; - height: 600px; - background: #f3efe6; - border-radius: 12px; - transform: scale(.8); -} - -#cookie-wrapper { - height: 240px; - width: 240px; - margin: 30px 0; - position: relative; - left: -40px; -} - -h1 { - color: #6c3a1f; - text-align: center; - font-size: 36px; - margin: 0; -} - -p { - color: #a28561; - font-size: 14px; - margin-top: 0; - padding: 0 60px; - text-align: center; -} -a { - margin-top: 18px; - font-size: 14px; - color: #a28561; - text-decoration: none; - pointer-events: none; -} -a:hover { - color: #846b4d; -} - -span { - font-family: "Amatic SC", cursive; - font-weight: 400; - font-size: 20px; - position: relative; - top: -18px; - left: 3px; - color: #a28561; -} - -#heart-no, #thought-heart-yes, #mouth, #face-no, #thought-1, #thought-2, #thought-heart-na, #q-mark, #eyes, #leg-l, #leg-r { - opacity: 0; -} -} -.dia_button { - color: white; - background: #dd794a; - margin-top: 12px; - cursor: pointer; - font-size: 24px; - font-family: "Poppins", sans-serif; - border-radius: 9px; - border: none; - width: 72%; - padding: 12px 0; - transition: 150ms ease-out; - pointer-events: none; -} - -.dia_button:hover { - background: #d66029; -} - -.pad{ - padding-left:6% -} - -:root { - /* Elevation - * - * We style box-shadows using Material Design's idea of elevation. These particular numbers are taken from here: - * - * https://github.com/material-components/material-components-web - * https://material-components-web.appspot.com/elevation.html - */ - - --jp-shadow-base-lightness: 0; - --jp-shadow-umbra-color: rgba( - var(--jp-shadow-base-lightness), - var(--jp-shadow-base-lightness), - var(--jp-shadow-base-lightness), - 0.2 - ); - --jp-shadow-penumbra-color: rgba( - var(--jp-shadow-base-lightness), - var(--jp-shadow-base-lightness), - var(--jp-shadow-base-lightness), - 0.14 - ); - --jp-shadow-ambient-color: rgba( - var(--jp-shadow-base-lightness), - var(--jp-shadow-base-lightness), - var(--jp-shadow-base-lightness), - 0.12 - ); - --jp-elevation-z0: none; - --jp-elevation-z1: 0px 2px 1px -1px var(--jp-shadow-umbra-color), - 0px 1px 1px 0px var(--jp-shadow-penumbra-color), - 0px 1px 3px 0px var(--jp-shadow-ambient-color); - --jp-elevation-z2: 0px 3px 1px -2px var(--jp-shadow-umbra-color), - 0px 2px 2px 0px var(--jp-shadow-penumbra-color), - 0px 1px 5px 0px var(--jp-shadow-ambient-color); - --jp-elevation-z4: 0px 2px 4px -1px var(--jp-shadow-umbra-color), - 0px 4px 5px 0px var(--jp-shadow-penumbra-color), - 0px 1px 10px 0px var(--jp-shadow-ambient-color); - --jp-elevation-z6: 0px 3px 5px -1px var(--jp-shadow-umbra-color), - 0px 6px 10px 0px var(--jp-shadow-penumbra-color), - 0px 1px 18px 0px var(--jp-shadow-ambient-color); - --jp-elevation-z8: 0px 5px 5px -3px var(--jp-shadow-umbra-color), - 0px 8px 10px 1px var(--jp-shadow-penumbra-color), - 0px 3px 14px 2px var(--jp-shadow-ambient-color); - --jp-elevation-z12: 0px 7px 8px -4px var(--jp-shadow-umbra-color), - 0px 12px 17px 2px var(--jp-shadow-penumbra-color), - 0px 5px 22px 4px var(--jp-shadow-ambient-color); - --jp-elevation-z16: 0px 8px 10px -5px var(--jp-shadow-umbra-color), - 0px 16px 24px 2px var(--jp-shadow-penumbra-color), - 0px 6px 30px 5px var(--jp-shadow-ambient-color); - --jp-elevation-z20: 0px 10px 13px -6px var(--jp-shadow-umbra-color), - 0px 20px 31px 3px var(--jp-shadow-penumbra-color), - 0px 8px 38px 7px var(--jp-shadow-ambient-color); - --jp-elevation-z24: 0px 11px 15px -7px var(--jp-shadow-umbra-color), - 0px 24px 38px 3px var(--jp-shadow-penumbra-color), - 0px 9px 46px 8px var(--jp-shadow-ambient-color); - - /* Borders - * - * The following variables, specify the visual styling of borders in JupyterLab. - */ - - --jp-border-width: 1px; - --jp-border-color0: var(--md-grey-400); - --jp-border-color1: var(--md-grey-400); - --jp-border-color2: var(--md-grey-300); - --jp-border-color3: var(--md-grey-200); - --jp-inverse-border-color: var(--md-grey-600); - --jp-border-radius: 2px; - - /* UI Fonts - * - * The UI font CSS variables are used for the typography all of the JupyterLab - * user interface elements that are not directly user generated content. - * - * The font sizing here is done assuming that the body font size of --jp-ui-font-size1 - * is applied to a parent element. When children elements, such as headings, are sized - * in em all things will be computed relative to that body size. - */ - - --jp-ui-font-scale-factor: 1.2; - --jp-ui-font-size0: 0.83333em; - --jp-ui-font-size1: 13px; /* Base font size */ - --jp-ui-font-size2: 1.2em; - --jp-ui-font-size3: 1.44em; - - --jp-ui-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, - Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; - - /* - * Use these font colors against the corresponding main layout colors. - * In a light theme, these go from dark to light. - */ - - /* Defaults use Material Design specification */ - --jp-ui-font-color0: rgba(0, 0, 0, 1); - --jp-ui-font-color1: rgba(0, 0, 0, 0.87); - --jp-ui-font-color2: rgba(0, 0, 0, 0.54); - --jp-ui-font-color3: rgba(0, 0, 0, 0.38); - - /* - * Use these against the brand/accent/warn/error colors. - * These will typically go from light to darker, in both a dark and light theme. - */ - - --jp-ui-inverse-font-color0: rgba(255, 255, 255, 1); - --jp-ui-inverse-font-color1: rgba(255, 255, 255, 1); - --jp-ui-inverse-font-color2: rgba(255, 255, 255, 0.7); - --jp-ui-inverse-font-color3: rgba(255, 255, 255, 0.5); - - /* Content Fonts - * - * Content font variables are used for typography of user generated content. - * - * The font sizing here is done assuming that the body font size of --jp-content-font-size1 - * is applied to a parent element. When children elements, such as headings, are sized - * in em all things will be computed relative to that body size. - */ - - --jp-content-line-height: 1.6; - --jp-content-font-scale-factor: 1.2; - --jp-content-font-size0: 0.83333em; - --jp-content-font-size1: 14px; /* Base font size */ - --jp-content-font-size2: 1.2em; - --jp-content-font-size3: 1.44em; - --jp-content-font-size4: 1.728em; - --jp-content-font-size5: 2.0736em; - - /* This gives a magnification of about 125% in presentation mode over normal. */ - --jp-content-presentation-font-size1: 17px; - - --jp-content-heading-line-height: 1; - --jp-content-heading-margin-top: 1.2em; - --jp-content-heading-margin-bottom: 0.8em; - --jp-content-heading-font-weight: 500; - - /* Defaults use Material Design specification */ - --jp-content-font-color0: rgba(0, 0, 0, 1); - --jp-content-font-color1: rgba(0, 0, 0, 0.87); - --jp-content-font-color2: rgba(0, 0, 0, 0.54); - --jp-content-font-color3: rgba(0, 0, 0, 0.38); - - --jp-content-link-color: var(--md-blue-700); - - --jp-content-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', - Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', - 'Segoe UI Symbol'; - - /* - * Code Fonts - * - * Code font variables are used for typography of code and other monospaces content. - */ - - --jp-code-font-size: 13px; - --jp-code-line-height: 1.3077; /* 17px for 13px base */ - --jp-code-padding: 5px; /* 5px for 13px base, codemirror highlighting needs integer px value */ - --jp-code-font-family-default: Menlo, Consolas, 'DejaVu Sans Mono', monospace; - --jp-code-font-family: var(--jp-code-font-family-default); - - /* This gives a magnification of about 125% in presentation mode over normal. */ - --jp-code-presentation-font-size: 16px; - - /* may need to tweak cursor width if you change font size */ - --jp-code-cursor-width0: 1.4px; - --jp-code-cursor-width1: 2px; - --jp-code-cursor-width2: 4px; - - /* Layout - * - * The following are the main layout colors use in JupyterLab. In a light - * theme these would go from light to dark. - */ - - --jp-layout-color0: white; - --jp-layout-color1: white; - --jp-layout-color2: var(--md-grey-200); - --jp-layout-color3: var(--md-grey-400); - --jp-layout-color4: var(--md-grey-600); - - /* Inverse Layout - * - * The following are the inverse layout colors use in JupyterLab. In a light - * theme these would go from dark to light. - */ - - --jp-inverse-layout-color0: #111111; - --jp-inverse-layout-color1: var(--md-grey-900); - --jp-inverse-layout-color2: var(--md-grey-800); - --jp-inverse-layout-color3: var(--md-grey-700); - --jp-inverse-layout-color4: var(--md-grey-600); - - /* Brand/accent */ - - --jp-brand-color0: var(--md-blue-900); - --jp-brand-color1: var(--md-blue-700); - --jp-brand-color2: var(--md-blue-300); - --jp-brand-color3: var(--md-blue-100); - --jp-brand-color4: var(--md-blue-50); - - --jp-accent-color0: var(--md-green-900); - --jp-accent-color1: var(--md-green-700); - --jp-accent-color2: var(--md-green-300); - --jp-accent-color3: var(--md-green-100); - - /* State colors (warn, error, success, info) */ - - --jp-warn-color0: var(--md-orange-900); - --jp-warn-color1: var(--md-orange-700); - --jp-warn-color2: var(--md-orange-300); - --jp-warn-color3: var(--md-orange-100); - - --jp-error-color0: var(--md-red-900); - --jp-error-color1: var(--md-red-700); - --jp-error-color2: var(--md-red-300); - --jp-error-color3: var(--md-red-100); - - --jp-success-color0: var(--md-green-900); - --jp-success-color1: var(--md-green-700); - --jp-success-color2: var(--md-green-300); - --jp-success-color3: var(--md-green-100); - - --jp-info-color0: var(--md-cyan-900); - --jp-info-color1: var(--md-cyan-700); - --jp-info-color2: var(--md-cyan-300); - --jp-info-color3: var(--md-cyan-100); - - /* Cell specific styles */ - - --jp-cell-padding: 5px; - - --jp-cell-collapser-width: 8px; - --jp-cell-collapser-min-height: 20px; - --jp-cell-collapser-not-active-hover-opacity: 0.6; - - --jp-cell-editor-background: var(--md-grey-100); - --jp-cell-editor-border-color: var(--md-grey-300); - --jp-cell-editor-box-shadow: inset 0 0 2px var(--md-blue-300); - --jp-cell-editor-active-background: var(--jp-layout-color0); - --jp-cell-editor-active-border-color: var(--jp-brand-color1); - - --jp-cell-prompt-width: 64px; - --jp-cell-prompt-font-family: var(--jp-code-font-family-default); - --jp-cell-prompt-letter-spacing: 0px; - --jp-cell-prompt-opacity: 1; - --jp-cell-prompt-not-active-opacity: 0.5; - --jp-cell-prompt-not-active-font-color: var(--md-grey-700); - /* A custom blend of MD grey and blue 600 - * See https://meyerweb.com/eric/tools/color-blend/#546E7A:1E88E5:5:hex */ - --jp-cell-inprompt-font-color: #307fc1; - /* A custom blend of MD grey and orange 600 - * https://meyerweb.com/eric/tools/color-blend/#546E7A:F4511E:5:hex */ - --jp-cell-outprompt-font-color: #bf5b3d; - - /* Notebook specific styles */ - - --jp-notebook-padding: 10px; - --jp-notebook-select-background: var(--jp-layout-color1); - --jp-notebook-multiselected-color: var(--md-blue-50); - - /* The scroll padding is calculated to fill enough space at the bottom of the - notebook to show one single-line cell (with appropriate padding) at the top - when the notebook is scrolled all the way to the bottom. We also subtract one - pixel so that no scrollbar appears if we have just one single-line cell in the - notebook. This padding is to enable a 'scroll past end' feature in a notebook. - */ - --jp-notebook-scroll-padding: calc( - 100% - var(--jp-code-font-size) * var(--jp-code-line-height) - - var(--jp-code-padding) - var(--jp-cell-padding) - 1px - ); - - /* Rendermime styles */ - - --jp-rendermime-error-background: #fdd; - --jp-rendermime-table-row-background: var(--md-grey-100); - --jp-rendermime-table-row-hover-background: var(--md-light-blue-50); - - /* Dialog specific styles */ - - --jp-dialog-background: rgba(0, 0, 0, 0.25); - - /* Console specific styles */ - - --jp-console-padding: 10px; - - /* Toolbar specific styles */ - - --jp-toolbar-border-color: var(--jp-border-color1); - --jp-toolbar-micro-height: 8px; - --jp-toolbar-background: var(--jp-layout-color1); - --jp-toolbar-box-shadow: 0px 0px 2px 0px rgba(0, 0, 0, 0.24); - --jp-toolbar-header-margin: 4px 4px 0px 4px; - --jp-toolbar-active-background: var(--md-grey-300); - - /* Statusbar specific styles */ - - --jp-statusbar-height: 24px; - - /* Input field styles */ - - --jp-input-box-shadow: inset 0 0 2px var(--md-blue-300); - --jp-input-active-background: var(--jp-layout-color1); - --jp-input-hover-background: var(--jp-layout-color1); - --jp-input-background: var(--md-grey-100); - --jp-input-border-color: var(--jp-inverse-border-color); - --jp-input-active-border-color: var(--jp-brand-color1); - --jp-input-active-box-shadow-color: rgba(19, 124, 189, 0.3); - - /* General editor styles */ - - --jp-editor-selected-background: #d9d9d9; - --jp-editor-selected-focused-background: #d7d4f0; - --jp-editor-cursor-color: var(--jp-ui-font-color0); - - /* Code mirror specific styles */ - - --jp-mirror-editor-keyword-color: #008000; - --jp-mirror-editor-atom-color: #88f; - --jp-mirror-editor-number-color: #080; - --jp-mirror-editor-def-color: #00f; - --jp-mirror-editor-variable-color: var(--md-grey-900); - --jp-mirror-editor-variable-2-color: #05a; - --jp-mirror-editor-variable-3-color: #085; - --jp-mirror-editor-punctuation-color: #05a; - --jp-mirror-editor-property-color: #05a; - --jp-mirror-editor-operator-color: #aa22ff; - --jp-mirror-editor-comment-color: #408080; - --jp-mirror-editor-string-color: #ba2121; - --jp-mirror-editor-string-2-color: #708; - --jp-mirror-editor-meta-color: #aa22ff; - --jp-mirror-editor-qualifier-color: #555; - --jp-mirror-editor-builtin-color: #008000; - --jp-mirror-editor-bracket-color: #997; - --jp-mirror-editor-tag-color: #170; - --jp-mirror-editor-attribute-color: #00c; - --jp-mirror-editor-header-color: blue; - --jp-mirror-editor-quote-color: #090; - --jp-mirror-editor-link-color: #00c; - --jp-mirror-editor-error-color: #f00; - --jp-mirror-editor-hr-color: #999; - - /* Vega extension styles */ - - --jp-vega-background: white; - - /* Sidebar-related styles */ - - --jp-sidebar-min-width: 250px; - - /* Search-related styles */ - - --jp-search-toggle-off-opacity: 0.5; - --jp-search-toggle-hover-opacity: 0.8; - --jp-search-toggle-on-opacity: 1; - --jp-search-selected-match-background-color: rgb(245, 200, 0); - --jp-search-selected-match-color: black; - --jp-search-unselected-match-background-color: var( - --jp-inverse-layout-color0 - ); - --jp-search-unselected-match-color: var(--jp-ui-inverse-font-color0); - - /* Icon colors that work well with light or dark backgrounds */ - --jp-icon-contrast-color0: var(--md-purple-600); - --jp-icon-contrast-color1: var(--md-green-600); - --jp-icon-contrast-color2: var(--md-pink-600); - --jp-icon-contrast-color3: var(--md-blue-600); -} - -/*----------------------------------------------------------------------------- -| Copyright (c) Jupyter Development Team. -| Distributed under the terms of the Modified BSD License. -|----------------------------------------------------------------------------*/ - -/* Set the default typography for monospace elements */ -tt, -code, -kbd, -samp, -pre { - font-family: var(--jp-code-font-family); - font-size: var(--jp-code-font-size); - line-height: var(--jp-code-line-height); -} - diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/style/base.scss b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/style/base.scss deleted file mode 100644 index eb86f52434a..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/style/base.scss +++ /dev/null @@ -1,36 +0,0 @@ -svg#play { - width:200px; - margin: 120px auto; - display:block; - cursor: pointer; - transform-origin: 50% 50%; - } - - svg#play #triangle { - fill:rgba(22,22,22,0); - transition:500ms; - transform-origin: 50% 50%; - } - svg#play:hover #triangle { - fill:#696969; - transform-origin: 50% 50%; - } - - svg #lineOne, svg #lineTwo { - transform-origin: 50% 50%; - transition: 1s; - } - - svg:hover #lineOne { - transform: rotate(260deg); - -webkit-transform: rotate(260deg); - -moz-transform: rotate(260deg); - -o-transform: rotate(260deg); - transform-origin: 50% 50%; - } - - svg:hover #lineTwo { - transform: rotate(-450deg); - transform-origin: 50% 50%; - } - \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/style/index.css b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/style/index.css deleted file mode 100644 index 8a7ea29e694..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/style/index.css +++ /dev/null @@ -1 +0,0 @@ -@import url('base.css'); diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/style/index.js b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/style/index.js deleted file mode 100644 index a028a76408b..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/style/index.js +++ /dev/null @@ -1 +0,0 @@ -import './base.css'; diff --git a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/tsconfig.json b/neural_coder/extensions/neural_compressor_ext_lab_alibaba/tsconfig.json deleted file mode 100644 index 7c8e8c78b69..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_lab_alibaba/tsconfig.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "compilerOptions": { - "allowSyntheticDefaultImports": true, - "composite": true, - "declaration": true, - "esModuleInterop": true, - "incremental": true, - "jsx": "react", - "module": "esnext", - "moduleResolution": "node", - "noEmitOnError": true, - "noImplicitAny": true, - "noUnusedLocals": true, - "preserveWatchOutput": true, - "resolveJsonModule": true, - "outDir": "lib", - "rootDir": "src", - "strict": true, - "strictNullChecks": true, - "target": "es2017", - "types": ["node"] - }, - "include": ["src/*"] -} diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/.eslintrc.json b/neural_coder/extensions/neural_compressor_ext_vscode/.eslintrc.json deleted file mode 100644 index f9b22b793c2..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/.eslintrc.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "root": true, - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 6, - "sourceType": "module" - }, - "plugins": [ - "@typescript-eslint" - ], - "rules": { - "@typescript-eslint/naming-convention": "warn", - "@typescript-eslint/semi": "warn", - "curly": "warn", - "eqeqeq": "warn", - "no-throw-literal": "warn", - "semi": "off" - }, - "ignorePatterns": [ - "out", - "dist", - "**/*.d.ts" - ] -} diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/.gitignore b/neural_coder/extensions/neural_compressor_ext_vscode/.gitignore deleted file mode 100644 index 0b60dfa12fb..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -out -dist -node_modules -.vscode-test/ -*.vsix diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/.vscodeignore b/neural_coder/extensions/neural_compressor_ext_vscode/.vscodeignore deleted file mode 100644 index 8791332ab30..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/.vscodeignore +++ /dev/null @@ -1,12 +0,0 @@ -.vscode/** -.vscode-test/** -out/** -node_modules/** -.gitignore -.yarnrc -webpack.config.js -vsc-extension-quickstart.md -**/tsconfig.json -**/.eslintrc.json -**/*.map -**/*.ts diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/CHANGELOG.md b/neural_coder/extensions/neural_compressor_ext_vscode/CHANGELOG.md deleted file mode 100644 index 03ea45e180e..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/CHANGELOG.md +++ /dev/null @@ -1,9 +0,0 @@ -# Change Log - -All notable changes to the "neural-compressor-ext-vscode" extension will be documented in this file. - -Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. - -## [Unreleased] - -- Initial release \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/README.md b/neural_coder/extensions/neural_compressor_ext_vscode/README.md deleted file mode 100644 index dbe3529be23..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/README.md +++ /dev/null @@ -1,127 +0,0 @@ -Neural Coder -======================= -Neural Coder, a novel component under **Intel® Neural Compressor** to further simplify the deployment of DL models via **one-click** automated code changes for device compatibility and optimization enabling, has also enabled its extension service in VS Code to further simplify the usage for general programmers that use VS Code as a daily application. -

-
- Neural Coder Logo -

- -[Neural Coder](https://marketplace.visualstudio.com/items?itemName=IntelNeuralCompressor.neural-coder-ext-vscode) is an [open-source](https://github.com/intel/neural-compressor/tree/master/neural_coder) extension for [Visual Studio Code](https://code.visualstudio.com). - -# Background Introduction -## Intel® Neural Compressor -Intel® Neural Compressor is an open-source Python library for model compression that reduces the model size and increases DL inference performance on CPUs or GPUs. It supports post-training static and dynamic quantization of PyTorch models. It supports automatic accuracy-driven tuning strategies for users to easily generate quantized model. The users can easily apply static, dynamic and aware-training quantization approaches while giving an expected accuracy criteria. -## Neural Coder -Neural Coder is a novel component under Intel® Neural Compressor to further simplify the deployment of DL models via one-click automated code changes for device compatibility and optimization enabling. Subsequently, Neural Coder can perform automated benchmark on all optimization approaches and evaluate for the best out-of-box optimized performance. Neural Coder uses static program analysis and heuristics to help users take advantage of Intel DL Boost and hardware features to improve performance. This one-click enabling boosts developer productivity while making it easier to take advantage of acceleration. -## Neural Coder Extension in VSCode -VS Code users can leverage Neural Coder's extension to perform **automatic quantization and benchmark evaluation** for Deep Learning models. - -

- Neural coder Usage -

- -# Neural Coder Extension Usage -We provide here a detailed step-by-step guide on using Neural Coder extension in VS Code: -

- Neural coder Config -

- -### 1. Open -Open VS Code Extension and link to a remote Linux-based server via SSH since Neural Coder requires a Linux-based environment. - -

-VS Code connects to a remote Linux server -

- -> If you're using VS Code on a Linux-based machine, then this step is not needed. - -### 2. Search -Search for Neural Coder extension in VS Code extension market: - -Simply enter "Neural Coder" in the search box of the extension market to find the extension package. - -You will be able to find the icon below, and then just click "Install". (Note: The extension installation location should be a SSH remote server to which you are connected, assuming your VS Code is Windows-based.) -

-Search for Neural Coder in VSCode extension market -

-Once the installation is done, it will display that the extension is installed and enabled on your machine, and you're also able to disable it or uninstall it in case you need to. -

-Neural Coder extension has been successfully installed and enabled -

- -### 3. Setting -Click the "Extension Settings" tab of the setting button on the right and fill in the path of Python you want to run. -- Click the "Extension Settings" tab - -

-Click Extension SettingsPython Path for Neural Coder -

- -- fill in the path -

-Click Extension SettingsPython Path for Neural Coder -

- -### 4. Icon -Open your code for the Deep Learning model that you want to quantize and evaluate. - -You can see a new icon appear to the upper right, and also a left sidebars for the purpose of displaying operation history. -Hover over and see that it's a Neural Coder's icon. -- The icon of Neural Coder extension -

-Click Extension SettingsPython Path for Neural Coder -

- -- The history panel of Neural Coder -

-Click Extension SettingsPython Path for Neural Coder -

- -### 5. optimization (quantization) -Click the Neural Coder button at the top right and select the optimization (quantization) you want to conduct on your Deep Learning code. -#### 5.1 Enable -Select "INC Enable INT8 (Static)", "INC Enable INT8 (Dynamic)", or "INC Enable BF16" - -

-Select 'INC Enable' -

- -Wait for the progress bar. You will see that the quantization has been enabled into your Deep Learning code: - -

-Auto-Enabling of Quantization via VS Code Neural Coder extension (e.g. HuggingFace model) -

- -The history of Neural Coder enabling that you have conducted will appear in the history panel, in the form of patch files, and you can easily track back to see how the quantization enabling is done by Neural Coder for your code at a specific time point: - -- The history of Neural Coder enabling that you have conducted -

-The history of Neural Coder enabling that you have conducted -

- -- A specific Neural Coder enabling as a patch file -

-A specific Neural Coder enabling as a patch file -

- -#### 5.2 Auto -Select "INC Auto Enable Benchmark" -

-Select 'INC Auto' -

-Enter the Python code execution parameters (argparse) for the current code: -

-Enter your Python code execution parameters -

-An "Output" panel will pop up below, displaying the enabling and benchmark results for the current Deep Learning code: -

-Result output -

-The "Auto" section in the history panel keeps the patch file (.diff) for each optimization within this benchmark execution: -

-Patch files for all optimizations in this benchmark -

-Also click to view patch result: -

-Content in the patch file -

\ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/dark-icon-menu-auto.svg b/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/dark-icon-menu-auto.svg deleted file mode 100644 index 1fb66bb73d9..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/dark-icon-menu-auto.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/dark-icon-menu-bf16.svg b/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/dark-icon-menu-bf16.svg deleted file mode 100644 index 1d9a47ca737..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/dark-icon-menu-bf16.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/dark-icon-menu-int8-dynamic.svg b/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/dark-icon-menu-int8-dynamic.svg deleted file mode 100644 index ad25a0b7bc6..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/dark-icon-menu-int8-dynamic.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/dark-icon-menu-int8-static.svg b/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/dark-icon-menu-int8-static.svg deleted file mode 100644 index 6b450f8546a..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/dark-icon-menu-int8-static.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/dark-icon-menu-title.svg b/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/dark-icon-menu-title.svg deleted file mode 100644 index 5842aa2398b..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/dark-icon-menu-title.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/dark_logo.png b/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/dark_logo.png deleted file mode 100644 index f8841abbb68..00000000000 Binary files a/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/dark_logo.png and /dev/null differ diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/left-bar-icon.svg b/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/left-bar-icon.svg deleted file mode 100644 index 2619b857b7b..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/left-bar-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/sideBarInput.svg b/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/sideBarInput.svg deleted file mode 100644 index 0c7ff57fdc1..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/images/dark/sideBarInput.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/light/dark-icon-menu-auto.svg b/neural_coder/extensions/neural_compressor_ext_vscode/images/light/dark-icon-menu-auto.svg deleted file mode 100644 index f77303e887f..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/images/light/dark-icon-menu-auto.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/light/light-icon-menu-bf16.svg b/neural_coder/extensions/neural_compressor_ext_vscode/images/light/light-icon-menu-bf16.svg deleted file mode 100644 index df6ec6617a2..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/images/light/light-icon-menu-bf16.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/light/light-icon-menu-int8-dynamic.svg b/neural_coder/extensions/neural_compressor_ext_vscode/images/light/light-icon-menu-int8-dynamic.svg deleted file mode 100644 index a4a276c6c41..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/images/light/light-icon-menu-int8-dynamic.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/light/light-icon-menu-int8-static.svg b/neural_coder/extensions/neural_compressor_ext_vscode/images/light/light-icon-menu-int8-static.svg deleted file mode 100644 index d87e0506521..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/images/light/light-icon-menu-int8-static.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/light/light-icon-menu-title.svg b/neural_coder/extensions/neural_compressor_ext_vscode/images/light/light-icon-menu-title.svg deleted file mode 100644 index 1a8a158316f..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/images/light/light-icon-menu-title.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/light/light_logo.png b/neural_coder/extensions/neural_compressor_ext_vscode/images/light/light_logo.png deleted file mode 100644 index e2a466c6d46..00000000000 Binary files a/neural_coder/extensions/neural_compressor_ext_vscode/images/light/light_logo.png and /dev/null differ diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/light/sideBarInput.svg b/neural_coder/extensions/neural_compressor_ext_vscode/images/light/sideBarInput.svg deleted file mode 100644 index b02fef18a8d..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/images/light/sideBarInput.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/logo_icon.png b/neural_coder/extensions/neural_compressor_ext_vscode/images/logo_icon.png deleted file mode 100644 index da2fabc7ca4..00000000000 Binary files a/neural_coder/extensions/neural_compressor_ext_vscode/images/logo_icon.png and /dev/null differ diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/CONFIG.gif b/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/CONFIG.gif deleted file mode 100644 index 400146a2bc8..00000000000 Binary files a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/CONFIG.gif and /dev/null differ diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/USAGE.gif b/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/USAGE.gif deleted file mode 100644 index 27d46670e80..00000000000 Binary files a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/USAGE.gif and /dev/null differ diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/auto.png b/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/auto.png deleted file mode 100644 index 0c782f68dca..00000000000 Binary files a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/auto.png and /dev/null differ diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/autoEnabling.png b/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/autoEnabling.png deleted file mode 100644 index 81608cf6272..00000000000 Binary files a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/autoEnabling.png and /dev/null differ diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/clickAuto.png b/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/clickAuto.png deleted file mode 100644 index 705db6d4371..00000000000 Binary files a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/clickAuto.png and /dev/null differ diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/clickEnable.png b/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/clickEnable.png deleted file mode 100644 index 6315a68837d..00000000000 Binary files a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/clickEnable.png and /dev/null differ diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/clickSetting.png b/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/clickSetting.png deleted file mode 100644 index 199173dc7f9..00000000000 Binary files a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/clickSetting.png and /dev/null differ diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/connectSSH.png b/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/connectSSH.png deleted file mode 100644 index eba75e9fc10..00000000000 Binary files a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/connectSSH.png and /dev/null differ diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/content.png b/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/content.png deleted file mode 100644 index d40ce896e59..00000000000 Binary files a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/content.png and /dev/null differ diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/enableHistory.png b/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/enableHistory.png deleted file mode 100644 index ebaf0230252..00000000000 Binary files a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/enableHistory.png and /dev/null differ diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/historyDetail.png b/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/historyDetail.png deleted file mode 100644 index 4d7d8223066..00000000000 Binary files a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/historyDetail.png and /dev/null differ diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/install.png b/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/install.png deleted file mode 100644 index 6cfd1c64499..00000000000 Binary files a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/install.png and /dev/null differ diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/leftIcon.png b/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/leftIcon.png deleted file mode 100644 index 71c46d03992..00000000000 Binary files a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/leftIcon.png and /dev/null differ diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/logo.png b/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/logo.png deleted file mode 100644 index 7d8ec7c4620..00000000000 Binary files a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/logo.png and /dev/null differ diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/outPut.png b/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/outPut.png deleted file mode 100644 index 31c007c4acf..00000000000 Binary files a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/outPut.png and /dev/null differ diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/params.png b/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/params.png deleted file mode 100644 index 6ecd9545ec9..00000000000 Binary files a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/params.png and /dev/null differ diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/search.png b/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/search.png deleted file mode 100644 index d6ce6796101..00000000000 Binary files a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/search.png and /dev/null differ diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/settingPath.png b/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/settingPath.png deleted file mode 100644 index e73ba35d258..00000000000 Binary files a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/settingPath.png and /dev/null differ diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/topRight.png b/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/topRight.png deleted file mode 100644 index fe5f592fd24..00000000000 Binary files a/neural_coder/extensions/neural_compressor_ext_vscode/images/readme/topRight.png and /dev/null differ diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/package.json b/neural_coder/extensions/neural_compressor_ext_vscode/package.json deleted file mode 100644 index 0cf75aaf91b..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/package.json +++ /dev/null @@ -1,185 +0,0 @@ -{ - "name": "neural-coder-ext-vscode", - "displayName": "Neural Coder", - "description": "Enable and benchmark quantization on Deep Learning models in one-click", - "publisher": "IntelNeuralCompressor", - "version": "0.0.8", - "engines": { - "vscode": "^1.70.0" - }, - "categories": [ - "Other" - ], - "icon": "images/logo_icon.png", - "activationEvents": [ - "onCommand:neuralCoder.incEnableINT8Static", - "onCommand:neuralCoder.incEnableINT8Dynamic", - "onCommand:neuralCoder.incEnableBF16", - "onCommand:neuralCoder.incAutoEnableBenchmark", - "onCommand:neuralCoder.sideBarAutoAddParams", - "onView:Enable_Log_File", - "onView:Auto_Log_File" - ], - "main": "./dist/extension.js", - "contributes": { - "configuration": { - "title": "Intel Neural Coder Configuration", - "properties": { - "neuralCoder.pythonPath": { - "type": "string", - "default": "", - "description": "Python Path for Neural Coder" - } - } - }, - "commands": [ - { - "command": "neuralCoder.incEnableINT8Static", - "title": "INC Enable INT8 (Static)", - "icon": { - "dark": "./images/dark/dark-icon-menu-int8-static.svg", - "light": "./images/light/light-icon-menu-int8-static.svg" - } - }, - { - "command": "neuralCoder.incEnableINT8Dynamic", - "title": "INC Enable INT8 (Dynamic)", - "icon": { - "dark": "./images/dark/dark-icon-menu-int8-dynamic.svg", - "light": "./images/light/light-icon-menu-int8-dynamic.svg" - } - }, - { - "command": "neuralCoder.incEnableBF16", - "title": "INC Enable BF16", - "icon": { - "dark": "./images/dark/dark-icon-menu-bf16.svg", - "light": "./images/light/light-icon-menu-bf16.svg" - } - }, - { - "command": "neuralCoder.incAutoEnableBenchmark", - "title": "INC Auto Enable Benchmark", - "icon": { - "dark": "./images/dark/dark-icon-menu-auto.svg", - "light": "./images/light/light-icon-menu-auto.svg" - } - } - ], - "menus": { - "neuralCoder/editor/title": [ - { - "command": "neuralCoder.incEnableINT8Static", - "when": "resourceLangId == python", - "group": "1_nc@1" - }, - { - "command": "neuralCoder.incEnableINT8Dynamic", - "when": "resourceLangId == python", - "group": "1_nc@2" - }, - { - "command": "neuralCoder.incEnableBF16", - "when": "resourceLangId == python", - "group": "1_nc@3" - }, - { - "command": "neuralCoder.incAutoEnableBenchmark", - "when": "resourceLangId == python", - "group": "1_nc@4" - } - ], - "editor/title": [ - { - "submenu": "neuralCoder/editor/title", - "when": "resourceLangId == python", - "group": "navigation" - }, - { - "command": "neuralCoder.incEnableINT8Static", - "when": "resourceLangId == python", - "group": "1_nc@1" - }, - { - "command": "neuralCoder.incEnableINT8Dynamic", - "when": "resourceLangId == python", - "group": "1_nc@2" - }, - { - "command": "neuralCoder.incEnableBF16", - "when": "resourceLangId == python", - "group": "1_nc@3" - }, - { - "command": "neuralCoder.incAutoEnableBenchmark", - "when": " resourceLangId == python", - "group": "1_nc@4" - } - ] - }, - "submenus": [ - { - "id": "neuralCoder/editor/title", - "label": "Neural Coder", - "icon": { - "dark": "./images/dark/dark_logo.png", - "light": "./images/light/light_logo.svg" - } - } - ], - "viewsContainers": { - "activitybar": [ - { - "id": "NeuralCoder_INFO", - "title": "Neural Coder", - "icon": "images/dark/dark_logo.png" - } - ] - }, - "views": { - "NeuralCoder_INFO": [ - { - "id": "Enable_Log_File", - "name": "ENABLE" - }, - { - "id": "Auto_Log_File", - "name": "AUTO" - } - ] - } - }, - "scripts": { - "vscode:prepublish": "npm run package", - "compile": "webpack", - "watch": "webpack --watch", - "package": "webpack --mode production --devtool hidden-source-map", - "compile-tests": "tsc -p . --outDir out", - "watch-tests": "tsc -p . -w --outDir out", - "pretest": "npm run compile-tests && npm run compile && npm run lint", - "lint": "eslint src --ext ts", - "test": "node ./out/test/runTest.js" - }, - "devDependencies": { - "@types/fs-extra": "^9.0.13", - "@types/glob": "^8.0.0", - "@types/mocha": "^10.0.0", - "@types/node": "16.x", - "@types/vscode": "^1.70.0", - "@typescript-eslint/eslint-plugin": "^5.38.1", - "@typescript-eslint/parser": "^5.38.1", - "@vscode/test-electron": "^2.1.5", - "eslint": "^8.24.0", - "glob": "^8.0.3", - "mocha": "^10.0.0", - "ts-loader": "^9.4.1", - "typescript": "^4.8.4", - "webpack": "^5.76.0", - "webpack-cli": "^4.10.0" - }, - "dependencies": { - "fs-extra": "^10.1.0", - "python-shell": "^3.0.1", - "rxjs": "^7.5.7" - } -} diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/src/NcProcessScript.py b/neural_coder/extensions/neural_compressor_ext_vscode/src/NcProcessScript.py deleted file mode 100644 index 983767d7928..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/src/NcProcessScript.py +++ /dev/null @@ -1,47 +0,0 @@ -import os -import sys -import subprocess -libs = ['neural-compressor'] - -try: - from neural_coder import enable - from neural_coder import auto_quant - -except ModuleNotFoundError: - for lib in libs: - os.system(f'{sys.argv[6]} -m pip install -U {lib}') - from neural_coder import enable - from neural_coder import auto_quant - -if (sys.argv[4] == "normal"): - enable(code=sys.argv[1], features=[sys.argv[2]], overwrite=True) - logResult = enable(code=sys.argv[1], features=[ - sys.argv[2]], save_patch_path=sys.argv[5]) - -elif (sys.argv[4] == "genLog"): - if (sys.argv[2] == ""): - # codeResult have 3 params: perfomance, mode, path - codeResult = enable( - code=sys.argv[1], features=[], run_bench=True, args=sys.argv[3]) - - else: - codeResult = enable(code=sys.argv[1], features=[ - sys.argv[2]], run_bench=True, args=sys.argv[3]) - logResult = enable(code=sys.argv[1], features=[ - sys.argv[2]], args=sys.argv[3], save_patch_path=sys.argv[5]) - - # print fps - with open(codeResult[2] + '/bench.log', 'r') as f: - logs = f.readlines() - for log in logs: - if (log.find('fps') != -1): - log_line = log - fps = log_line.split("[")[1].split("]")[0] - print(fps) - -elif (sys.argv[4] == "hardWare"): - subp = subprocess.Popen("lscpu | grep 'Model name'", shell=True, - stdout=subprocess.PIPE, stderr=subprocess.PIPE, encoding="utf-8") - subp.wait(2) - hardware = subp.communicate()[0].replace("Model name:", "").strip() - print(hardware) diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/src/extension.ts b/neural_coder/extensions/neural_compressor_ext_vscode/src/extension.ts deleted file mode 100644 index 752cc274a5a..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/src/extension.ts +++ /dev/null @@ -1,183 +0,0 @@ -import * as vscode from "vscode"; -import { NeuralCodeOptimizer } from "./neuralcoder"; -import * as DirPath from "path"; - -// highLight -async function highLight () { - const editor = vscode.window.activeTextEditor; - if (!editor) { - return; - } - const document = editor.document; - - const text = document.getText(); - const regStart = /# \[NeuralCoder\] .*? \[Beginning Line\]/g; - const regEnd = /# \[NeuralCoder\] .*? \[Ending Line\]/g; - const startMatch = regStart.exec(text); - const endMatch = regEnd.exec(text); - if(startMatch && endMatch) { - const startLine = document.positionAt(startMatch.index); - const endLine = document.positionAt(endMatch.index); - const start = document.lineAt(startLine).range.start.character; - const end = document.lineAt(endLine).range.end.character; - const range: vscode.Range = new vscode.Range(Number(startLine), start, Number(endLine), end); - // highLight - let path = vscode.window.activeTextEditor?.document.fileName; - if (path) { - let filePath = DirPath.resolve(`${__dirname}`, "../", path); - // vscode.workspace.openTextDocument(filePath).then(async (document) => { - // await vscode.window.showTextDocument(document , {preserveFocus: false, selection: range, viewColumn: vscode.ViewColumn.One}); - // }); - } - } -} - -export async function activate(context: vscode.ExtensionContext) { - // init - const pythonPath = "neuralCoder.pythonPath"; - let config: vscode.WorkspaceConfiguration = - vscode.workspace.getConfiguration(); - let currentCondaName = config.get(pythonPath); - - if (!currentCondaName) { - vscode.window.showErrorMessage("Please input python Path!"); - return; - } - // conda Env - context.subscriptions.push( - vscode.workspace.onDidChangeConfiguration(() => { - const currentCondaName = vscode.workspace.getConfiguration().get(pythonPath); - if (!currentCondaName) { - vscode.window.showErrorMessage("Please input python Path!"); - return; - } - }) - ); - - // start - let path = vscode.window.activeTextEditor?.document.fileName; - let userInput: string = ""; - let ncCoder = new NeuralCodeOptimizer(); - let curPythonPath = currentCondaName; - - let incEnableINT8Static = vscode.commands.registerCommand( - "neuralCoder.incEnableINT8Static", - () => { - vscode.window.withProgress( - { - cancellable: false, - location: vscode.ProgressLocation.Notification, - title: "Running INT8 Static!", - }, - async () => { - ncCoder.optimizeCodes( - curPythonPath, - "pytorch_inc_static_quant_fx", - path, - "" - ); - } - ); - } - ); - let incEnableINT8Dynamic = vscode.commands.registerCommand( - "neuralCoder.incEnableINT8Dynamic", - () => { - vscode.window.withProgress( - { - cancellable: false, - location: vscode.ProgressLocation.Notification, - title: "Running INT8 Dynamic!", - }, - async () => { - ncCoder.optimizeCodes( - curPythonPath, - "pytorch_inc_dynamic_quant", - path, - "" - ); - } - ); - } - ); - let incEnableBF16 = vscode.commands.registerCommand( - "neuralCoder.incEnableBF16", - () => { - vscode.window.withProgress( - { - cancellable: false, - location: vscode.ProgressLocation.Notification, - title: "Running BF16!", - }, - async () => { - ncCoder.optimizeCodes(curPythonPath, "pytorch_inc_bf16", path, ""); - } - ); - } - ); - - let incAutoEnableBenchmark = vscode.commands.registerCommand( - "neuralCoder.incAutoEnableBenchmark", - () => { - vscode.window.withProgress( - { - cancellable: false, - location: vscode.ProgressLocation.Notification, - title: "Running AutoEnableBenchmark!", - }, - async () => { - vscode.window - .showInputBox({ - password: false, // need password? - ignoreFocusOut: true, // when focus other thing - placeHolder: "INPUT EXECUTE PARAMETERS OR NOT: ", // hint - }) - .then((value) => { - if (typeof value !== "undefined") { - userInput = value ? value : ""; - const opc = - vscode.window.createOutputChannel("Neural Coder Auto-Bench"); - ncCoder.optimizeCodes( - curPythonPath, - "auto-quant", - path, - userInput, - opc - ); - } - }); - } - ); - } - ); - - context.subscriptions.push(incEnableINT8Static); - context.subscriptions.push(incEnableINT8Dynamic); - context.subscriptions.push(incEnableBF16); - context.subscriptions.push(incAutoEnableBenchmark); - context.subscriptions.push(vscode.workspace.onDidChangeTextDocument((e: vscode.TextDocumentChangeEvent) => { - highLight(); -})); - - //register command MyTreeItem.itemClick - context.subscriptions.push( - vscode.commands.registerCommand( - "MyTreeItem.itemClick", - (label, filePath) => { - //display content - vscode.workspace.openTextDocument(filePath) - .then(doc => { - vscode.window.showTextDocument(doc); - }, err => { - console.log(`Open ${filePath} error, ${err}.`); - }).then(undefined, err => { - console.log(`Open ${filePath} error, ${err}.`); - }); - } - ) - ); -} - -// this method is called when your extension is deactivated -export function deactivate() {} - diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/src/neuralcoder.ts b/neural_coder/extensions/neural_compressor_ext_vscode/src/neuralcoder.ts deleted file mode 100644 index 402ca9d9036..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/src/neuralcoder.ts +++ /dev/null @@ -1,402 +0,0 @@ -import { PythonShell } from "python-shell"; -import { MyTreeData } from "./sideBar"; -import * as vscode from "vscode"; -import * as DirPath from "path"; -import * as fs from "fs-extra"; - -class CodeOptimizer { - protected working: boolean; - protected pathExist: boolean; - public outPutLogPath: string; - public outPutLogFilePath: string; - public autoSaveLogPath: string; - public enableSaveLogPath: string; - public autoSaveFinalLogPath: string; - public enableSaveFinalLogPath: string; - public fpsList: number[]; - public treeProvider: string; - public curCondaName?: string; - public curPyPath: string; - public outPutStr: string[]; - - constructor() { - this.working = false; - this.pathExist = false; - this.autoSaveLogPath = "../neural_coder_workspace/Auto/"; - this.enableSaveLogPath = "../neural_coder_workspace/Enable/"; - this.outPutLogPath = "../neural_coder_workspace/outPutLog/"; - this.autoSaveFinalLogPath = ""; - this.enableSaveFinalLogPath = ""; - this.outPutLogFilePath = ""; - - this.fpsList = []; - this.outPutStr = []; - - this.treeProvider = ""; - this.curCondaName = vscode.workspace - .getConfiguration() - .get("neuralCoder.condaName"); - this.curPyPath = ""; - } - - public registerTreeDataProvider(treeName: string, logPath: string) { - vscode.window.registerTreeDataProvider( - treeName, - new MyTreeData(DirPath.resolve(logPath, "../")) - ); - } - - // output content - public outPutFunc( - outPut: vscode.OutputChannel, - outPutStr: string[], - content: string[] - ) { - content.forEach((val) => { - outPut.appendLine(val); - outPutStr.push(val); - }); - } - - // save log in a file - public saveLogFile( - outDir: string, - logContent: string, - ) { - let nowTime = new Date(Date.parse(new Date().toString())); - let nowTimeStr = - nowTime.getFullYear() + - "_" + - (nowTime.getMonth() > 8 ? (nowTime.getMonth() + 1) : ('0' + (nowTime.getMonth() + 1))) + - "_" + - (nowTime.getDate() > 9 ? nowTime.getDate() : ('0' + nowTime.getDate())) + - "_" + - (nowTime.getHours() > 9 ? nowTime.getHours() : ('0' + nowTime.getHours())) + - "_" + - (nowTime.getMinutes() > 9 ? nowTime.getMinutes() : ('0' + nowTime.getMinutes())) + - "_" + - (nowTime.getSeconds() > 9 ? nowTime.getSeconds() : ('0' + nowTime.getSeconds())); - - let finalPath = DirPath.resolve(`${__dirname}`, outDir + nowTimeStr); - - if (logContent === "Auto") { - this.autoSaveFinalLogPath = finalPath; - } else if (logContent === "Enable") { - this.enableSaveFinalLogPath = finalPath; - } else if (logContent === "output") { - this.outPutLogFilePath = finalPath; - } - // mkdir file - let isOutExist: boolean = fs.pathExistsSync(finalPath); - if (!isOutExist) { - fs.mkdirsSync(finalPath); - } - } - - // pythonShell Script - async ncPyScript( - dirPath: string, - currentFilePath: string, - feature: string, - currentFileArgs: string, - status: string, - currentPythonPath: string, - saveLogPath: string - ) { - return new Promise((resolve, reject) => { - PythonShell.run( - "NcProcessScript.py", - { - mode: "text", - pythonOptions: ["-u"], - scriptPath: dirPath, - pythonPath: currentPythonPath, - args: [ - currentFilePath, - feature, - currentFileArgs, - status, - saveLogPath + "/" + feature, - currentPythonPath - ], - }, - (err, result) => { - this.pathExist = true; - if (err) { - // vscode.window.showErrorMessage("Please install correct package!"); - this.working = false; - } - resolve(result); - } - ); - }); - } - - // neural coder params - async ncProcess( - ncPath: string | undefined, - feature: string, - ncArgs: string | undefined, - status: string, - currentPythonPath: string, - saveLogPath: string - ) { - let pythonRes: any; - // find currentFile path - const dirPath = DirPath.resolve(`${__dirname}`, "../src"); - // find running file path - let currentFilePath = ncPath ? ncPath : ""; - let currentFileArgs = ncArgs ? ncArgs : ""; - - // try { - // asyn -> sync - pythonRes = await this.ncPyScript( - dirPath, - currentFilePath, - feature, - currentFileArgs, - status, - currentPythonPath, - saveLogPath - ); - - if (!this.pathExist) { - vscode.window.showErrorMessage("Please input correct python Path!"); - this.working = false; - } - return pythonRes; - } - - async optimizeCode( - feature: string, - name: string, - next: string, - opt: string | undefined, - args: string | undefined, - ncPath: string | undefined, - currentPythonPath: string, - opc?: vscode.OutputChannel - ) { - if (opt === "normal") { - await this.ncProcess( - ncPath, - feature, - args, - "normal", - currentPythonPath, - this.enableSaveFinalLogPath - ); - this.registerTreeDataProvider( - "Enable_Log_File", - this.enableSaveFinalLogPath - ); - } else { - if (opc) { - if (feature === "") { - this.outPutFunc(opc, this.outPutStr, [ - `[NeuralCoder INFO] Enabling and Benchmarking for The Original Model ......`, - ]); - - // Get the fps - const resFps = await this.ncProcess( - ncPath, - "", - args, - "genLog", - currentPythonPath, - this.autoSaveFinalLogPath - ); - const currentFps = resFps.pop(); - - this.fpsList.push(parseFloat(currentFps)); - - this.outPutFunc(opc, this.outPutStr, [ - `[NeuralCoder INFO] Benchmark Result (Performance) of The Original Model is ${currentFps} (samples/second)`, - `[NeuralCoder INFO] Enabling and Benchmarking for The Original Model ......`, - `[NeuralCoder INFO] Enabling and Benchmarking for ${next} ......`, - ]); - } else { - const resFps = await this.ncProcess( - ncPath, - feature, - args, - "genLog", - currentPythonPath, - this.autoSaveFinalLogPath - ); - const currentFps = resFps.pop(); - this.fpsList.push(parseFloat(currentFps)); - this.outPutFunc(opc, this.outPutStr, [ - `[NeuralCoder INFO] Benchmark Result (Performance) of ${name} is ${currentFps} (samples/second)`, - ]); - if (next !== "") { - this.outPutFunc(opc, this.outPutStr, [ - `[NeuralCoder INFO] Enabling and Benchmarking for ${next} ......`, - ]); - } - if (feature === "pytorch_inc_bf16") { - let features = [ - "", - "pytorch_inc_static_quant_fx", - "pytorch_inc_dynamic_quant", - "pytorch_inc_bf16", - ]; - let featureName = [ - "Original Model", - "INC Enable INT8 (Static)", - "INC Enable INT8 (Dynamic)", - "INC Enable BF16", - ]; - - let bestFps = Math.max(...this.fpsList); - let bestIndex = this.fpsList.indexOf(bestFps); - let bestFeature = features[bestIndex]; - let bestFeatureName = featureName[bestIndex]; - let boost = (bestFps / this.fpsList[0]).toFixed(2); - - // Best result - await this.ncProcess( - ncPath, - bestFeature, - args, - "normal", - currentPythonPath, - this.autoSaveFinalLogPath - ); - this.outPutFunc(opc, this.outPutStr, [ - `[NeuralCoder INFO] The Best Intel Optimization: ${bestFeatureName}.`, - `[NeuralCoder INFO] You can get up to ${boost}X performance boost.`, - ]); - - const resHardWare = await this.ncProcess( - ncPath, - bestFeature, - args, - "hardWare", - currentPythonPath, - this.autoSaveFinalLogPath - ); - - // log File - let logContent = [...this.outPutStr]; - this.saveLogFile(this.outPutLogPath, 'output'); - - // save log file - let outPutFinalPath = this.outPutLogFilePath + "/outPut.log"; - fs.writeFile(outPutFinalPath, logContent.join("\n")); - - this.outPutFunc(opc, this.outPutStr, [ - `[NeuralCoder INFO] HardWare: ${resHardWare}.`, - `[NeuralCoder INFO] The log was saved to:`, - `[NeuralCoder INFO] ${outPutFinalPath}`, - ]); - // TreeData - this.registerTreeDataProvider( - "Auto_Log_File", - this.autoSaveFinalLogPath - ); - } - } - } - } - } -} - -export class NeuralCodeOptimizer extends CodeOptimizer { - constructor() { - super(); - } - - public async optimizeCodes( - currentPythonPath: string, - feature?: string, - path?: string, - args?: string, - opc?: vscode.OutputChannel - ) { - if (this.working) { - vscode.window.showInformationMessage("Not done yet"); - return; - } - - this.working = true; - const optimizeType = - feature !== undefined ? feature : "pytorch_mixed_precision_cpu"; - if (feature === "auto-quant") { - // outPut init - if (opc) { - opc.clear(); - opc.show(); - - this.outPutFunc(opc, this.outPutStr, [ - "[NeuralCoder INFO] Auto-Quant Started ......", - ]); - - // mkdir autoSaveLogs - this.saveLogFile(this.autoSaveLogPath, "Auto"); - - this.fpsList = []; - let pathFinal = path ? path : ""; - const currentFileName = pathFinal.split(/[\\\/]/).pop(); - - this.outPutFunc(opc, this.outPutStr, [ - `[NeuralCoder INFO] Code: User code from VS Code "${currentFileName}"`, - `[NeuralCoder INFO] Benchmark Mode: Throughput`, - ]); - - await this.optimizeCode( - "", //current feature - "The Original Model", //current feature name - "INC Enable INT8 (Static)", //next feature name - "auto", //normal or auto - args, //parameters - path, - currentPythonPath, - opc - ); - await this.optimizeCode( - "pytorch_inc_static_quant_fx", - "INC Enable INT8 (Static)", - "INC Enable INT8 (Dynamic)", - "auto", - args, - path, - currentPythonPath, - opc - ); - await this.optimizeCode( - "pytorch_inc_dynamic_quant", - "INC Enable INT8 (Dynamic)", - "INC Enable BF16", - "auto", - args, - path, - currentPythonPath, - opc - ); - await this.optimizeCode( - "pytorch_inc_bf16", - "INC Enable BF16", - "", - "auto", - args, - path, - currentPythonPath, - opc - ); - } - } else { - this.saveLogFile(this.enableSaveLogPath, "Enable"); - await this.optimizeCode( - optimizeType, - "", - "", - "normal", - args, - path, - currentPythonPath - ); - } - this.working = false; - } -} diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/src/sideBar.ts b/neural_coder/extensions/neural_compressor_ext_vscode/src/sideBar.ts deleted file mode 100644 index fd2a344e25c..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/src/sideBar.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { TreeDataProvider, TreeItem, TreeItemCollapsibleState, ProviderResult, window } from "vscode"; -import * as fs from "fs"; -import * as path from "path"; - -export class MyTreeData implements TreeDataProvider{ - constructor(private rootPath: string){ - } - - getTreeItem(element: MyTreeItem) : MyTreeItem | Thenable { - return element; - } - - getChildren(element?: MyTreeItem | undefined): ProviderResult{ - if(!this.rootPath){ - window.showInformationMessage('No file in empty directory'); - return Promise.resolve([]); - } - if(element === undefined){ - return Promise.resolve(this.searchFiles(this.rootPath)); - } - else{ - return Promise.resolve(this.searchFiles(path.join(element.parentPath, element.label))); - } - } - //search file - private searchFiles(parentPath: string): MyTreeItem[] { - var treeDir: MyTreeItem[] = []; - if(this.pathExists(parentPath)){ - var fsReadDir = fs.readdirSync(parentPath, 'utf-8'); - fsReadDir.forEach(fileName => { - var filePath = path.join(parentPath, fileName);//absolute Path - if(fs.statSync(filePath).isDirectory()){//Directory - treeDir.push(new MyTreeItem(fileName, parentPath, TreeItemCollapsibleState.Collapsed)); - } - else{//file - treeDir.push(new MyTreeItem(fileName, parentPath, TreeItemCollapsibleState.None)); - } - }); - } - return treeDir; - } - //pathExists - private pathExists(filePath: string): boolean{ - try{ - fs.accessSync(filePath); - } - catch(err){ - return false; - } - return true; - } -} - -export class MyTreeItem extends TreeItem{ - constructor( - public readonly label: string, //save current label - public readonly parentPath: string, //save current label Path - public readonly collapsibleState: TreeItemCollapsibleState - ){ - super(label, collapsibleState); - } - //click method - command = { - title: "this.label", - command: 'MyTreeItem.itemClick', - arguments: [ //params - this.label, - path.join(this.parentPath, this.label) - ] - }; - contextValue = 'MyTreeItem';//provide for when -} diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/tsconfig.json b/neural_coder/extensions/neural_compressor_ext_vscode/tsconfig.json deleted file mode 100644 index 965a7b4c23b..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "target": "ES2020", - "lib": [ - "ES2020" - ], - "sourceMap": true, - "rootDir": "src", - "strict": true /* enable all strict type-checking options */ - /* Additional Checks */ - // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ - // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ - // "noUnusedParameters": true, /* Report errors on unused parameters. */ - } -} diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/vsc-extension-quickstart.md b/neural_coder/extensions/neural_compressor_ext_vscode/vsc-extension-quickstart.md deleted file mode 100644 index b2eb4a435ce..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/vsc-extension-quickstart.md +++ /dev/null @@ -1,47 +0,0 @@ -# Welcome to your VS Code Extension - -## What's in the folder - -* This folder contains all of the files necessary for your extension. -* `package.json` - this is the manifest file in which you declare your extension and command. - * The sample plugin registers a command and defines its title and command name. With this information VS Code can show the command in the command palette. It doesn’t yet need to load the plugin. -* `src/extension.ts` - this is the main file where you will provide the implementation of your command. - * The file exports one function, `activate`, which is called the very first time your extension is activated (in this case by executing the command). Inside the `activate` function we call `registerCommand`. - * We pass the function containing the implementation of the command as the second parameter to `registerCommand`. - -## Setup - -* install the recommended extensions (amodio.tsl-problem-matcher and dbaeumer.vscode-eslint) - - -## Get up and running straight away - -* Press `F5` to open a new window with your extension loaded. -* Run your command from the command palette by pressing (`Ctrl+Shift+P` or `Cmd+Shift+P` on Mac) and typing `Hello World`. -* Set breakpoints in your code inside `src/extension.ts` to debug your extension. -* Find output from your extension in the debug console. - -## Make changes - -* You can relaunch the extension from the debug toolbar after changing code in `src/extension.ts`. -* You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes. - - -## Explore the API - -* You can open the full set of our API when you open the file `node_modules/@types/vscode/index.d.ts`. - -## Run tests - -* Open the debug viewlet (`Ctrl+Shift+D` or `Cmd+Shift+D` on Mac) and from the launch configuration dropdown pick `Extension Tests`. -* Press `F5` to run the tests in a new window with your extension loaded. -* See the output of the test result in the debug console. -* Make changes to `src/test/suite/extension.test.ts` or create new test files inside the `test/suite` folder. - * The provided test runner will only consider files matching the name pattern `**.test.ts`. - * You can create folders inside the `test` folder to structure your tests any way you want. - -## Go further - -* Reduce the extension size and improve the startup time by [bundling your extension](https://code.visualstudio.com/api/working-with-extensions/bundling-extension). -* [Publish your extension](https://code.visualstudio.com/api/working-with-extensions/publishing-extension) on the VS Code extension marketplace. -* Automate builds by setting up [Continuous Integration](https://code.visualstudio.com/api/working-with-extensions/continuous-integration). diff --git a/neural_coder/extensions/neural_compressor_ext_vscode/webpack.config.js b/neural_coder/extensions/neural_compressor_ext_vscode/webpack.config.js deleted file mode 100644 index 37d7024f924..00000000000 --- a/neural_coder/extensions/neural_compressor_ext_vscode/webpack.config.js +++ /dev/null @@ -1,48 +0,0 @@ -//@ts-check - -'use strict'; - -const path = require('path'); - -//@ts-check -/** @typedef {import('webpack').Configuration} WebpackConfig **/ - -/** @type WebpackConfig */ -const extensionConfig = { - target: 'node', // VS Code extensions run in a Node.js-context 📖 -> https://webpack.js.org/configuration/node/ - mode: 'none', // this leaves the source code as close as possible to the original (when packaging we set this to 'production') - - entry: './src/extension.ts', // the entry point of this extension, 📖 -> https://webpack.js.org/configuration/entry-context/ - output: { - // the bundle is stored in the 'dist' folder (check package.json), 📖 -> https://webpack.js.org/configuration/output/ - path: path.resolve(__dirname, 'dist'), - filename: 'extension.js', - libraryTarget: 'commonjs2' - }, - externals: { - vscode: 'commonjs vscode' // the vscode-module is created on-the-fly and must be excluded. Add other modules that cannot be webpack'ed, 📖 -> https://webpack.js.org/configuration/externals/ - // modules added here also need to be added in the .vscodeignore file - }, - resolve: { - // support reading TypeScript and JavaScript files, 📖 -> https://github.com/TypeStrong/ts-loader - extensions: ['.ts', '.js'] - }, - module: { - rules: [ - { - test: /\.ts$/, - exclude: /node_modules/, - use: [ - { - loader: 'ts-loader' - } - ] - } - ] - }, - devtool: 'nosources-source-map', - infrastructureLogging: { - level: "log", // enables logging required for problem matchers - }, -}; -module.exports = [ extensionConfig ]; \ No newline at end of file diff --git a/neural_coder/extensions/screenshots/1.png b/neural_coder/extensions/screenshots/1.png deleted file mode 100644 index 4b4d18b6eff..00000000000 Binary files a/neural_coder/extensions/screenshots/1.png and /dev/null differ diff --git a/neural_coder/extensions/screenshots/2.png b/neural_coder/extensions/screenshots/2.png deleted file mode 100644 index 0dfe452976c..00000000000 Binary files a/neural_coder/extensions/screenshots/2.png and /dev/null differ diff --git a/neural_coder/extensions/screenshots/3.png b/neural_coder/extensions/screenshots/3.png deleted file mode 100644 index 1afd35a5e09..00000000000 Binary files a/neural_coder/extensions/screenshots/3.png and /dev/null differ diff --git a/neural_coder/extensions/screenshots/4.png b/neural_coder/extensions/screenshots/4.png deleted file mode 100644 index ad0fbec71e7..00000000000 Binary files a/neural_coder/extensions/screenshots/4.png and /dev/null differ diff --git a/neural_coder/extensions/screenshots/5.png b/neural_coder/extensions/screenshots/5.png deleted file mode 100644 index 3c97a3b691e..00000000000 Binary files a/neural_coder/extensions/screenshots/5.png and /dev/null differ diff --git a/neural_coder/extensions/screenshots/extmanager.png b/neural_coder/extensions/screenshots/extmanager.png deleted file mode 100644 index b77e904240f..00000000000 Binary files a/neural_coder/extensions/screenshots/extmanager.png and /dev/null differ diff --git a/neural_coder/globals.py b/neural_coder/globals.py deleted file mode 100644 index 4603e5bc46b..00000000000 --- a/neural_coder/globals.py +++ /dev/null @@ -1,117 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import logging - -# whethre to consider all import modules and perform transformation based on all codes plus all import modules -consider_imports = True - -# target batch size for feature of changing PyTorch batch size -target_batch_size = 1 - -# mark for successful batch size change -batch_size_changed = False - -# number of benchmark iteration for feature of PyTorch benchmark -num_benchmark_iteration = 30 - -# print info for debugging purpose -logging_level = logging.INFO - -# print code line info for debug use -print_code_line_info = False - -# load transformers class def by a cache file instead of on-the-fly catch -cache_load_transformers = True - -# detected device -device = "cpu_with_amx" - -# device compatibility of the code: e.g. ["cpu", "cuda"], ["cuda"] -list_code_device_compatibility = ["cuda"] - -# quantization config for HuggingFace optimum-intel optimizations -# it is either "" (None) or "xxx" (a string of config path) -optimum_quant_config = "" - -# code domain -code_domain = "" - -# modular design -use_modular = True -modular_item = "" # str - - -def reset_globals(): - global list_code_path - - global list_code_line_instance - - global list_class_def_instance - global list_class_name - global list_parent_class_name - - global list_model_def_instance - global list_model_name - - global list_trans_insert_modified_file - global list_trans_insert_location_idxs - global list_trans_insert_number_insert_lines - global list_trans_insert_lines_to_insert - - global list_trans_indent_modified_file - global list_trans_indent_location_idxs - global list_trans_indent_level - - global list_all_function_name - global list_all_function_return_item - - global list_wrapper_base_function_name - global list_wrapper_children_function_name - global list_wrapper_all_function_name - - global list_calib_dataloader_name - global list_eval_func_lines - global list_eval_func_name - - list_code_path = [] - list_code_line_instance = [] # list of CodeLine instances - - list_class_def_instance = [] # list of ClassDefinition instances - list_class_name = [] # list of class names - list_parent_class_name = [] - - list_model_def_instance = [] - list_model_name = [] - - # for code transformation recording - list_trans_insert_modified_file = [] - list_trans_insert_location_idxs = [] - list_trans_insert_number_insert_lines = [] - list_trans_insert_lines_to_insert = [] - - list_trans_indent_modified_file = [] - list_trans_indent_location_idxs = [] - list_trans_indent_level = [] - - list_all_function_name = [] - list_all_function_return_item = [] - - list_wrapper_base_function_name = [] - list_wrapper_children_function_name = [] - list_wrapper_all_function_name = [] - - list_calib_dataloader_name = [] - list_eval_func_lines = [] - list_eval_func_name = [] diff --git a/neural_coder/graphers/__init__.py b/neural_coder/graphers/__init__.py deleted file mode 100644 index e833188cc78..00000000000 --- a/neural_coder/graphers/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/neural_coder/graphers/code_line.py b/neural_coder/graphers/code_line.py deleted file mode 100644 index 128482f9735..00000000000 --- a/neural_coder/graphers/code_line.py +++ /dev/null @@ -1,278 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import pprint -from typing import List - -from .. import globals -from ..utils.line_operation import ( - get_line_indent_level, - multi_line_comment_detection, - single_line_comment_or_empty_line_detection, -) - - -class CodeLine: - def __init__(self): - self.file_path = None - self.line_idx = None - self.line_content = None - self.indent_level = None - self.is_multi_line_comment = None - self.is_single_line_comment_or_empty = None - self.is_class_def_line = None - self.is_in_class = None - self.class_name = None - self.parent_class_name = None - self.class_def_line_idx = None - self.class_end_line_idx = None - self.is_func_def_line = None - self.is_in_func = None - self.func_name = None - self.func_return_idx = None - self.return_item = None - self.func_def_line_idx = None - self.func_end_line_idx = None - - def print_info(self): - pp = pprint.PrettyPrinter() - pp.pprint(self.__dict__) - - -def register_code_line(): - if globals.print_code_line_info: - print( - "{:<100} {:<10} {:<20} {:<20} {:<20} {:<40} {:<20} \ - {:<20} {:<20} {:<20} {:<20} {:<20} {:<20} {:<20} {:<20}".format( - "line", - "line_idx", - "is_class_def_line", - "is_in_class", - "class_name", - "parent_class_name", - "class_def_line_idx", - "class_end_line_idx", - "is_func_def_line", - "is_in_func", - "func_name", - "func_return_idx", - "return_item", - "func_def_line_idx", - "func_end_line_idx", - ) - ) - - for path in globals.list_code_path: - code = open(path, "r").read() - lines = code.split("\n") - - line_idx = 0 - is_multi_line_comment = False - end_multi_line_comment_flag = False - - is_class_def_line = False - is_in_class = False - class_name = "" - parent_class_name = [] - class_def_line_idx = -1 - class_end_line_idx = -1 - - is_func_def_line = False - is_in_func = False - func_name = "" - func_return_idx = -1 - return_item = "" - func_def_line_idx = -1 - func_end_line_idx = -1 - - for line in lines: - CL = CodeLine() - CL.file_path = path - CL.line_idx = line_idx - CL.line_content = line - CL.indent_level = get_line_indent_level(line) - - is_multi_line_comment, end_multi_line_comment_flag = multi_line_comment_detection( - line, is_multi_line_comment, end_multi_line_comment_flag - ) - CL.is_multi_line_comment = is_multi_line_comment - - is_single_line_comment_or_empty = single_line_comment_or_empty_line_detection(line) - CL.is_single_line_comment_or_empty = is_single_line_comment_or_empty - - # class - is_class_def_line = False - if "class " in line and line.lstrip()[0:5] == "class": - is_in_class = True - is_class_def_line = True - line_ls = line.lstrip() - if "(" in line_ls: # "class A(B):" - class_name = line_ls[line_ls.find(" ") + 1 : line_ls.find("(")] - parent_content = line_ls[line_ls.find("(") + 1 : line_ls.find(")")] - if "," in parent_content: # "class A(B, C):" - parent_class_name = [] - parent_content_items = parent_content.split(", ") - for parent_content_item in parent_content_items: - parent_class_name.append(parent_content_item) - else: # "class A(B):" - parent_class_name = [parent_content] - else: # "class A:" - class_name = line_ls[line_ls.find(" ") + 1 : line_ls.find(":")] - parent_class_name = [] - - # search for class end line - class_def_indent_level = get_line_indent_level(line) - class_def_line_idx = line_idx - search_idx = line_idx + 1 - search_following_lines = True - _is_multi_line_comment = False - _end_multi_line_comment_flag = False - while search_following_lines: - try: - following_line = lines[search_idx] - except: # end of file situation - class_end_line_idx = search_idx - break - following_indent_level = get_line_indent_level(following_line) - - _is_multi_line_comment, _end_multi_line_comment_flag = multi_line_comment_detection( - following_line, _is_multi_line_comment, _end_multi_line_comment_flag - ) - _is_single_line_comment_or_empty = single_line_comment_or_empty_line_detection(following_line) - - # judge_1: indent is equal to def indent - judge_1 = following_indent_level <= class_def_indent_level - # judge_2: not starting with")" - try: - judge_2 = ( - True if (following_line != "" and following_line[following_indent_level] != ")") else False - ) - except: - judge_2 = False - # judge_3: is not a comment or empty line - judge_3 = True if (not _is_multi_line_comment and not _is_single_line_comment_or_empty) else False - - if judge_1 and judge_2 and judge_3: - search_following_lines = False - class_end_line_idx = search_idx - - search_idx += 1 - - if is_in_class and line_idx == class_end_line_idx: - is_in_class = False - class_name = "" - parent_class_name = [] - class_def_line_idx = -1 - class_end_line_idx = -1 - - # function - if is_in_func and line_idx == func_end_line_idx: - is_in_func = False - func_return_idx = -1 - return_item = "" - func_name = "" - func_def_line_idx = -1 - func_end_line_idx = -1 - - is_func_def_line = False - # only consider outermost function, not consider def(def()) - if not is_in_func and "def " in line: - is_in_func = True - is_func_def_line = True - func_name = line[line.find("def") + 4 : line.find("(")] - - # search for func end line - func_def_indent_level = get_line_indent_level(line) - func_def_line_idx = line_idx - search_idx = line_idx + 1 - search_following_lines = True - _is_multi_line_comment = False - _end_multi_line_comment_flag = False - while search_following_lines: - try: - following_line = lines[search_idx] - except: # end of file situation - func_end_line_idx = search_idx - break - following_indent_level = get_line_indent_level(following_line) - - if "return" in following_line: - func_return_idx = search_idx - return_item = following_line[following_line.find("return") + 7 :].strip() - - _is_multi_line_comment, _end_multi_line_comment_flag = multi_line_comment_detection( - following_line, _is_multi_line_comment, _end_multi_line_comment_flag - ) - _is_single_line_comment_or_empty = single_line_comment_or_empty_line_detection(following_line) - - # judge_1: indent is equal to def indent - judge_1 = following_indent_level <= func_def_indent_level - # judge_2: not starting with")" - try: - judge_2 = ( - True if (following_line != "" and following_line[following_indent_level] != ")") else False - ) - except: - judge_2 = False - # judge_3: is not a comment or empty line - judge_3 = True if (not _is_multi_line_comment and not _is_single_line_comment_or_empty) else False - - if judge_1 and judge_2 and judge_3: - search_following_lines = False - func_end_line_idx = search_idx - - search_idx += 1 - - CL.is_class_def_line = is_class_def_line - CL.is_in_class = is_in_class - CL.class_name = class_name - CL.parent_class_name = parent_class_name - CL.class_def_line_idx = class_def_line_idx - CL.class_end_line_idx = class_end_line_idx - - CL.is_func_def_line = is_func_def_line - CL.is_in_func = is_in_func - CL.func_name = func_name - CL.func_return_idx = func_return_idx - CL.return_item = return_item - CL.func_def_line_idx = func_def_line_idx - CL.func_end_line_idx = func_end_line_idx - - if globals.print_code_line_info: - print( - "{:<100} {:<10} {:<20} {:<20} {:<20} {:<40} {:<20} \ - {:<20} {:<20} {:<20} {:<20} {:<20} {:<20} {:<20} {:<20}".format( - line[0:100], - line_idx, - is_class_def_line, - is_in_class, - class_name, - str(parent_class_name), - class_def_line_idx, - class_end_line_idx, - is_func_def_line, - is_in_func, - func_name, - func_return_idx, - return_item[0:20], - func_def_line_idx, - func_end_line_idx, - ) - ) - - globals.list_code_line_instance.append(CL) - line_idx += 1 - - # for i in globals.list_code_line_instance: - # i.print_info() diff --git a/neural_coder/graphers/function.py b/neural_coder/graphers/function.py deleted file mode 100644 index 6877bf913dc..00000000000 --- a/neural_coder/graphers/function.py +++ /dev/null @@ -1,189 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import logging -from typing import List - -from .. import globals -from ..utils.line_operation import get_line_indent_level - -logging.basicConfig( - level=globals.logging_level, format="%(asctime)s %(levelname)s %(message)s", datefmt="%a, %d %b %Y %H:%M:%S +0000" -) -logger = logging.getLogger(__name__) - - -def register_func_wrap_pair(): - """Register all relationships of ( [function name] : [return_item] ) pair of the list of code path provided - but only for "return xxx()" (return a function w/o class prefix) or "return xxx" (return an instance) - e.g. - def a1(): - - return b1() - def b1(): - return x - def c(): - return T.q() - INPUT: - ["example.py"] (above code snippet) - OUTPUT: - globals.list_all_function_return_item = ["b1", "x"] - globals.list_all_function_name = ["a1", "b1"] - """ - logger.info("Analyzing function wrapping relationship for call graph analysis...") - for path in globals.list_code_path: - code = open(path, "r").read() - lines = code.split("\n") - line_idx = 0 - is_in_function = False - func_end_line_idx = -1 - function_def_line_idx = -1 - for line in lines: - indent_level = get_line_indent_level(line) - - # handle function's end line - if is_in_function and line_idx == func_end_line_idx: - is_in_function = False - - # handle function's definition line, to initiate a function - if not is_in_function and "def " in line: # only deal with outermost def - function_name = line[line.find("def") + 4 : line.find("(")] - - def_indent_level = get_line_indent_level(line) - function_def_line_idx = line_idx - - is_in_function = True - - # search for function end line - search_idx = line_idx + 1 - search_following_lines = True - multi_comment_flag = False - while search_following_lines: - try: - following_line = lines[search_idx] - except: # end of file - func_end_line_idx = search_idx - break - following_indent_level = get_line_indent_level(following_line) - - # judge_1: indent is equal to def indent - judge_1 = following_indent_level <= def_indent_level - # judge_2: not starting with")" - try: - judge_2 = ( - True if (following_line != "" and following_line[following_indent_level] != ")") else False - ) - except: - judge_2 = False - # judge_3: is not a comment - c1 = False - c2 = False - if multi_comment_flag: - c1 = True # multi-line comment - if len(line) > 0 and len(line.lstrip()) > 0 and line.lstrip()[0] == "#": - c2 = True # single-line comment - if '"""' in following_line: - multi_comment_flag = not multi_comment_flag - - judge_3 = True if (not c1 and not c2) else False - - if judge_1 and judge_2 and judge_3: - search_following_lines = False - func_end_line_idx = search_idx - - search_idx += 1 - - line_idx += 1 - continue - - # handle inside a function - if is_in_function and line_idx < func_end_line_idx: - # handle return - if "return" in line: - line_s = line[line.find("return") + 7 :].strip() - # line_s common case: 1. "" 2. "xxx" 3. "xxx, xxx" 3. "xxx()" 4. "xxx(xxx)" 5. "xxx(xxx, xxx)" - if line_s == "": # case 1 - pass - elif line.strip()[0:6] != "return": - pass - elif 'f"' in line or "#" in line or "if" in line or "." in line or '""' in line or "+" in line: - pass - elif "(" in line_s: # case 4 or case 5 - return_item = line_s[: line_s.find("(")] - globals.list_all_function_return_item.append(return_item) - globals.list_all_function_name.append(function_name) - elif ", " in line_s: # case 3 - ls = line_s.split(", ") - for return_item in ls: - globals.list_all_function_return_item.append(return_item) - globals.list_all_function_name.append(function_name) - else: # case 2 - return_item = line_s - globals.list_all_function_return_item.append(return_item) - globals.list_all_function_name.append(function_name) - - line_idx += 1 - continue - - logger.debug(f"globals.list_all_function_name: {globals.list_all_function_name}") - logger.debug(f"globals.list_all_function_return_item: {globals.list_all_function_return_item}") - - -def get_all_wrap_children(base_function_name: str) -> List: - """Get all wrapper children names of the base function name - e.g. - class Net(nn.Module): - - xxx - # - def _resnet(): - model = Net() - return model - # - def resnet34(): - xxx - return _resnet() - # - def resnet18(): - xxx - return _resnet() - # - def resnet18_large(): - xxx - return resnet18() - # - INPUT: "_resnet" - OUTPUT: ["resnet18", "resnet34", "resnet18_large"] - """ - length = range(len(globals.list_all_function_return_item)) - base_function_name = [base_function_name] - do_search = True - list_child_all = [] - - while do_search: - current_count = len(list_child_all) - for this_base in base_function_name: - this_list_child = [] - for i in length: - if globals.list_all_function_return_item[i] == this_base: - this_list_child.append(globals.list_all_function_name[i]) - base_function_name = this_list_child - - list_child_all += this_list_child - list_child_all = list(set(list_child_all)) - - if len(list_child_all) == current_count: - do_search = False - - return list_child_all diff --git a/neural_coder/graphers/model.py b/neural_coder/graphers/model.py deleted file mode 100644 index 70739b124ea..00000000000 --- a/neural_coder/graphers/model.py +++ /dev/null @@ -1,290 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# FOR PYTORCH ONLY - -import logging -from typing import List - -from .. import globals -from ..utils.line_operation import get_line_indent_level, of_definition_format -from .function import get_all_wrap_children - -logging.basicConfig( - level=globals.logging_level, format="%(asctime)s %(levelname)s %(message)s", datefmt="%a, %d %b %Y %H:%M:%S +0000" -) -logger = logging.getLogger(__name__) - - -class ClassDefinition: - # (class_name + file_path) is the unique determination - def __init__(self, class_name, file_path, class_def_line_idx, parent_class_name): - self.class_name = class_name - self.file_path = file_path - self.class_def_line_idx = class_def_line_idx - self.parent_class_name = parent_class_name - - def print_info(self): - logger.debug(f"ClassDefinitionprint_info(): {self.__dict__}") - - -class ModelDefinition: - def __init__( - self, - model_name, - class_name, - file_path, - model_def_line_idx, - function_def_line_idx, - function_name, - ): - self.model_name = model_name - self.class_name = class_name - self.file_path = file_path - self.model_def_line_idx = model_def_line_idx - self.function_def_line_idx = function_def_line_idx - self.function_name = function_name - - def print_info(self): - logger.debug(f"ModelDefinition.print_info(): {self.__dict__}") - - -# search nnModule classes -def register_nnModule_class(): - logger.info("Analyzing nn.Module class definitions in all files ...") - # search raw nnModule class (e.g. class ClassName(nn.Module):) - for cl in globals.list_code_line_instance: - parent_class_has_nnModule = ( - list( - set(cl.parent_class_name) - & set(["nn.Module", "torch.nn.Module", "nn.Sequential", "torch.Sequential", "_BaseAutoModelClass"]) - ) - != [] - ) - if cl.is_class_def_line and parent_class_has_nnModule: - CD = ClassDefinition( - class_name=cl.class_name, - file_path=cl.file_path, - class_def_line_idx=cl.class_def_line_idx, - parent_class_name=cl.parent_class_name, - ) - CD.print_info() - globals.list_class_name.append(cl.class_name) - globals.list_class_def_instance.append(CD) - - # search child class of nnModule class (recursively), (e.g. class ClassName(ClassNameFather):) - # this is to complete the nnModule class list - # e.g. A(nn.Module), B(A), C(B), D(C) - search_scope = globals.list_class_name - do_search = True - while do_search: - list_child_class_name = [] - for cl in globals.list_code_line_instance: - parent_class_has_nnModule = list(set(cl.parent_class_name) & set(search_scope)) != [] - if cl.is_class_def_line and parent_class_has_nnModule: - CD = ClassDefinition( - class_name=cl.class_name, - file_path=cl.file_path, - class_def_line_idx=cl.class_def_line_idx, - parent_class_name=cl.parent_class_name, - ) - CD.print_info() - globals.list_class_name.append(cl.class_name) - globals.list_class_def_instance.append(CD) - list_child_class_name.append(cl.class_name) - search_scope = list_child_class_name - if len(search_scope) == 0: - do_search = False - - # unique - globals.list_class_name = list(set(globals.list_class_name)) - - logger.debug(f"class name count: {len(globals.list_class_name)}") - logger.debug(f"class name list : {globals.list_class_name}") - - -# search nnModule instance definition -def register_nnModule_instance_definition(): - logger.info("Analyzing nn.Module instance (model instance) definitions in all files ...") - - # search model definition lines like "model_name = ClassName(xxx)" - def_cl = [] - for cl in globals.list_code_line_instance: - if not cl.is_multi_line_comment and not cl.is_single_line_comment_or_empty: - is_def, lhs, rhs = of_definition_format(cl.line_content) - stripped = cl.line_content.replace(" ", "") - if ( - is_def - and rhs in globals.list_class_name + ["Module", "Sequential"] - and cl.class_name not in globals.list_class_name - and "(" not in cl.return_item - ): - def_cl.append(cl) - elif is_def and "__dict__[args.arch]" in cl.line_content: - def_cl.append(cl) - # bug - elif is_def and "hub.load" in cl.line_content: - def_cl.append(cl) - elif is_def and "onnx.load" in cl.line_content: - def_cl.append(cl) - elif is_def and "keras.Sequential" in cl.line_content: - def_cl.append(cl) - elif ( - is_def - and "." in stripped - and stripped[stripped.find("=") + 1 : stripped.find(".")] in globals.list_class_name - ): - def_cl.append(cl) - - list_lhs = [] - list_rhs = [] - list_is_in_func = [] - list_func_name = [] - list_return_item = [] - list_file_path = [] - list_line_idx = [] - list_func_def_line_idx = [] - for cl in def_cl: - is_def, lhs, rhs = of_definition_format(cl.line_content) - list_lhs.append(lhs) - list_rhs.append(rhs) - list_is_in_func.append(cl.is_in_func) - list_func_name.append(cl.func_name) - list_return_item.append(cl.return_item) - list_file_path.append(cl.file_path) - list_line_idx.append(cl.line_idx) - list_func_def_line_idx.append(cl.func_def_line_idx) - - # register qualified model's name of lines like "model_name = ClassName(xxx)" - globals.list_wrapper_base_function_name = [] - for i in range(len(list_lhs)): - # situation 1: "model = Net()" outside any function - if not list_is_in_func[i] and "tokenizer" not in list_lhs[i]: - # register this model - globals.list_model_name.append(list_lhs[i]) - MD = ModelDefinition( - model_name=list_lhs[i], - class_name=list_rhs[i], - file_path=list_file_path[i], - model_def_line_idx=list_line_idx[i], - function_def_line_idx=-1, - function_name="null", - ) # this MD is for all models defined outside a function - MD.print_info() - globals.list_model_def_instance.append(MD) - elif list_is_in_func[i]: # situation 2: "model = Net()" is inside a function - # situation 2-1: the function does not return another model's name, and is not __init__ - if ( - list_return_item[i] not in list_lhs - and list_func_name[i] != "__init__" - and "tokenizer" not in list_lhs[i] - ): - # register this model - globals.list_model_name.append(list_lhs[i]) - MD = ModelDefinition( - model_name=list_lhs[i], - class_name=list_rhs[i], - file_path=list_file_path[i], - model_def_line_idx=list_line_idx[i], - function_def_line_idx=list_func_def_line_idx[i], - function_name=list_func_name[i], - ) - # this MD is for all models defined outside a function - MD.print_info() - globals.list_model_def_instance.append(MD) - # situation 2-2: the function returns another model's name - elif list_return_item[i] in list_lhs: - globals.list_wrapper_base_function_name.append(list_func_name[i]) - - # register function_name like "xxx" in "def xxx() ... return NNModuleClass()" - for cl in globals.list_code_line_instance: - if ( - cl.is_in_func - and cl.line_idx == cl.func_return_idx - and cl.return_item[: cl.return_item.find("(")] in globals.list_class_name - ): - globals.list_wrapper_base_function_name.append(cl.func_name) - - # for all base function_name (that returns nnModule instance), - # find all wrapper function_name of the base wrapper function_name - globals.list_wrapper_base_function_name = list(set(globals.list_wrapper_base_function_name)) - globals.list_wrapper_children_function_name = [] - for i in globals.list_wrapper_base_function_name: - globals.list_wrapper_children_function_name += get_all_wrap_children(i) - globals.list_wrapper_all_function_name = ( - globals.list_wrapper_base_function_name + globals.list_wrapper_children_function_name - ) - globals.list_wrapper_all_function_name = list(set(globals.list_wrapper_all_function_name)) - - # register function_name like "xxx" in "def xxx() ... model = some_wrapper_function() ... return model" - for cl in globals.list_code_line_instance: - if cl.is_in_func and not cl.is_multi_line_comment and not cl.is_single_line_comment_or_empty: - is_def, lhs, rhs = of_definition_format(cl.line_content) - if ( - is_def - and rhs in globals.list_wrapper_all_function_name - and cl.class_name not in globals.list_class_name - and cl.return_item == lhs - ): - globals.list_wrapper_base_function_name.append(cl.func_name) - - # (again) - # for all base function_name (that returns nnModule instance), - # find all wrapper function_name of the base wrapper function_name - globals.list_wrapper_base_function_name = list(set(globals.list_wrapper_base_function_name)) - for i in globals.list_wrapper_base_function_name: - globals.list_wrapper_children_function_name += get_all_wrap_children(i) - globals.list_wrapper_all_function_name += ( - globals.list_wrapper_base_function_name + globals.list_wrapper_children_function_name - ) - globals.list_wrapper_all_function_name = list(set(globals.list_wrapper_all_function_name)) - - # print all wrapper function names for debug purpose - logger.debug(f"globals.list_wrapper_all_function_name: {globals.list_wrapper_all_function_name}") - - for cl in globals.list_code_line_instance: - if not cl.is_multi_line_comment and not cl.is_single_line_comment_or_empty and cl.func_name != "__init__": - is_def, lhs, rhs = of_definition_format(cl.line_content) - if ( - is_def - and rhs in globals.list_wrapper_all_function_name - and rhs not in ["self.model", "model", "self.call", "call"] - and "forward" not in rhs - and "config" not in lhs - and "congfig" not in lhs - and "," not in lhs - and "inference" not in lhs - and "tokenizer" not in lhs - and cl.class_name not in globals.list_class_name - and cl.func_name not in globals.list_wrapper_all_function_name - ): - # register this model - globals.list_model_name.append(lhs) - MD = ModelDefinition( - model_name=lhs, - class_name="(Note: this is a func-defined model) " + rhs, - file_path=cl.file_path, - model_def_line_idx=cl.line_idx, - function_def_line_idx=cl.func_def_line_idx, - function_name=cl.func_name, - ) - # this MD is for all models defined by a wrapper function (e.g. model = models.resnet18()) - # model def can be outside any function, or in a function that is not itself a wrapper function - MD.print_info() - globals.list_model_def_instance.append(MD) - - globals.list_model_name = list(set(globals.list_model_name)) - - # print all model names for debug purpose - logger.debug(f"model name list: {globals.list_model_name}") diff --git a/neural_coder/graphers/preloads/__init__.py b/neural_coder/graphers/preloads/__init__.py deleted file mode 100644 index e833188cc78..00000000000 --- a/neural_coder/graphers/preloads/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/neural_coder/graphers/preloads/transformers.yaml b/neural_coder/graphers/preloads/transformers.yaml deleted file mode 100644 index b1ebe26de23..00000000000 --- a/neural_coder/graphers/preloads/transformers.yaml +++ /dev/null @@ -1,2160 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -class: - [ - 'LongT5LayerLocalSelfAttention', - 'CLIPTextModel', - 'NezhaAttention', - 'FlaxRobertaLayerCollection', - 'OwlViTBoxPredictionHead', - 'PerceiverImagePreprocessor', - 'FlaxViTAttention', - 'BigBirdPegasusForSequenceClassification', - 'GPTJForSequenceClassification', - 'PerceiverForImageClassificationConvProcessing', - 'PoolFormerPreTrainedModel', - 'SEWDEncoder', - 'T5EncoderModel', - 'CTRLModel', - 'OwlViTEncoder', - 'RoFormerForQuestionAnswering', - 'FlaxMBartForSequenceClassificationModule', - 'FlaxBigBirdEmbeddings', - 'MPNetPooler', - 'FlaxGPT2MLP', - 'CanineOutput', - 'FlaxAutoModelForMaskedLM', - 'ReformerForSequenceClassification', - 'FlaxGPTJForCausalLMModule', - 'ElectraForMaskedLM', - 'DebertaIntermediate', - 'MPNetForMultipleChoice', - 'Data2VecAudioPositionalConvLayer', - 'RemBertLMPredictionHead', - 'SplinterOutput', - 'DistilBertForSequenceClassification', - 'PoolerEndLogits', - 'BertLayer', - 'FlaxWav2Vec2Attention', - 'PLBartForConditionalGeneration', - 'FlaxBertSelfOutput', - 'FlaxElectraIntermediate', - 'FlaxBlenderbotSmallEncoderLayer', - 'MobileBertAttention', - 'YosoEncoder', - 'RoFormerForTokenClassification', - 'BigBirdPreTrainedModel', - 'VisualBertForVisualReasoning', - 'FlaxRobertaAttention', - 'Data2VecTextClassificationHead', - 'LayoutLMForMaskedLM', - 'YosoPredictionHeadTransform', - 'PegasusDecoderLayer', - 'SEWModel', - 'MaskFormerSwinBlock', - 'XLMRobertaXLPreTrainedModel', - 'DPTViTLayer', - 'UniSpeechForSequenceClassification', - 'Data2VecTextOutput', - 'DPRSpanPredictor', - 'MarianModel', - 'PreTrainedModel', - 'RemBertForQuestionAnswering', - 'XLMProphetNetForConditionalGeneration', - 'MaskFormerSwinEncoder', - 'UniSpeechSatForPreTraining', - 'TFAutoModelForImageClassification', - 'LayoutLMv2Embeddings', - 'BlenderbotSmallAttention', - 'ViltPatchEmbeddings', - 'MobileViTSelfAttention', - 'SpeechEncoderDecoderModel', - 'NezhaSelfOutput', - 'AutoModelForTokenClassification', - 'Wav2Vec2ConformerGumbelVectorQuantizer', - 'WavLMEncoderStableLayerNorm', - 'RagPreTrainedModel', - 'VisualBertEmbeddings', - 'TrajectoryTransformerPreTrainedModel', - 'FlaxPegasusEncoder', - 'FlaxAutoModelForCausalLM', - 'BertOutput', - 'FlaxElectraGeneratorPredictions', - 'FlaxLongT5Attention', - 'Conv1D', - 'RoFormerOutput', - 'GPTJModel', - 'CLIPMLP', - 'FlaxBigBirdForQuestionAnsweringHead', - 'PerceiverSelfOutput', - 'MegatronBertOutput', - 'QDQBertForQuestionAnswering', - 'CodeGenPreTrainedModel', - 'LukeLMHead', - 'ViltPooler', - 'RemBertForTokenClassification', - 'MegatronBertIntermediate', - 'MCTCTLayerNorm', - 'WavLMAdapter', - 'FlaxCLIPMLP', - 'ReformerForMaskedLM', - 'FlaxMarianEncoder', - 'FlaxBlenderbotSmallDecoderLayerCollection', - 'FlaxRoFormerForMaskedLMModule', - 'YolosEmbeddings', - 'AutoModelForAudioClassification', - 'FlaubertWithLMHeadModel', - 'PLBartModel', - 'LayoutLMv3PreTrainedModel', - 'FlaxGPTNeoBlock', - 'SeparableConv1D', - 'GPTNeoXMLP', - 'LongformerSelfAttention', - 'FlaxRobertaForMultipleChoiceModule', - 'FlaxT5LayerCrossAttention', - 'Wav2Vec2FeatureExtractor', - 'FlaxBeitLayerCollection', - 'NezhaForSequenceClassification', - 'FlaxBartEncoder', - 'GLPNDropPath', - 'UniSpeechSatFeatureProjection', - 'IBertOutput', - 'XLNetForMultipleChoice', - 'Conv2DDownsample', - 'RealmReader', - 'GroupViTAttention', - 'LayoutLMForSequenceClassification', - 'FlaxLongT5DenseGatedActDense', - 'LEDDecoderAttention', - 'MobileBertIntermediate', - 'SwinForMaskedImageModeling', - 'OwlViTEncoderLayer', - 'BigBirdPredictionHeadTransform', - 'RobertaOutput', - 'MPNetSelfAttention', - 'CanineForTokenClassification', - 'SegformerEfficientSelfAttention', - 'FlaxOPTDecoderLayer', - 'MBartDecoderLayer', - 'UniSpeechEncoderLayer', - 'MCTCTEncoder', - 'FlaxElectraAttention', - 'ReformerFeedForwardOutput', - 'ResNetBasicLayer', - 'FlaxViTLayerCollection', - 'Wav2Vec2PreTrainedModel', - 'VanForImageClassification', - 'ConvNextLayer', - 'QDQBertPooler', - 'TFAutoModel', - 'BigBirdForQuestionAnswering', - 'RemBertSelfOutput', - 'SegformerLayer', - 'FNetPooler', - 'FlaxPegasusDecoderLayer', - 'LongT5Attention', - 'CvtConvEmbeddings', - 'InterpolateMidPositionEmbeddings', - 'LongT5LayerFF', - 'CanineForSequenceClassification', - 'T5Block', - 'ConvBertOutput', - 'FlaxMBartEncoderLayer', - 'VanStage', - 'LayoutLMv3Model', - 'Speech2Text2Decoder', - 'FlaxBlenderbotDecoderLayer', - 'FNetLayer', - 'MobileBertForTokenClassification', - 'MegatronBertPooler', - 'EinLinear', - 'RegNetEncoder', - 'CanineIntermediate', - 'LEDDecoder', - 'SegformerModel', - 'CvtSelfAttentionLinearProjection', - 'Wav2Vec2Attention', - 'FlaxBartModule', - 'ViTMAESelfAttention', - 'BartForQuestionAnswering', - 'MBartEncoder', - 'IBertClassificationHead', - 'FSMTForConditionalGeneration', - 'NystromformerPreTrainedModel', - 'FunnelModel', - 'MaskFormerSwinDropPath', - 'GPT2ForSequenceClassification', - 'FlaxBeitSelfAttention', - 'FSMTModel', - 'ViTSelfAttention', - 'FlaxBeitDropPath', - 'OwlViTAttention', - 'FlaxBertOutput', - 'HubertSamePadLayer', - 'SegformerOverlapPatchEmbeddings', - 'XLMRobertaXLPooler', - 'YolosPatchEmbeddings', - 'YolosModel', - 'FNetOnlyMLMHead', - 'MvpModel', - 'DPTFeatureFusionStage', - 'Speech2Text2ForCausalLM', - 'Data2VecVisionIntermediate', - 'FlaxDistilBertForTokenClassificationModule', - 'GroupViTVisionEncoder', - 'FlaxMBartDecoderLayer', - 'XLMRobertaModel', - 'LukeForEntitySpanClassification', - 'DecisionTransformerGPT2Model', - 'Wav2Vec2ConformerNoLayerNormConvLayer', - 'FlaxBeitIntermediate', - 'LukeSelfOutput', - 'FlaxT5LayerFF', - '_TFAutoModelWithLMHead', - 'CamembertForCausalLM', - 'DPTModel', - 'MegatronBertPredictionHeadTransform', - 'FunnelAttentionStructure', - 'Data2VecVisionForImageClassification', - 'GLPNSelectiveFeatureFusion', - 'Wav2Vec2ConformerRotaryPositionalEmbedding', - 'SequenceSummary', - 'FlaxBertForTokenClassificationModule', - 'FlavaSelfOutput', - 'FNetForMultipleChoice', - 'Data2VecVisionLayer', - 'Wav2Vec2ConformerForPreTraining', - 'FlaxCLIPVisionEmbeddings', - 'RemBertForMaskedLM', - 'RealmEncoder', - 'ViTIntermediate', - 'LayoutLMv3SelfOutput', - 'RagSequenceForGeneration', - 'T5LayerCrossAttention', - 'XGLMPreTrainedModel', - 'FlaxVisionTextDualEncoderModule', - 'OwlViTVisionEmbeddings', - 'FlaxBlenderbotDecoder', - 'FlaxRoFormerLayer', - 'M2M100Model', - 'FlaxElectraForCausalLMModule', - 'AlbertForSequenceClassification', - 'SqueezeBertForMaskedLM', - 'UniSpeechPositionalConvEmbedding', - 'GPTNeoXLayer', - 'XLMRobertaXLSelfAttention', - 'FlaxBlenderbotSmallDecoder', - 'RealmReaderProjection', - 'DPTViTEmbeddings', - 'IBertModel', - 'LukeModel', - 'FlaxLongT5DenseActDense', - 'MegatronBertPreTrainedModel', - 'FlaxBigBirdIntermediate', - 'FlaxDistilBertForSequenceClassificationModule', - 'SwinDropPath', - 'AutoModelForSeq2SeqLM', - 'IBertForMultipleChoice', - 'FlaxLongT5ForConditionalGenerationModule', - 'ViTMAEIntermediate', - 'QDQBertEncoder', - 'FlaxRobertaSelfOutput', - 'RegNetConvLayer', - 'BlenderbotDecoder', - 'BlenderbotEncoderLayer', - 'RobertaPooler', - 'AlbertAttention', - 'FlaxAutoModelForVision2Seq', - 'FlaxLongT5LayerCrossAttention', - 'XLNetForQuestionAnswering', - 'FlaxTransformerBlock', - 'GPTJAttention', - 'FNetPreTrainedModel', - 'DeiTAttention', - 'FlaubertModel', - 'M2M100DecoderLayer', - 'SwinForImageClassification', - 'VisualBertModel', - 'MegatronBertSelfAttention', - 'XLMRobertaXLForMaskedLM', - 'GroupViTPatchEmbeddings', - 'PegasusDecoder', - 'BeitPooler', - 'T5Attention', - 'FlaxAlbertSelfAttention', - 'BertPooler', - 'BertPreTrainingHeads', - 'GELUActivation', - 'HubertFeedForward', - 'IntSoftmax', - 'GroupViTTokenAssign', - 'FlaxDistilBertForMaskedLMModule', - 'Speech2Text2Attention', - 'MBartAttention', - 'Wav2Vec2ConformerPositionalConvEmbedding', - 'AlbertForTokenClassification', - 'RelPartialLearnableMultiHeadAttn', - 'LxmertEmbeddings', - 'SEWDFeatureExtractor', - 'LayoutLMv2Encoder', - 'SqueezeBertPooler', - 'Data2VecTextForSequenceClassification', - 'TFAutoModelForCausalLM', - 'Wav2Vec2ConformerFeatureProjection', - 'ViTEmbeddings', - 'CLIPEncoderLayer', - 'BigBirdForSequenceClassification', - 'YolosOutput', - 'VisualBertRegionToPhraseAttention', - 'FlaxRobertaClassificationHead', - 'FlaxBigBirdForMaskedLMModule', - 'SegformerForSemanticSegmentation', - 'BartForConditionalGeneration', - 'LongT5TransientGlobalAttention', - 'AlbertForMultipleChoice', - 'ResNetPreTrainedModel', - 'DebertaV2Layer', - 'GPTNeoXForCausalLM', - 'Speech2TextForConditionalGeneration', - 'LukeEntityEmbeddings', - 'FlaxCLIPTextEmbeddings', - 'QDQBertOutput', - 'DebertaPreTrainedModel', - 'DetrMHAttentionMap', - 'FlaxCLIPTextTransformer', - 'VanLayer', - 'FlaxConvWithWeightNorm', - 'RoFormerIntermediate', - 'PerceiverMultimodalDecoder', - 'PegasusForCausalLM', - 'QDQBertPreTrainedModel', - 'MPNetForMaskedLM', - 'BloomForTokenClassification', - 'LxmertLayer', - 'XLMRobertaXLOutput', - 'HubertEncoderLayerStableLayerNorm', - 'MobileViTModel', - 'CanineOnlyMLMHead', - 'DPTFeatureFusionLayer', - 'MegatronBertForPreTraining', - 'UniSpeechSatModel', - 'T5ForConditionalGeneration', - 'FlaxGPTJModule', - 'GPTNeoMLP', - 'BigBirdForMultipleChoice', - 'TapasOutput', - 'OutputBottleneck', - 'PerceiverForMultimodalAutoencoding', - 'XLNetForQuestionAnsweringSimple', - 'Data2VecTextPooler', - 'XLMRobertaXLEmbeddings', - 'FlaxBertEmbeddings', - 'IntLayerNorm', - 'LongformerEncoder', - 'FlaxPegasusModule', - 'RealmKnowledgeAugEncoder', - 'ProphetNetEncoderLayer', - 'BartEncoderLayer', - 'BertForNextSentencePrediction', - 'RealmEmbedder', - 'FlavaLayer', - 'BeitForImageClassification', - 'CvtDropPath', - 'Wav2Vec2ForCTC', - 'SEWDLayer', - 'CodeGenBlock', - 'NystromformerForMaskedLM', - 'LxmertSelfAttentionLayer', - 'SEWFeedForward', - 'HubertNoLayerNormConvLayer', - 'PerceiverForOpticalFlow', - 'ElectraIntermediate', - 'SplinterLayer', - 'FlaxBlenderbotSmallForConditionalGenerationModule', - 'IBertForTokenClassification', - 'OwlViTModel', - 'Speech2Text2SinusoidalPositionalEmbedding', - 'BigBirdPreTrainingHeads', - 'CvtSelfAttentionProjection', - 'LayoutLMv2SelfOutput', - 'FlaxCLIPEncoder', - 'LEDForQuestionAnswering', - 'SegformerForImageClassification', - 'MaskFormerFPNLayer', - 'LongformerLayer', - 'ConvBertEmbeddings', - 'FlaxViTSelfAttention', - 'ViltForImagesAndTextClassification', - 'FlavaImageEmbeddings', - 'FlaxPegasusForConditionalGenerationModule', - 'LxmertModel', - 'Speech2Text2DecoderWrapper', - 'TFAutoModelForSpeechSeq2Seq', - 'QDQBertForMaskedLM', - 'NystromformerOutput', - 'DetrFrozenBatchNorm2d', - 'MobileBertPooler', - 'FlaxPegasusDecoder', - 'MobileViTLayer', - 'LevitForImageClassification', - 'LxmertIntermediate', - 'BartDecoder', - 'DetrModel', - 'ConvLayer', - 'FlaxBertForPreTrainingModule', - 'LayoutLMv3Attention', - 'PerceiverAudioPreprocessor', - 'FNetForNextSentencePrediction', - 'ConvBertSelfAttention', - 'YosoForMaskedLM', - 'ResNetModel', - 'WavLMForSequenceClassification', - 'FlaxBartClassificationHead', - 'Data2VecVisionDropPath', - 'IBertForQuestionAnswering', - 'HubertGroupNormConvLayer', - 'MaskFormerFPNModel', - 'LongformerOutput', - 'ElectraForCausalLM', - 'XLMRobertaForMaskedLM', - 'LEDForConditionalGeneration', - 'BloomGelu', - 'FlavaForPreTraining', - 'LukeSelfAttention', - 'CodeGenModel', - 'PoolFormerEmbeddings', - 'MCTCTSelfAttention', - 'ChunkReformerFeedForward', - 'GPTNeoForCausalLM', - 'SEWDSamePadLayer', - 'FFN', - 'ElectraAttention', - 'TFAutoModelWithLMHead', - 'AutoModel', - 'ProphetNetForConditionalGeneration', - 'YosoEmbeddings', - 'FunnelForSequenceClassification', - 'FlavaIntermediate', - 'LayoutLMv2Intermediate', - 'ViltEmbeddings', - 'DistilBertForMultipleChoice', - 'MPNetForSequenceClassification', - 'UniSpeechEncoder', - 'DecisionTransformerPreTrainedModel', - 'MT5Model', - 'PerceiverAudioPostprocessor', - 'ElectraSelfOutput', - 'Speech2TextSinusoidalPositionalEmbedding', - 'PretrainedFSMTModel', - 'RetriBertModel', - 'CamembertForQuestionAnswering', - 'MegatronBertPreTrainingHeads', - 'FlavaTextEmbeddings', - 'YolosMLPPredictionHead', - 'FlaxBigBirdForPreTrainingModule', - 'MobileBertForMaskedLM', - 'XLMRobertaForTokenClassification', - 'ViTMAEOutput', - 'MaskFormerPreTrainedModel', - 'MBartForQuestionAnswering', - 'WavLMAttention', - 'MPNetPreTrainedModel', - 'ViltMLMHead', - 'BertGenerationEmbeddings', - 'MaskFormerSwinLayer', - 'SegformerAttention', - 'DebertaV2PreTrainedModel', - 'ResNetForImageClassification', - 'TapasPreTrainedModel', - 'PerceiverClassificationPostprocessor', - 'NystromformerForQuestionAnswering', - 'BeitPyramidPoolingBlock', - 'NezhaForPreTraining', - 'TapasForSequenceClassification', - 'FlaxMarianMTModule', - 'PerceiverModel', - 'SwinPatchMerging', - 'FlaxElectraForPreTrainingModule', - 'XLMProphetNetDecoder', - 'FlavaImageCodebookBlock', - 'GPTJBlock', - 'Data2VecTextEncoder', - 'PerceiverTextPreprocessor', - 'UniSpeechSamePadLayer', - 'FlaxGPT2LMHeadModule', - 'LayoutLMAttention', - 'FlaxRobertaSelfAttention', - 'Transformer', - 'ProphetNetFeedForward', - 'ViTSelfOutput', - 'RegNetXLayer', - 'RemBertAttention', - 'PerceiverAttention', - 'LevitPatchEmbeddings', - 'ProphetNetDecoder', - 'PoolFormerModel', - 'HubertFeatureExtractor', - 'CvtModel', - 'PerceiverProjectionPostprocessor', - 'BertSelfOutput', - 'CanineSelfAttention', - 'CvtLayer', - 'Data2VecAudioAdapter', - 'FlaxXGLMModule', - 'RoFormerLMPredictionHead', - 'IBertForMaskedLM', - 'FlaxGPTNeoMLP', - 'BlenderbotSmallForCausalLM', - 'MBartModel', - 'VanOverlappingPatchEmbedder', - 'CLIPTextTransformer', - 'RoFormerPreTrainedModel', - 'SEWDIntermediate', - 'MarianPreTrainedModel', - 'WavLMForAudioFrameClassification', - 'RealmForOpenQA', - 'SEWDSelfOutput', - 'MBartPreTrainedModel', - 'MCTCTIntermediate', - 'NystromformerClassificationHead', - 'VisualBertPreTrainedModel', - 'Wav2Vec2FeedForward', - 'DeiTSelfOutput', - 'FlaxRobertaForMaskedLMModule', - 'FlaxBertPreTrainingHeads', - 'NezhaPreTrainedModel', - 'Embeddings', - 'LongformerModel', - 'TransfoXLModel', - 'FlaxAlbertLayerGroups', - 'Data2VecVisionEmbeddings', - 'BeitSelfOutput', - 'ViTOutput', - 'BlenderbotSmallForConditionalGeneration', - 'BigBirdEncoder', - 'DebertaOutput', - 'FlaxAlbertForPreTrainingModule', - 'LayoutLMv3Output', - 'FlaxElectraEncoder', - 'PerceiverClassificationDecoder', - 'SEWDPreTrainedModel', - 'XLNetModel', - 'ImageGPTMLP', - 'SwinIntermediate', - 'MobileViTInvertedResidual', - 'DPTViTSelfOutput', - 'RotaryEmbedding', - 'LayoutLMv2ForTokenClassification', - 'FlaxViTPatchEmbeddings', - 'RobertaSelfOutput', - 'OPTPreTrainedModel', - 'DebertaV2Attention', - 'MaskformerMLPPredictionHead', - 'XLMPredLayer', - 'FNetForMaskedLM', - 'GLPNModel', - 'VisualBertAttention', - 'GroupViTPreTrainedModel', - 'PegasusEncoder', - 'BertOnlyNSPHead', - 'RegNetStage', - 'FlaxAlbertEncoder', - 'FlaxElectraTiedDense', - 'FlaxAutoModelForMultipleChoice', - 'ReformerClassificationHead', - 'M2M100EncoderLayer', - 'ReformerPreTrainedModel', - 'MobileBertForPreTraining', - 'PerceiverAbstractPositionEncoding', - 'TextEmbeddings', - 'LukeEncoder', - 'AutoModelForImageSegmentation', - 'MaskFormerTransformerModule', - 'FlaxWav2Vec2GumbelVectorQuantizer', - 'RemBertEmbeddings', - 'FNetModel', - 'XLMRobertaForSequenceClassification', - 'T5DenseActDense', - 'RegNetYLayer', - 'LinearActivation', - 'MBartForSequenceClassification', - 'DebertaForQuestionAnswering', - 'Data2VecAudioPreTrainedModel', - 'XGLMModel', - 'DetrTimmConvEncoder', - 'FlaxLongT5Module', - 'FlaxLongT5LayerTransientGlobalSelfAttention', - 'LayoutLMv3ForSequenceClassification', - 'WavLMGumbelVectorQuantizer', - 'MegatronBertEmbeddings', - 'ElectraForMultipleChoice', - 'Data2VecTextLayer', - 'MvpDecoderWrapper', - 'RobertaForSequenceClassification', - 'FlaxBertForMaskedLMModule', - 'BlenderbotSmallEncoder', - 'LayoutLMSelfOutput', - 'InterpolateInitialPositionEmbeddings', - 'XLMRobertaXLIntermediate', - 'GPTNeoForSequenceClassification', - 'ViTMAEModel', - 'MobileBertEncoder', - 'BeitPatchEmbeddings', - 'RealmPreTrainedModel', - 'CvtSelfAttention', - 'MobileViTASPP', - 'FlaxBartForQuestionAnsweringModule', - 'ImageGPTPreTrainedModel', - 'MobileBertSelfOutput', - 'BartDecoderLayer', - 'PegasusDecoderWrapper', - 'ResNetConvLayer', - 'FlaxAlbertEmbeddings', - 'RemBertIntermediate', - 'XLMRobertaXLLayer', - 'XGLMSinusoidalPositionalEmbedding', - 'ConvBertForQuestionAnswering', - 'CvtSelfOutput', - 'UniSpeechSatForXVector', - 'AutoModelForImageClassification', - 'DecisionTransformerGPT2PreTrainedModel', - 'AlbertForPreTraining', - 'Data2VecVisionForSemanticSegmentation', - 'FlaxRobertaForQuestionAnsweringModule', - 'SEWAttention', - 'TFAutoModelForNextSentencePrediction', - 'BigBirdClassificationHead', - 'YolosLoss', - 'UniSpeechSatFeatureExtractor', - 'TapasPredictionHeadTransform', - 'FlaxLongT5LayerLocalSelfAttention', - 'BigBirdPegasusModel', - 'ElectraSelfAttention', - 'RegNetShortCut', - 'YosoSelfOutput', - 'YosoForSequenceClassification', - 'SQuADHead', - 'FlaxRoFormerSelfOutput', - 'SplinterIntermediate', - 'PerceiverForImageClassificationFourier', - 'XLMRobertaForMultipleChoice', - 'PredictionBlock', - 'MarianForCausalLM', - 'CanineEncoder', - 'FlaxBartForConditionalGenerationModule', - 'FlaxElectraClassificationHead', - 'FlavaEncoder', - 'ViTLayer', - 'SqueezeBertForSequenceClassification', - 'FlaxBeitEncoder', - 'TransfoXLPreTrainedModel', - 'FlaxBartDecoderWrapper', - 'FlaxBigBirdForMultipleChoiceModule', - 'ElectraModel', - 'HubertEncoder', - 'MPNetForTokenClassification', - 'FlaxPegasusAttention', - 'CvtEmbeddings', - 'FlaxGPTJBlock', - 'FlaxBeitOutput', - 'FlaxBertOnlyMLMHead', - 'IBertSelfAttention', - 'MCTCTLayer', - 'NystromformerForSequenceClassification', - 'FlaxAlbertModule', - 'GPTNeoPreTrainedModel', - 'ViltForTokenClassification', - 'IntGELU', - 'CvtEncoder', - 'LukeAttention', - 'RobertaPreTrainedModel', - 'DPRQuestionEncoder', - 'MaskFormerModel', - 'FNetEncoder', - 'FlaxBigBirdModule', - 'FlaxAlbertForMultipleChoiceModule', - 'LxmertLMPredictionHead', - 'DebertaLMPredictionHead', - 'OPTDecoderLayer', - 'PegasusModel', - 'RealmEmbeddings', - 'AdaptiveEmbedding', - 'MobileBertSelfAttention', - 'NewGELUActivation', - 'MPNetClassificationHead', - 'DebertaModel', - 'DebertaForSequenceClassification', - 'Wav2Vec2ConformerModel', - 'GLPNDecoder', - 'AutoModelWithLMHead', - 'AutoModelForCTC', - 'DetrMLPPredictionHead', - 'EntityPredictionHead', - 'LevitAttention', - 'PegasusPreTrainedModel', - 'DetrDecoderLayer', - 'PositionalEmbedding', - 'UniSpeechFeedForward', - 'GroupViTEncoderLayer', - 'GLPNLayer', - 'GLPNDWConv', - 'XLNetRelativeAttention', - 'MaskFormerPixelDecoder', - 'PLBartForSequenceClassification', - 'T5LayerFF', - 'AutoModelForVision2Seq', - 'QDQBertLMPredictionHead', - 'GPT2DoubleHeadsModel', - 'FNetBasicOutput', - 'FlaxXGLMDecoderLayer', - 'MegatronBertForNextSentencePrediction', - 'FunnelRelMultiheadAttention', - 'PoolFormerDropPath', - 'MobileBertOutput', - 'SEWUpsampling', - 'FSMTDecoder', - 'DPTViTEncoder', - 'ViTForImageClassification', - 'XLNetForSequenceClassification', - 'ConvBertGeneratorPredictions', - 'BertGenerationPreTrainedModel', - 'SqueezeBertForQuestionAnswering', - 'WavLMAdapterLayer', - 'BigBirdPegasusDecoderLayer', - 'FunnelPositionwiseFFN', - 'SEWDPositionalConvEmbedding', - 'LevitModel', - 'AlbertForMaskedLM', - 'DPTSemanticSegmentationHead', - 'MLP', - 'BlenderbotDecoderLayer', - 'TapasPooler', - 'LukeForEntityPairClassification', - 'CanineEmbeddings', - 'VisualBertForQuestionAnswering', - 'MaskFormerSwinPatchEmbeddings', - 'T5Stack', - 'GroupViTStage', - 'FlaxBertPooler', - 'GLPNForDepthEstimation', - 'FlaxBeitModule', - 'FlaxBigBirdForTokenClassificationModule', - 'FlaxWav2Vec2EncoderLayerStableLayerNorm', - 'FlaxCLIPVisionModule', - 'GPTJForCausalLM', - 'SEWFeatureExtractor', - 'FlaxBigBirdLMPredictionHead', - 'UniSpeechSatEncoder', - 'FlaxPegasusEncoderLayerCollection', - 'SwinSelfOutput', - 'Wav2Vec2PositionalConvEmbedding', - 'MobileViTConvLayer', - 'OpenAIGPTPreTrainedModel', - 'LongformerAttention', - 'MarianEncoder', - 'FlaxT5Block', - 'CvtSelfAttentionConvProjection', - 'Data2VecVisionOutput', - 'LongT5ForConditionalGeneration', - 'MobileViTForImageClassification', - 'MegatronBertModel', - 'FlaxBartForCausalLMModule', - 'DebertaForTokenClassification', - 'NystromformerSelfAttention', - 'QDQBertPredictionHeadTransform', - 'XLMProphetNetModel', - 'LongformerForMaskedLM', - 'ConvBertPreTrainedModel', - 'FNetIntermediate', - 'FNetPredictionHeadTransform', - 'ConvBertForMaskedLM', - 'FlaxBartAttention', - 'LongformerClassificationHead', - 'OPTAttention', - 'FNetLMPredictionHead', - 'BeitConvModule', - 'LayoutLMv2Pooler', - 'SEWEncoderLayer', - 'SqueezeBertForMultipleChoice', - 'DetrLearnedPositionEmbedding', - 'Data2VecAudioForAudioFrameClassification', - 'NezhaOnlyMLMHead', - 'TransfoXLForSequenceClassification', - 'FastGELUActivation', - 'QDQBertLayer', - 'LxmertForQuestionAnswering', - 'MPNetEmbeddings', - 'ResNetStage', - 'ClippedGELUActivation', - 'BertPredictionHeadTransform', - 'PerceiverMLP', - 'PerceiverPreTrainedModel', - 'FlavaImageCodebookLayerGroup', - 'GLPNDepthEstimationHead', - 'AutoModelForQuestionAnswering', - 'BigBirdAttention', - 'DebertaEncoder', - 'ConvBertClassificationHead', - 'YolosLayer', - 'EncoderDecoderModel', - 'CLIPTextEmbeddings', - 'FNetForTokenClassification', - 'NystromformerForTokenClassification', - 'LxmertPooler', - 'HubertForCTC', - 'UniSpeechFeatureEncoder', - 'BloomForSequenceClassification', - 'FlaxLongT5LayerSelfAttention', - 'QDQBertModel', - 'WavLMModel', - 'RegNetSELayer', - 'FlaxDistilBertModule', - 'FlaxGPT2BlockCollection', - 'ResNetEncoder', - 'DPTPreTrainedModel', - 'BigBirdBlockSparseAttention', - 'RemBertOnlyMLMHead', - 'GPTJForQuestionAnswering', - 'LxmertPredictionHeadTransform', - 'FlaxRoFormerPredictionHeadTransform', - 'UniSpeechSatPreTrainedModel', - 'LongT5LayerSelfAttention', - 'DPTViTPatchEmbeddings', - 'FlaxBertLayer', - 'SwinEmbeddings', - 'ProphetNetDecoderWrapper', - 'Conv1dSubsampler', - 'CanineModel', - 'Data2VecVisionEncoder', - 'TapasAttention', - 'ResNetBottleNeckLayer', - 'BartForCausalLM', - 'TrOCRDecoderWrapper', - 'DPTViTIntermediate', - 'SegformerSelfOutput', - 'VisualBertSelfOutput', - 'LSHSelfAttention', - 'GroupViTVisionEmbeddings', - 'XLMForQuestionAnswering', - 'MPNetOutput', - 'AutoModelForNextSentencePrediction', - 'RealmLayer', - 'FlaxMBartForQuestionAnsweringModule', - 'LayoutLMOnlyMLMHead', - 'OpenAIGPTLMHeadModel', - 'FlaxBlenderbotEncoderLayer', - 'WavLMPositionalConvEmbedding', - 'FlaubertForSequenceClassification', - 'LayoutLMPooler', - 'ResNetShortCut', - 'FlaxT5LayerCollection', - 'YolosIntermediate', - 'UniSpeechSatForSequenceClassification', - 'TapasModel', - 'Speech2TextAttention', - 'MvpDecoder', - 'Block', - 'VisualBertLayer', - 'DetrEncoder', - 'UniSpeechSatEncoderLayerStableLayerNorm', - 'FlaxOPTDecoder', - 'HubertFeatureEncoder', - 'FlaxBeitEmbeddings', - 'FlaxBartDecoderLayer', - 'LongT5DenseGatedActDense', - 'TFAutoModelForTableQuestionAnswering', - 'MegatronBertForMaskedLM', - 'SplinterModel', - 'MegatronBertEncoder', - 'FunnelForQuestionAnswering', - 'YosoPreTrainedModel', - 'BigBirdOnlyMLMHead', - 'DeiTForImageClassificationWithTeacher', - 'MobileBertForNextSentencePrediction', - 'FlaxBeitSelfOutput', - 'TrOCRForCausalLM', - 'ViltPredictionHeadTransform', - 'FlaxAutoModelForImageClassification', - 'MobileViTPreTrainedModel', - 'BeitAttention', - 'SplinterSelfAttention', - 'YosoForMultipleChoice', - 'FlaxLongT5BlockCollection', - 'RobertaEncoder', - 'FlaxDistilBertForQuestionAnsweringModule', - 'FlaxViTOutput', - 'CaninePreTrainedModel', - 'NystromformerEmbeddings', - 'RemBertOutput', - 'AlbertModel', - 'FlaxBigBirdLayer', - 'BertGenerationEncoder', - 'VisualBertEncoder', - 'CamembertForMaskedLM', - 'Data2VecAudioAdapterLayer', - 'ImageGPTModel', - 'TFAutoModelForTokenClassification', - 'UniSpeechSatForCTC', - 'Data2VecVisionUperHead', - 'WavLMGroupNormConvLayer', - 'LukeForMaskedLM', - 'IBertEmbeddings', - 'AlbertLayerGroup', - 'FlaxElectraLayerCollection', - 'RobertaForQuestionAnswering', - 'Data2VecAudioFeedForward', - 'FlaxAutoModelForSpeechSeq2Seq', - 'FlaxViTLayer', - 'MobileBertModel', - 'RealmSelfOutput', - 'FlaxRoFormerOutput', - 'SplinterEncoder', - 'OwlViTTextTransformer', - 'LEDForSequenceClassification', - 'MvpEncoderLayer', - 'Data2VecAudioForXVector', - 'FlaxRoFormerForQuestionAnsweringModule', - 'ImageGPTForCausalImageModeling', - 'GLPNAttention', - 'BertLMPredictionHead', - 'AutoModelForAudioXVector', - 'MarianDecoderLayer', - 'SEWDTransformerEncoder', - 'MobileViTSelfOutput', - 'BigBirdPegasusEncoderAttention', - 'XLMRobertaForCausalLM', - 'Data2VecTextAttention', - 'FlaxAlbertLayerCollection', - 'FlaxBertOnlyNSPHead', - 'IBertForSequenceClassification', - 'DetrLoss', - 'Data2VecTextForQuestionAnswering', - 'M2M100SinusoidalPositionalEmbedding', - 'FlaxT5EncoderModule', - 'GLPNOverlapPatchEmbeddings', - 'ViTEncoder', - 'RelPartialLearnableDecoderLayer', - 'ProphetNetNgramSelfAttention', - 'LEDEncoderLayer', - 'RetriBertPreTrainedModel', - 'FlaxBigBirdForCausalLMModule', - 'LevitSubsample', - 'LayoutLMForTokenClassification', - 'LayoutLMv2Layer', - 'YolosHungarianMatcher', - 'PerceiverMultimodalPostprocessor', - 'UniSpeechSatSamePadLayer', - 'FlaxT5ForConditionalGenerationModule', - 'RealmPredictionHeadTransform', - 'Speech2TextModel', - 'Data2VecAudioPadLayer', - 'XLMRobertaXLClassificationHead', - 'DetrForSegmentation', - 'WavLMFeatureExtractor', - 'QDQBertOnlyMLMHead', - 'GPT2Model', - 'RoFormerForCausalLM', - 'TapasSelfAttention', - 'FlaxEncoderDecoderModule', - 'BartEncoder', - 'HubertPositionalConvEmbedding', - 'GroupViTTextModel', - 'ViTPreTrainedModel', - 'Wav2Vec2GroupNormConvLayer', - 'PoolFormerForImageClassification', - 'BartAttention', - 'FlaxViTForImageClassificationModule', - 'LxmertForPreTraining', - 'DebertaV2ForSequenceClassification', - 'SqueezeBertPredictionHeadTransform', - 'MatMulWrapper', - 'LayoutLMv2ForSequenceClassification', - 'DecisionTransformerGPT2Block', - 'FNetForPreTraining', - 'ReformerEmbeddings', - 'MvpClassificationHead', - 'ConvNextLayerNorm', - 'XLNetLMHeadModel', - 'MobileBertEmbeddings', - 'FlaxT5DenseActDense', - 'ConvBertEncoder', - 'CLIPVisionEmbeddings', - 'NezhaOutput', - 'Data2VecVisionModel', - 'FlaxDistilBertLMDecoder', - 'FlaxAlbertSOPHead', - 'FlavaAttention', - 'FlavaSelfAttention', - 'YolosSelfAttention', - 'DeiTOutput', - 'DPTForDepthEstimation', - 'NystromformerEncoder', - 'ViltLayer', - 'Data2VecTextForTextEmbeddings', - 'RoFormerClassificationHead', - 'FFNOutput', - 'QuantEmbedding', - 'Wav2Vec2ConformerForSequenceClassification', - 'PegasusAttention', - 'DetrClassificationHead', - 'MaskFormerSwinAttention', - 'ViTPooler', - 'FlaxGPTNeoForCausalLMModule', - 'PerceiverSelfAttention', - 'PerceiverLayer', - 'DetrHungarianMatcher', - 'BeitIntermediate', - 'DebertaV2Embeddings', - 'FlaxGPT2Attention', - 'DPRPreTrainedModel', - 'WavLMForCTC', - 'NoNorm', - 'LevitForImageClassificationWithTeacher', - 'XLMForTokenClassification', - 'FlaxMBartEncoder', - 'FlaxBigBirdPreTrainingHeads', - 'CvtAttention', - 'LayoutLMv3ClassificationHead', - 'FlaxBigBirdBlockSparseAttention', - 'PegasusForConditionalGeneration', - 'OwlViTTextEmbeddings', - 'RobertaEmbeddings', - 'RegNetPreTrainedModel', - 'MegatronBertForSequenceClassification', - 'UniSpeechFeatureProjection', - 'WavLMPreTrainedModel', - 'ViTMAELayer', - 'FlaxBartForSequenceClassificationModule', - 'StableDropout', - 'RoFormerForSequenceClassification', - 'Wav2Vec2NoLayerNormConvLayer', - 'MobileViTOutput', - 'ProphetNetForCausalLM', - 'FlaxViTEmbeddings', - 'ElectraEncoder', - 'FlaxElectraOutput', - 'FlaxAutoModelForQuestionAnswering', - 'FlaxMBartModule', - 'MegatronBertLMPredictionHead', - 'BertLMHeadModel', - 'BertAttention', - 'MobileBertForSequenceClassification', - 'TapasSelfOutput', - 'VisualBertPooler', - 'LukePreTrainedModel', - 'ModalEmbeddings', - 'DistilBertForMaskedLM', - 'MPNetForQuestionAnswering', - 'HubertLayerNormConvLayer', - 'VisualBertOutput', - 'GPT2Attention', - 'LongT5PreTrainedModel', - 'NezhaPreTrainingHeads', - 'FunnelDecoder', - 'Speech2TextDecoder', - 'SEWPreTrainedModel', - 'GPTNeoModel', - 'QDQBertForTokenClassification', - 'YosoForTokenClassification', - 'NezhaForNextSentencePrediction', - 'SqueezeBertLMPredictionHead', - 'SwinStage', - 'GroupViTAssignAttention', - 'SEWLayerNormConvLayer', - 'XLMRobertaXLForCausalLM', - 'XLMRobertaXLSelfOutput', - 'MishActivation', - 'FlaxAutoModelForPreTraining', - 'ElectraEmbeddings', - 'AlbertPreTrainedModel', - 'BartModel', - 'NystromformerLayer', - 'LongT5DenseActDense', - 'IBertLMHead', - 'XGLMAttention', - 'ConvNextPreTrainedModel', - 'LxmertEncoder', - 'CLIPPreTrainedModel', - 'TFAutoModelForVision2Seq', - 'CanineForQuestionAnswering', - 'FlaxWav2Vec2ForPreTrainingModule', - 'MobileBertForMultipleChoice', - 'ReformerSelfOutput', - 'MLPLayerWithBN', - 'RoFormerSelfOutput', - 'YolosSelfOutput', - 'ElectraForQuestionAnswering', - 'FlaxGPTNeoBlockCollection', - 'ConvActivation', - 'DebertaV2OnlyMLMHead', - 'AlbertSOPHead', - 'TransfoXLLMHeadModel', - 'OwlViTForObjectDetection', - 'VisionEncoderDecoderModel', - 'FNetForQuestionAnswering', - 'BlenderbotSmallDecoderWrapper', - 'ViltModel', - 'FlaxAlbertLayerCollections', - 'FlaxOPTDecoderLayerCollection', - 'ViTMAEForPreTraining', - 'T5DenseGatedActDense', - 'UniSpeechSatGroupNormConvLayer', - 'FlaxBlenderbotSmallEncoder', - 'PerceiverEmbeddings', - 'MT5EncoderModel', - 'CanineAttention', - 'CamembertForSequenceClassification', - 'FlaxOPTAttention', - 'FlaxT5Module', - 'Wav2Vec2EncoderStableLayerNorm', - 'DPTAuxiliaryHead', - 'LxmertCrossAttentionLayer', - 'MCTCTModel', - 'FNetEmbeddings', - 'BigBirdPegasusBlockSparseAttention', - 'FlaxElectraModule', - 'MaskFormerSwinPatchMerging', - 'SEWEncoder', - 'IBertSelfOutput', - 'SplinterForQuestionAnswering', - 'Data2VecVisionPyramidPoolingBlock', - 'MBartDecoderWrapper', - 'ConvBertForTokenClassification', - 'LayoutLMv3ForQuestionAnswering', - 'MarianDecoderWrapper', - 'FunnelForMaskedLM', - 'Data2VecTextIntermediate', - 'LevitStage', - 'SwinPreTrainedModel', - 'FlaxBeitForImageClassificationModule', - 'Data2VecTextForCausalLM', - 'DebertaLayer', - 'Data2VecVisionPatchEmbeddings', - 'XLMModel', - 'Wav2Vec2Adapter', - 'ImageGPTLayerNorm', - 'GPTJPreTrainedModel', - 'BigBirdPegasusDecoder', - 'BeitEmbeddings', - 'LongformerForQuestionAnswering', - 'RoFormerForMultipleChoice', - 'XLMRobertaForQuestionAnswering', - 'XLMRobertaXLForSequenceClassification', - 'LukeOutput', - 'FlaxElectraForSequenceClassificationModule', - 'GLPNSelfOutput', - 'LayoutLMv2Model', - 'FlaxMBartDecoder', - 'FlaxBigBirdForSequenceClassificationModule', - 'FlaxElectraEmbeddings', - 'GroupViTVisionModel', - 'ViTMAEAttention', - 'VanLargeKernelAttention', - 'WavLMEncoderLayerStableLayerNorm', - 'PerceiverEmbeddingDecoder', - 'PoolFormerOutput', - 'FlaxCLIPLayerCollection', - 'BlenderbotSmallDecoderLayer', - 'FlaxLongT5LayerCollection', - 'LongformerIntermediate', - 'DebertaForMaskedLM', - 'NezhaForQuestionAnswering', - 'UniSpeechSatPositionalConvEmbedding', - 'FlaxBlenderbotAttention', - 'Data2VecAudioAttention', - 'SiLogLoss', - 'AlbertEmbeddings', - 'FlavaModel', - 'FlaxMBartAttention', - 'FlaxElectraSequenceSummary', - 'LukeForEntityClassification', - 'FlaxLongT5TransientGlobalAttention', - 'T5LayerSelfAttention', - 'OPTForCausalLM', - 'OwlViTMLP', - 'AutoModelForSemanticSegmentation', - 'FlaxAlbertForTokenClassificationModule', - 'FlaxMarianEncoderLayerCollection', - 'AutoModelForInstanceSegmentation', - 'YosoModel', - 'ConvNextDropPath', - 'WavLMForXVector', - 'Wav2Vec2ConformerPreTrainedModel', - 'BeitForSemanticSegmentation', - 'ConvNextForImageClassification', - 'CvtPreTrainedModel', - 'LEDEncoder', - 'DPTViTOutput', - 'FlaxBeitLayer', - 'LayoutLMv2VisualBackbone', - 'ViTForMaskedImageModeling', - 'FlaxRobertaForCausalLMModule', - 'FlaxRoFormerSelfAttention', - 'ConvDropoutLayerNorm', - '_AutoModelWithLMHead', - 'SwinEncoder', - 'FlaxWav2Vec2LayerNormConvLayer', - 'BeitUperHead', - 'LukeIntermediate', - 'Wav2Vec2ForMaskedLM', - 'ElectraForPreTraining', - 'MCTCTAttention', - 'FlaxBigBirdAttention', - 'LevitConvEmbeddings', - 'FlaxBertIntermediate', - 'MobileViTTransformerLayer', - 'RealmIntermediate', - 'DPTReassembleStage', - 'LongformerLMHead', - 'CTRLForSequenceClassification', - 'XLMRobertaXLForMultipleChoice', - 'M2M100Decoder', - 'CamembertForTokenClassification', - 'LongT5LayerNorm', - 'VisualBertPredictionHeadTransform', - 'MaskFormerSwinSelfOutput', - 'FlaxBigBirdEncoder', - 'FlavaImageCodebook', - 'FlaxRobertaForSequenceClassificationModule', - 'SEWPositionalConvEmbedding', - 'FNetBasicFourierTransform', - 'NezhaModel', - 'LocalSelfAttention', - 'FunnelPreTrainedModel', - 'FlaxRobertaOutput', - 'ProphetNetAttention', - 'ConvBertSelfOutput', - 'FlaxBigBirdOutput', - 'NezhaPooler', - 'AlbertMLMHead', - 'FlaxRobertaIntermediate', - 'BigBirdPegasusPreTrainedModel', - 'ViTMAEDecoder', - 'TransformerFFN', - 'DetrMaskHeadSmallConv', - 'BertIntermediate', - 'Speech2TextPreTrainedModel', - 'UniSpeechSatFeatureEncoder', - 'ConvBertForSequenceClassification', - 'MPNetModel', - 'UniSpeechSatFeedForward', - 'Wav2Vec2ConformerForCTC', - 'TapasEncoder', - 'LxmertAttentionOutput', - 'NystromformerLMPredictionHead', - 'MvpPreTrainedModel', - 'UniSpeechModel', - 'TFAutoModelForSeq2SeqLM', - 'BigBirdPegasusSelfAttention', - 'ElectraClassificationHead', - 'LayoutLMIntermediate', - 'SqueezeBertModel', - 'BertForMaskedLM', - 'FlaxGPT2Module', - 'Data2VecAudioEncoder', - 'Data2VecVisionRelativePositionBias', - 'DetrEncoderLayer', - 'MaskFormerSwinOutput', - 'LayoutLMv2Attention', - 'FlavaOutput', - 'FlavaImageCodebookResPath', - 'QDQBertPreTrainingHeads', - 'FlaxRoFormerLayerCollection', - 'NezhaLMPredictionHead', - 'ReformerAttention', - 'RemBertLayer', - 'DebertaEmbeddings', - 'RagModel', - 'RoFormerModel', - 'FlaxRoFormerEncoder', - 'MegatronBertOnlyMLMHead', - 'FlaubertForQuestionAnsweringSimple', - 'FlaxGPTJAttention', - 'FlaxRoFormerEmbeddings', - 'FlaxT5LayerNorm', - 'FlaxT5DenseGatedActDense', - 'Wav2Vec2ForAudioFrameClassification', - 'FlaxT5LayerSelfAttention', - 'UniSpeechSatLayerNormConvLayer', - 'FlaubertForMultipleChoice', - 'FunnelBaseModel', - 'MaskFormerSwinIntermediate', - 'BlenderbotDecoderWrapper', - 'ViTMAEPreTrainedModel', - 'ViltPreTrainedModel', - 'ElectraGeneratorPredictions', - 'LongformerForMultipleChoice', - 'UniSpeechSatAttention', - 'CTRLPreTrainedModel', - 'TFAutoModelForMaskedLM', - 'Data2VecTextLMHead', - 'RobertaLayer', - 'LongformerForTokenClassification', - 'PoolFormerLayer', - 'BartForSequenceClassification', - 'Wav2Vec2LayerNormConvLayer', - 'Data2VecAudioFeatureEncoder', - 'FlaxCLIPAttention', - 'FlaxElectraSelfOutput', - 'FlaxRobertaLayer', - 'SEWGroupNormConvLayer', - 'LayoutLMv3Layer', - 'NezhaRelativePositionsEncoding', - 'Data2VecTextSelfOutput', - 'YolosEncoder', - 'RoFormerOnlyMLMHead', - 'BigBirdPegasusClassificationHead', - 'CLIPAttention', - 'BigBirdModel', - 'LxmertPreTrainedModel', - 'WavLMFeedForward', - 'UniSpeechAttention', - 'BartPretrainedModel', - 'DeiTPooler', - 'CodeGenMLP', - 'CanineSelfOutput', - 'BertEmbeddings', - 'FlaxMBartClassificationHead', - 'MobileBertForQuestionAnswering', - 'RemBertPredictionHeadTransform', - 'MarianEncoderLayer', - 'FlaxBertPredictionHeadTransform', - 'BigBirdIntermediate', - 'YolosPooler', - 'BigBirdOutput', - 'M2M100ForConditionalGeneration', - 'UniSpeechSatGumbelVectorQuantizer', - 'LxmertVisualAnswerHead', - 'MaskFormerLoss', - 'SqueezeBertPreTrainedModel', - 'FlaxSpeechEncoderDecoderModule', - 'BigBirdForPreTraining', - 'RemBertForSequenceClassification', - 'FlaxLongT5LayerNorm', - 'Wav2Vec2ForPreTraining', - 'FlaxElectraForTokenClassificationModule', - 'PerceiverMultimodalPreprocessor', - 'XLNetPreTrainedModel', - 'BloomMLP', - 'NezhaSelfAttention', - 'BertModel', - 'GPTNeoXModel', - 'BigBirdForMaskedLM', - 'FNetPreTrainingHeads', - 'LongT5LayerCrossAttention', - 'BertForTokenClassification', - 'SEWDForCTC', - 'LevitAttentionSubsample', - 'FlaxBlenderbotSmallDecoderLayer', - 'ViltAttention', - 'DebertaV2SelfOutput', - 'LayoutLMv3PatchEmbeddings', - 'DeiTEncoder', - 'FlaxBlenderbotDecoderLayerCollection', - 'YosoAttention', - 'LayoutLMModel', - 'FlavaMaskedPredictionHead', - 'DebertaV2Encoder', - 'FlaxBigBirdSelfAttention', - 'ConvBertPredictionHeadTransform', - 'FlaxT5Stack', - 'BigBirdPegasusForCausalLM', - 'OwlViTVisionTransformer', - 'MegatronBertForTokenClassification', - 'SEWDModel', - 'BigBirdPegasusEncoderLayer', - 'FlaxRobertaEncoder', - 'XLMForMultipleChoice', - 'RealmAttention', - 'CTRLLMHeadModel', - 'M2M100Encoder', - 'BloomAttention', - 'DPTDepthEstimationHead', - 'WavLMNoLayerNormConvLayer', - 'QDQBertLMHeadModel', - 'DebertaAttention', - 'DecisionTransformerGPT2Attention', - 'BigBirdForQuestionAnsweringHead', - 'FlaxWav2Vec2PositionalConvEmbedding', - 'MvpAttention', - 'VisualBertLMPredictionHead', - 'BigBirdSelfAttention', - 'CodeGenForCausalLM', - 'FlaxBlenderbotSmallAttention', - 'ConvBertAttention', - 'UniSpeechSatNoLayerNormConvLayer', - 'YosoLMPredictionHead', - 'NezhaForMultipleChoice', - 'FlaxRobertaEmbeddings', - 'NystromformerIntermediate', - 'FlaxConvLayersCollection', - 'YosoIntermediate', - 'BertForQuestionAnswering', - 'LayoutLMSelfAttention', - 'SplinterAttention', - 'YolosForObjectDetection', - 'FlaxElectraForQuestionAnsweringModule', - 'LEDModel', - 'DetrDecoder', - 'FlavaPooler', - 'LongT5LocalAttention', - 'YolosPreTrainedModel', - 'ProphetNetModel', - 'FlaxRobertaLMHead', - 'LongT5Block', - 'TapasForMaskedLM', - 'BeitOutput', - 'VisualBertForRegionToPhraseAlignment', - 'LongformerForSequenceClassification', - 'LEDDecoderLayer', - 'AutoModelForObjectDetection', - 'BertSelfAttention', - 'TapasLayer', - 'LayoutLMEncoder', - 'FlaxViTPooler', - 'MultiHeadAttention', - 'UniSpeechEncoderLayerStableLayerNorm', - 'RealmScorer', - 'CausalSelfAttention', - 'RegNetEmbeddings', - 'FlaxAutoModel', - 'CvtIntermediate', - 'MobileViTAttention', - 'XLMRobertaXLLMHead', - 'FlavaMultimodalModel', - 'Wav2Vec2ConformerAdapterLayer', - 'FlaxBigBirdForQuestionAnsweringModule', - 'FlaxBlenderbotEncoderLayerCollection', - 'SqueezeBertSelfAttention', - 'CvtForImageClassification', - 'LayoutLMv2PreTrainedModel', - 'MarianAttention', - 'LayoutLMEmbeddings', - 'BloomModel', - 'Speech2TextEncoderLayer', - 'CvtStage', - 'GPT2ForTokenClassification', - 'MBartForCausalLM', - 'MMBTForClassification', - 'CanineLayer', - 'GLPNPreTrainedModel', - 'LayoutLMv2Output', - 'NezhaForMaskedLM', - 'GPT2PreTrainedModel', - 'PerceiverEncoder', - 'VanLayerScaling', - 'LongformerSelfOutput', - 'OpenAIGPTModel', - 'SEWForSequenceClassification', - 'FlaxBertSelfAttention', - 'DPTNeck', - 'AxialPositionEmbeddings', - 'Data2VecVisionSelfAttention', - 'FlaxTransformer', - 'ConvProjection', - 'DeiTEmbeddings', - 'SegformerMLP', - 'OwlViTVisionModel', - 'BloomBlock', - 'FlaxWav2Vec2FeatureProjection', - 'DPTViTPooler', - 'RoFormerSelfAttention', - 'FlaxOPTModule', - 'ConvBertIntermediate', - 'IBertIntermediate', - 'FlaxFFN', - 'CLIPVisionModel', - 'FlaxBartDecoder', - 'OPTForSequenceClassification', - 'FlaxBlenderbotSmallModule', - 'GroupedLinearLayer', - 'FlaxXGLMDecoderLayerCollection', - 'DPRReader', - 'IBertAttention', - 'MvpForQuestionAnswering', - 'AutoModelForTableQuestionAnswering', - 'FlaxRoFormerModule', - 'FlaxBertForMultipleChoiceModule', - 'DeiTForMaskedImageModeling', - 'LayoutLMLayer', - 'DeiTPatchEmbeddings', - 'FlaxGPTNeoAttention', - 'RealmPooler', - 'RoFormerForMaskedLM', - 'ViltSelfAttention', - 'LevitClassificationLayer', - 'FlaxOPTForCausalLMModule', - 'MaskFormerSwinModel', - 'HubertEncoderLayer', - 'Data2VecAudioPositionalConvEmbedding', - 'IBertLayer', - 'SwinOutput', - 'DebertaV2ForMaskedLM', - 'GPTNeoAttention', - 'GLPNEncoder', - 'BeitSelfAttention', - 'DebertaV2Output', - 'YosoSelfAttention', - 'FlaubertForTokenClassification', - 'RobertaForMultipleChoice', - 'GLPNMixFFN', - 'LongT5Model', - 'NystromformerSelfOutput', - 'NystromformerPredictionHeadTransform', - 'TrOCRSinusoidalPositionalEmbedding', - 'VanMlpLayer', - 'RemBertModel', - 'DebertaLayerNorm', - 'LEDEncoderAttention', - 'FlaxMBartDecoderLayerCollection', - 'TFAutoModelForMaskedImageModeling', - 'FlaxBlenderbotEncoder', - 'SEWDLayerNormConvLayer', - 'ReformerLayer', - 'FlaxBigBirdOnlyMLMHead', - 'LayoutLMv3TextEmbeddings', - 'ReformerEncoder', - 'FlaxBigBirdClassificationHead', - 'SegformerDropPath', - 'RobertaClassificationHead', - 'FlaxBlenderbotModule', - 'WavLMSamePadLayer', - 'FlaxRoFormerIntermediate', - 'RobertaAttention', - 'FlaxCLIPVisionTransformer', - 'FlaxT5BlockCollection', - 'VanLargeKernelAttentionLayer', - 'DebertaV2ForMultipleChoice', - 'RealmOnlyMLMHead', - 'UniSpeechForCTC', - 'DPRContextEncoder', - 'FlaxBertForQuestionAnsweringModule', - 'YosoClassificationHead', - 'LayoutLMOutput', - 'Data2VecVisionConvModule', - 'FunnelEmbeddings', - 'VisualBertPreTrainingHeads', - 'RobertaLMHead', - 'DPRPretrainedContextEncoder', - 'FlaxElectraDiscriminatorPredictions', - 'XLNetForTokenClassification', - 'LxmertPreTrainingHeads', - 'MobileViTASPPPooling', - 'MPNetAttention', - 'BeitFCNHead', - 'BigBirdLayer', - 'Data2VecVisionPreTrainedModel', - 'MobileBertPreTrainedModel', - 'Wav2Vec2Encoder', - 'DPRPretrainedReader', - 'NystromformerForMultipleChoice', - 'VisionTextDualEncoderModel', - 'QDQBertOnlyNSPHead', - 'PLBartEncoderLayer', - 'BeitDropPath', - 'VanDropPath', - 'SplinterPreTrainedModel', - 'FlaxBigBirdPredictionHeadTransform', - 'XLMProphetNetForCausalLM', - 'FlaxMarianEncoderLayer', - 'TrajectoryTransformerModel', - 'ProjectedAdaptiveLogSoftmax', - 'BigBirdPegasusDecoderAttention', - 'RemBertPreTrainedModel', - 'FlaxBigBirdSelfOutput', - 'FlaxCLIPModule', - 'RoFormerLayer', - 'TFAutoModelForPreTraining', - 'EntityPredictionHeadTransform', - 'RealmLMPredictionHead', - 'FlaxWav2Vec2Adapter', - 'MobileViTEncoder', - 'MaskFormerSwinSelfAttention', - 'SwinPatchEmbeddings', - 'BertOnlyMLMHead', - 'SqueezeBertForTokenClassification', - 'FlavaImageModel', - 'CaninePooler', - 'PretrainedBartModel', - 'Wav2Vec2EncoderLayer', - 'MobileBertPreTrainingHeads', - 'PLBartAttention', - 'SEWDAttention', - 'RegNetModel', - 'ConvNextModel', - 'RobertaForCausalLM', - 'SegformerMixFFN', - 'BeitEncoder', - 'FlaxBertEncoder', - 'Wav2Vec2ConformerGroupNormConvLayer', - 'ImageGPTForImageClassification', - 'Speech2Text2DecoderLayer', - 'BlenderbotForCausalLM', - 'ElectraLayer', - 'ContextPooler', - 'SqueezeBertEmbeddings', - 'XLNetLayer', - 'FlaxRobertaPooler', - 'Wav2Vec2ConformerFeedForward', - 'ImageGPTBlock', - 'CLIPVisionTransformer', - 'NezhaOnlyNSPHead', - 'AutoModelForAudioFrameClassification', - 'MegatronBertOnlyNSPHead', - 'SEWDNoLayerNormConvLayer', - 'FlaxLongT5LayerFF', - 'FlaxRoFormerForSequenceClassificationModule', - 'MvpForConditionalGeneration', - 'FakeRegNetVisslWrapper', - 'FlaxTransformerEncoder', - 'Wav2Vec2ForSequenceClassification', - 'FlaxMarianAttention', - 'FlaxWav2Vec2Module', - 'MobileBertOnlyMLMHead', - 'SwinSelfAttention', - 'ReformerOnlyLMHead', - 'MBartForConditionalGeneration', - 'ElectraDiscriminatorPredictions', - 'DistilBertForTokenClassification', - 'XLMForQuestionAnsweringSimple', - 'HubertAttention', - 'MobileViTForSemanticSegmentation', - 'RobertaForMaskedLM', - 'QDQBertAttention', - 'AutoModelForMaskedImageModeling', - 'FlaxGPTJBlockCollection', - 'MPNetLMHead', - 'T5PreTrainedModel', - 'SEWDGroupNormConvLayer', - 'BertPreTrainedModel', - 'MPNetIntermediate', - 'ViltIntermediate', - 'PerceiverOneHotPreprocessor', - 'BlenderbotModel', - 'DebertaV2Model', - 'UniSpeechNoLayerNormConvLayer', - 'DetrForObjectDetection', - 'FlaxAutoModelForTokenClassification', - 'QDQBertForSequenceClassification', - 'PerceiverAbstractDecoder', - 'BlenderbotForConditionalGeneration', - 'Data2VecVisionSelfOutput', - 'SwinAttention', - 'RealmScorerProjection', - 'FlaxViTEncoder', - 'Data2VecTextForMaskedLM', - 'DebertaV2ForQuestionAnswering', - 'GPT2LMHeadModel', - 'VanEncoder', - 'FlaxAlbertLayer', - 'FlaxMarianDecoderLayerCollection', - 'T5Model', - 'OPTModel', - 'FlaxAutoModelForSeq2SeqLM', - 'DistilBertModel', - 'XLMProphetNetEncoder', - 'DistilBertForQuestionAnswering', - 'Bottleneck', - 'Wav2Vec2FeatureProjection', - 'UniSpeechSatEncoderLayer', - 'RemBertForMultipleChoice', - 'Wav2Vec2ConformerLayerNormConvLayer', - 'FlaxRoFormerAttention', - 'HubertModel', - 'FlaxBeitAttention', - 'FlaxWav2Vec2AdapterLayersCollection', - 'FlaxMBartForConditionalGenerationModule', - 'BloomForCausalLM', - 'GPTNeoSelfAttention', - 'HubertEncoderStableLayerNorm', - 'FlaxDistilBertForMultipleChoiceModule', - 'TrOCRDecoder', - 'FlavaITMHead', - 'ResNetEmbeddings', - 'LayoutLMLMPredictionHead', - 'DetrConvModel', - 'ProphetNetEncoder', - 'FlaxAlbertForSequenceClassificationModule', - 'GroupViTTextEmbeddings', - 'BlenderbotEncoder', - 'BertEncoder', - 'FlavaPredictionHeadTransform', - 'MvpEncoder', - 'XLNetFeedForward', - 'LEDClassificationHead', - 'RoFormerAttention', - 'Wav2Vec2Model', - 'FlaxConv1D', - 'Data2VecAudioFeatureProjection', - 'MBartDecoder', - 'FlaxBertLayerCollection', - 'OpenAIGPTDoubleHeadsModel', - 'FlavaPreTrainedModel', - 'Data2VecTextForMultipleChoice', - 'GroupViTMixerMLP', - 'NezhaForTokenClassification', - 'FlaxMarianModule', - 'FlaxCLIPTextModule', - 'MarianMTModel', - 'FlaxViTModule', - 'ConvNextStage', - 'VanSpatialAttentionLayer', - 'TrOCRPreTrainedModel', - 'FlaxAlbertOnlyMLMHead', - 'RoFormerEmbeddings', - 'AlbertForQuestionAnswering', - 'M2M100Attention', - 'ProphetNetPreTrainedModel', - 'GroupViTVisionTransformer', - 'FlaxBertLMPredictionHead', - 'FlaxElectraForMaskedLMModule', - 'QuestionAwareSpanSelectionHead', - 'FlaxLongT5Stack', - 'FlaxXGLMAttention', - 'VisualBertForMultipleChoice', - 'BigBirdSelfOutput', - 'Data2VecAudioConvLayer', - 'LongformerEmbeddings', - 'LukePooler', - 'FlaxBlenderbotForConditionalGenerationModule', - 'Wav2Vec2EncoderLayerStableLayerNorm', - 'XLMRobertaXLAttention', - 'PositionEmbeddings', - 'EncoderLayer', - 'LongformerPreTrainedModel', - 'XLMWithLMHeadModel', - 'ViTMAESelfOutput', - 'SqueezeBertEncoder', - 'MCTCTConv1dSubsampler', - 'BeitPreTrainedModel', - 'DPRPretrainedQuestionEncoder', - 'PoolerStartLogits', - 'QDQBertForMultipleChoice', - 'BigBirdPegasusEncoder', - 'MaskFormerFPNConvLayer', - 'FNetOutput', - 'SqueezeBertModule', - 'HubertFeatureProjection', - 'TrOCRDecoderLayer', - 'RealmSelfAttention', - 'MCTCTEmbeddings', - 'MobileBertPredictionHeadTransform', - 'RobertaSelfAttention', - 'DisentangledSelfAttention', - 'AutoModelForPreTraining', - 'LxmertXLayer', - 'VisualBertIntermediate', - 'BertForMultipleChoice', - 'PerceiverFourierPositionEncoding', - 'HubertPreTrainedModel', - 'M2M100PreTrainedModel', - 'GroupViTTextTransformer', - 'LxmertVisualFeatureEncoder', - 'IBertEncoder', - 'ViltEncoder', - 'PerceiverForMaskedLM', - 'BlenderbotSmallEncoderLayer', - 'FlaxElectraForMultipleChoiceModule', - 'TFAutoModelForSequenceClassification', - 'PatchEmbeddings', - 'VisualBertForPreTraining', - 'FlaxBertModule', - 'FlaxBertAttention', - 'XLMPreTrainedModel', - 'LevitEncoder', - 'FlaxMBartEncoderLayerCollection', - 'FlaxWav2Vec2FeatureEncoder', - 'SplinterEmbeddings', - 'SEWDUpsampling', - 'DPTPreActResidualLayer', - 'DebertaOnlyMLMHead', - 'FlaxAutoModelForSequenceClassification', - 'BeitPyramidPoolingModule', - 'LukeLayer', - 'QDQBertForNextSentencePrediction', - 'GPTNeoXPreTrainedModel', - 'TransformerBlock', - 'DebertaV2ForTokenClassification', - 'ConvBertModel', - 'SEWNoLayerNormConvLayer', - 'BartClassificationHead', - 'MegatronBertAttention', - 'DeiTModel', - 'SplinterSelfOutput', - 'AlbertTransformer', - 'TapasOnlyMLMHead', - 'BertForPreTraining', - 'FlaxRoFormerForTokenClassificationModule', - 'BigBirdEmbeddings', - 'SwinModel', - 'FlaxBertForNextSentencePredictionModule', - 'RoFormerPredictionHeadTransform', - 'SEWDFeatureEncoder', - 'GeLU', - 'FNetFourierTransform', - 'DecoderLayer', - 'FlaxBeitRelativePositionBias', - 'YosoOutput', - 'LevitMLPLayer', - 'UniSpeechGumbelVectorQuantizer', - 'ViltForImageAndTextRetrieval', - 'AbstractPreprocessor', - 'LongT5LayerTransientGlobalSelfAttention', - 'MvpDecoderLayer', - 'LayoutLMv3Intermediate', - 'LongT5Stack', - 'BlenderbotSmallDecoder', - 'BigBirdForTokenClassification', - 'FlaxBartEncoderLayer', - 'DetrAttention', - 'FlaxXGLMForCausalLMModule', - 'SegformerDecodeHead', - 'NezhaEncoder', - 'XLMRobertaXLForTokenClassification', - 'MMBTModel', - 'UniSpeechEncoderStableLayerNorm', - 'FunnelForMultipleChoice', - 'ConvBertLayer', - 'FNetOnlyNSPHead', - 'RobertaModel', - 'ViltForQuestionAnswering', - 'FlaxBeitForMaskedImageModelingModule', - 'Wav2Vec2ConformerFeatureEncoder', - 'BartDecoderWrapper', - 'BigBirdPegasusDecoderWrapper', - 'PoolFormerPooling', - 'PoolFormerFinalPooler', - 'CvtOutput', - 'YolosAttention', - 'FunnelForPreTraining', - 'PLBartPreTrainedModel', - 'DPREncoder', - 'FSMTEncoder', - 'FlaxEmbeddings', - 'FlaxAlbertForQuestionAnsweringModule', - 'DistilBertPreTrainedModel', - 'LEDEncoderSelfAttention', - 'ReformerFeedForwardDense', - 'PLBartForCausalLM', - 'FlaxGPTNeoSelfAttention', - 'OwlViTPreTrainedModel', - 'SEWSamePadLayer', - 'MobileViTIntermediate', - 'Data2VecTextPreTrainedModel', - 'QuantAct', - 'FlaxRoFormerLMPredictionHead', - 'PerceiverTrainablePositionEncoding', - 'DebertaV2LMPredictionHead', - 'TapasLMPredictionHead', - 'BlenderbotSmallModel', - 'DPTViTAttention', - 'FlaxGPTNeoModule', - 'LxmertAttention', - 'NystromformerOnlyMLMHead', - 'CanineLMPredictionHead', - 'FlaxMarianDecoderLayer', - 'CodeGenAttention', - 'PositionwiseFF', - 'FlavaTextModel', - 'FunnelForTokenClassification', - 'ViltForMaskedLM', - 'FlaxBertForCausalLMModule', - 'BlenderbotAttention', - 'Wav2Vec2AdapterLayer', - 'PegasusEncoderLayer', - 'MaskFormerSwinEmbeddings', - 'RagTokenForGeneration', - 'DebertaPredictionHeadTransform', - 'BottleneckLayer', - 'SegformerDWConv', - 'TrOCRAttention', - 'FlaxMultiHeadSelfAttention', - 'WavLMFeatureProjection', - 'DeiTIntermediate', - 'Data2VecTextModel', - 'AutoModelForSequenceClassification', - 'CamembertModel', - 'LayoutLMv3SelfAttention', - 'MaskFormerHungarianMatcher', - 'MCTCTPreTrainedModel', - 'Speech2Text2PreTrainedModel', - 'BeitRelativePositionBias', - 'CLIPEncoder', - 'QDQBertSelfOutput', - 'Data2VecVisionPyramidPoolingModule', - 'ElectraForSequenceClassification', - 'ViTModel', - 'FlaxWav2Vec2FeedForward', - 'FlaxAlbertForMaskedLMModule', - 'PerceiverOpticalFlowDecoder', - 'PerceiverForSequenceClassification', - 'FlaxElectraLayer', - 'PoolerAnswerClass', - 'FlaxViTSelfOutput', - 'LongformerPooler', - 'BigBirdPegasusForQuestionAnswering', - 'QDQBertSelfAttention', - 'MBartClassificationHead', - 'NystromformerAttention', - 'Wav2Vec2ConformerForAudioFrameClassification', - 'SegformerEncoder', - 'MCTCTForCTC', - 'FlaxWav2Vec2ForCTCModule', - 'SEWForCTC', - 'RemBertPooler', - 'DecisionTransformerModel', - 'FlaxAutoModelForNextSentencePrediction', - 'Identity', - 'DPTReassembleLayer', - 'LayoutLMv2SelfAttention', - 'ViTMAEEncoder', - 'Wav2Vec2ForXVector', - 'MaskFormerPixelLevelModule', - 'ConvNextEncoder', - 'Data2VecAudioModel', - 'MegatronBertForCausalLM', - 'GroupViTTextEncoder', - 'Data2VecVisionFCNHead', - 'ConvNextEmbeddings', - 'BertGenerationDecoder', - 'QDQBertIntermediate', - 'FlavaGlobalContrastiveHead', - 'ReformerForQuestionAnswering', - 'GPTJMLP', - 'LayoutLMv2ForQuestionAnswering', - 'Wav2Vec2ConformerEncoder', - 'ReformerModel', - 'FlaxRoFormerClassificationHead', - 'IBertPreTrainedModel', - 'FlaxPegasusEncoderLayer', - 'Wav2Vec2ConformerSamePadLayer', - 'ElectraForTokenClassification', - 'MvpForSequenceClassification', - 'BigBirdLMPredictionHead', - 'FlaxLongT5LocalAttention', - 'ElectraOutput', - 'OwlViTClassPredictionHead', - 'Wav2Vec2ConformerSelfAttention', - 'FunnelDiscriminatorPredictions', - 'VanPreTrainedModel', - 'BeitForMaskedImageModeling', - 'LongT5EncoderModel', - 'BlenderbotSmallPreTrainedModel', - 'PerceiverProjectionDecoder', - 'RobertaIntermediate', - 'TFAutoModelForSemanticSegmentation', - 'GPT2MLP', - 'MegatronBertLayer', - 'FlaxT5Attention', - 'MaskFormerForInstanceSegmentation', - 'MPNetLayer', - 'FlaxMarianDecoder', - 'Wav2Vec2ConformerAdapter', - 'AMSoftmaxLoss', - 'FlaxRobertaForTokenClassificationModule', - 'DebertaV2Intermediate', - 'FlaxBertForSequenceClassificationModule', - 'DetrPreTrainedModel', - 'QuickGELUActivation', - 'SiLUActivation', - 'PLBartDecoderLayer', - 'BeitLayer', - 'TapasEmbeddings', - 'RealmOutput', - 'MobileViTMobileNetLayer', - 'DeiTLayer', - 'DeiTPreTrainedModel', - 'DebertaSelfOutput', - 'NezhaIntermediate', - 'XGLMDecoderLayer', - 'Speech2TextEncoder', - 'XLMRobertaXLEncoder', - 'FlaxRobertaModule', - 'UniSpeechLayerNormConvLayer', - 'MarianDecoder', - 'YosoLayer', - 'BertForSequenceClassification', - 'RealmBertModel', - 'XLMRobertaXLModel', - 'DebertaV2PredictionHeadTransform', - 'FFNLayer', - 'TapasIntermediate', - 'SwinLayer', - 'MobileViTDeepLabV3', - 'RemBertSelfAttention', - 'FunnelEncoder', - 'QDQBertEmbeddings', - 'RemBertForCausalLM', - 'MegatronBertForQuestionAnswering', - 'WavLMEncoder', - 'CamembertForMultipleChoice', - 'Data2VecVisionPooler', - 'SqueezeBertOnlyMLMHead', - 'YosoOnlyMLMHead', - 'BlenderbotPreTrainedModel', - 'CLIPModel', - 'Wav2Vec2ConformerForXVector', - 'GPT2Block', - 'Wav2Vec2FeatureEncoder', - 'SplinterForPreTraining', - 'ProphetNetDecoderLayer', - 'GroupViTMLP', - 'FlaxBartEncoderLayerCollection', - 'FlaxBlenderbotSmallEncoderLayerCollection', - 'BloomPreTrainedModel', - 'GLPNEfficientSelfAttention', - 'MobileViTTransformer', - 'NezhaPredictionHeadTransform', - 'OwlViTTextModel', - 'XLMRobertaXLForQuestionAnswering', - 'UniSpeechFeatureExtractor', - 'FlaxElectraSelfAttention', - 'AutoModelForMaskedLM', - 'UniSpeechForPreTraining', - 'FlaxBeitPooler', - 'XGLMForCausalLM', - 'TapasForQuestionAnswering', - 'FlaxRoFormerOnlyMLMHead', - 'CharactersToMolecules', - 'FlaxWav2Vec2StableLayerNormEncoder', - 'WavLMFeatureEncoder', - 'AutoModelForSpeechSeq2Seq', - 'BigBirdForCausalLM', - 'PerceiverForImageClassificationLearned', - 'GPTNeoBlock', - 'FlaxWav2Vec2AdapterLayer', - 'ReformerModelWithLMHead', - 'GroupViTCrossAttentionLayer', - 'DPTViTSelfAttention', - 'NezhaEmbeddings', - 'ViltOutput', - 'MPNetEncoder', - 'LEDPreTrainedModel', - 'BigBirdPegasusForConditionalGeneration', - 'PerceiverBasicVideoAutoencodingDecoder', - 'Data2VecAudioEncoderLayer', - 'OPTDecoder', - 'FlaxPegasusDecoderLayerCollection', - 'ViTAttention', - 'CaninePredictionHeadTransform', - 'PLBartEncoder', - 'DeiTForImageClassification', - 'FlaxBartDecoderLayerCollection', - 'QuantLinear', - 'DPTForSemanticSegmentation', - 'Data2VecVisionAttention', - 'MobileBertOnlyNSPHead', - 'MobileBertLayer', - 'PoolFormerEncoder', - 'DecisionTransformerGPT2MLP', - 'ConvBertForMultipleChoice', - 'WavLMLayerNormConvLayer', - 'YosoForQuestionAnswering', - 'FlaxBigBirdLayerCollection', - 'AlbertLayer', - 'Data2VecTextSelfAttention', - 'NystromformerModel', - 'UniSpeechSatEncoderStableLayerNorm', - 'ViTPatchEmbeddings', - 'MaskFormerSinePositionEmbedding', - 'LayoutLMPredictionHeadTransform', - 'Wav2Vec2SamePadLayer', - 'FlaxLongT5Block', - 'FlaxGPTJMLP', - 'AutoModelForMultipleChoice', - 'MaskFormerSwinTransformerBackbone', - 'SplinterFullyConnectedLayer', - 'Data2VecAudioForSequenceClassification', - 'MvpPrompt', - 'LxmertOutput', - 'MegatronBertForMultipleChoice', - 'Data2VecTextForTokenClassification', - 'LevitResidualLayer', - 'PLBartDecoder', - 'VanModel', - 'RegNetForImageClassification', - 'LxmertVisualObjHead', - 'ElectraPreTrainedModel', - 'MT5ForConditionalGeneration', - 'LayoutLMPreTrainedModel', - 'FlaxBeitPatchEmbeddings', - 'GLPNDecoderStage', - 'GroupViTModel', - 'AutoModelForCausalLM', - 'SEWDForSequenceClassification', - 'UniSpeechPreTrainedModel', - 'MegatronBertSelfOutput', - 'MCTCTOutput', - 'FNetForSequenceClassification', - 'RoFormerEncoder', - 'TDNNLayer', - 'IBertPooler', - 'TFAutoModelForQuestionAnswering', - 'PLBartDecoderWrapper', - 'OpenAIGPTForSequenceClassification', - 'VisualBertSelfAttention', - 'PLBartClassificationHead', - 'FlaxWav2Vec2EncoderLayerStableLayerNormCollection', - 'BeitModel', - 'Wav2Vec2ConformerConvolutionModule', - 'FlaxRoFormerForMultipleChoiceModule', - 'Wav2Vec2ConformerRelPositionalEmbedding', - 'BigBirdOnlyNSPHead', - 'SEWFeatureEncoder', - 'UniSpeechGroupNormConvLayer', - 'MobileBertLMPredictionHead', - 'Speech2TextDecoderLayer', - 'LayoutLMv3ForTokenClassification', - 'FlaxGPT2Block', - 'MCTCTSelfOutput', - 'UniSpeechSatForAudioFrameClassification', - 'SEWDOutput', - 'HubertForSequenceClassification', - 'MultiHeadSelfAttention', - 'TFAutoModelForMultipleChoice', - 'FlaxVisionEncoderDecoderModule', - 'DetrSinePositionEmbedding', - 'FlaubertForQuestionAnswering', - 'RemBertEncoder', - 'Wav2Vec2GumbelVectorQuantizer', - 'LevitPreTrainedModel', - 'FunnelLayer', - 'ViTMAEEmbeddings', - 'MvpForCausalLM', - 'GPTNeoXAttention', - 'ViltSelfOutput', - 'FlaxCLIPEncoderLayer', - 'LukeEmbeddings', - 'T5LayerNorm', - 'AutoModelForVisualQuestionAnswering', - 'CanineForMultipleChoice', - 'ImageGPTAttention', - 'FlaxViTIntermediate', - 'PerceiverBasicDecoder', - 'RobertaForTokenClassification', - 'XLMForSequenceClassification', - 'DeiTSelfAttention', - 'ViTMAEPatchEmbeddings', - 'WavLMEncoderLayer', - 'SegformerPreTrainedModel', - 'MBartEncoderLayer', - 'FunnelClassificationHead', - 'BertGenerationOnlyLMHead', - 'Wav2Vec2ConformerEncoderLayer', - 'Attention', - 'LayoutLMv3Encoder', - 'Data2VecAudioForCTC', - 'NezhaLayer' - ] diff --git a/neural_coder/interface.py b/neural_coder/interface.py deleted file mode 100644 index a024cde58bb..00000000000 --- a/neural_coder/interface.py +++ /dev/null @@ -1,1345 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import logging -import os -import re -import subprocess -import time - -import yaml - -from . import globals - -if not os.path.exists("neural_coder_workspace"): - os.makedirs("neural_coder_workspace") - - -def detect_device_(logger): - # device detection - logger.info("Device detection started ...") - from .utils.device import detect_device - - detect_device() - if globals.device == "cpu_with_amx": - logger.info("Device: CPU with AMX") - elif globals.device == "cpu_without_amx": - logger.info("Device: CPU without AMX") - elif globals.device == "intel_gpu": - logger.info("Device: Intel(R) GPU") - elif globals.device == "cuda": - logger.info("Device: CUDA") - elif globals.device == "mutli": - logger.info("Device: Multi-Device") - - -def enable( - code, - features, - target_batch_size=1, # effective for feature "pytorch_change_batch_size" - num_benchmark_iteration=10, # effective for feature "pytorch_benchmark" - generate_patch=True, - overwrite=False, - save_patch_path="", - patch_suffix=".diff", - remove_copy=True, - consider_imports=False, - patch_imports=False, - logging_level="info", - run_bench=False, - entry_code="", - args="", - mode="throughput", - cpu_set_env=True, - ncore_per_instance=-1, # only for "self_defined" mode - ninstances=-1, # only for "self_defined" mode - bench_batch_size=-1, # only for "self_defined" mode - test_code_line=False, # print code line info for debug use - cache_load_transformers=True, - optimum_quant_config="", # only for HF optimum optimizations, yaml or hub path - use_inc=True, - use_modular=False, - modular_item="", -): - """Enable a feature or a couple of features for the code.""" - - ### Preparation - - # set up workspace - ws_path = "neural_coder_workspace/" + "enable" + str(time.time()).replace(".", "") + "/" - os.makedirs(ws_path) - - # user parameters - globals.consider_imports = consider_imports - logging_var = "logging." + logging_level.upper() - globals.logging_level = eval(logging_var) - - # set up logging - logger = logging.getLogger(ws_path) - logger.setLevel(globals.logging_level) - formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s: - %(message)s", datefmt="%Y-%m-%d %H:%M:%S") - - fh = logging.FileHandler(ws_path + "enable.log") - fh.setLevel(globals.logging_level) - fh.setFormatter(formatter) - ch = logging.StreamHandler() - ch.setLevel(globals.logging_level) - ch.setFormatter(formatter) - - logger.addHandler(fh) - logger.addHandler(ch) - - # device detection - detect_device_(logger) - - # print key inputs - logger.info("Enabling started ...") - logger.info(f"code: {code}") - logger.info(f"features: {features}") - - # feature list for reference - """ - feature_list = [ - "pytorch_jit_script", - "pytorch_jit_script_ofi", - "pytorch_jit_trace", - "pytorch_jit_trace_ofi", - "pytorch_inc_dynamic_quant", - "pytorch_inc_static_quant_fx", - "pytorch_inc_static_quant_ipex", - "pytorch_inc_static_quant_ipex_xpu", - "pytorch_inc_bf16", - "pytorch_inc_huggingface_optimum_static", - "pytorch_inc_huggingface_optimum_dynamic", - "pytorch_ipex_fp32", - "pytorch_ipex_bf16", - "pytorch_ipex_int8_static_quant", - "pytorch_ipex_int8_dynamic_quant", - "pytorch_channels_last", - "pytorch_mixed_precision_cpu", - "pytorch_mixed_precision_cuda", - "pytorch_torchdynamo_jit_script", - "pytorch_torchdynamo_jit_script_ofi", - "pytorch_torchdynamo_jit_trace", - "pytorch_torchdynamo_jit_trace_ofi", - "pytorch_torch_profiler", - "pytorch_benchmark", - "pytorch_change_batch_size", - "pytorch_cuda_to_cpu", - "pytorch_lightning_bf16_cpu", - "pytorch_aliblade", - "tensorflow_amp", - "keras_amp", - "tensorflow_inc", - "keras_inc", - "onnx_inc_static_quant_qlinear", - "onnx_inc_static_quant_qdq", - "onnx_inc_dynamic_quant", - "inc_auto", - ] - """ - - ### Enable Benchmark (if run_bench) - - if run_bench: - # add "pytorch_change_batch_size" to features - from .utils.cpu_info import get_num_cpu_cores - - ncores = get_num_cpu_cores() - if mode == "throughput": - target_batch_size = 2 * ncores - elif mode == "multi_instance": - target_batch_size = 1 - elif mode == "latency": - target_batch_size = 1 - elif mode == "self_defined": - target_batch_size = bench_batch_size - - if "pytorch_change_batch_size" not in features: - features.append("pytorch_change_batch_size") - - # add "pytorch_benchmark" to features - if "pytorch_benchmark" not in features: - features.append("pytorch_benchmark") - - logger.info(f"Will perform benchmark on [{mode}] mode with batch size [{target_batch_size}] ...") - - #### Feature Enabling - - globals.num_benchmark_iteration = str(num_benchmark_iteration + 10) # 10: warmup iteration number - - globals.cache_load_transformers = cache_load_transformers - globals.optimum_quant_config = optimum_quant_config - - globals.use_modular = use_modular - globals.modular_item = modular_item - - # move "pytorch_benchmark" to the last - from .utils.common import move_element_to_last - - features = move_element_to_last(features, "pytorch_benchmark") - - # not in harness scope - features_outside_harness = [ - "pytorch_change_batch_size", - "pytorch_cuda_to_cpu", - "pytorch_lightning_bf16_cpu", - "tensorflow_mixed_precision", - "tensorflow_inc", - "change_trainer_to_nlptrainer", - ] - - # # features that need creating dummy dataloader (when needed) first - # if "pytorch_inc_static_quant_fx" in features or \ - # "pytorch_inc_static_quant_ipex" in features: - # features = ["pytorch_dummy_dataloader"] + features - - # features that need reclaiming inputs first (e.g. for "for step, inputs in enumerate(dataloader)") - if ( - "pytorch_jit_trace" in features - or "pytorch_jit_trace_ofi" in features - or "pytorch_inc_static_quant_fx" in features - or "pytorch_inc_static_quant_ipex" in features - or "pytorch_inc_static_quant_ipex_xpu" in features - ): - features = ["pytorch_reclaim_inputs"] + features - - # intel_extension_for_transformers - if "intel_extension_for_transformers" in features: - features = ["change_trainer_to_nlptrainer"] + features - - transformed_list_code_path = [] - - ## Determine Code Domain - # reset globals - globals.reset_globals() - - from .utils import handle_user_input - - globals.list_code_path, num_user_code_path = handle_user_input.get_all_code_path(code) - - from .coders.autoinc import domain - - code_domain = domain.determine_domain(globals.list_code_path[0]) - if code_domain == "transformers_trainer": - if "pytorch_benchmark" in features: - features = ["pytorch_reclaim_inference_transformers_trainer"] + features - # for BS - args += " --per_device_eval_batch_size " + str(target_batch_size) - globals.batch_size_changed = True - - ## Feature Transformation - for idx_feature, feature in enumerate(features): - # "inc_auto" auto selection of feature according to fwk - if feature == "inc_auto": - from .coders.autoinc import domain - - code_domain = domain.determine_domain(globals.list_code_path[0]) - if code_domain == "keras_script": - feature = "keras_inc" - elif code_domain == "tensorflow_keras_model": - feature = "tensorflow_inc" - elif code_domain == "onnx": - feature = "onnx_inc_dynamic_quant" - else: - feature = "pytorch_inc_dynamic_quant" - - # reset globals - globals.reset_globals() - - from .utils import handle_user_input - - globals.list_code_path, num_user_code_path = handle_user_input.get_all_code_path(code) - if len(transformed_list_code_path) > 0: - globals.list_code_path = transformed_list_code_path - - # common for all features (transformations), - list_transformed_code = [] - # in this list, each item stores the transformed code - # of the corresponding original code - # by the order in code_path - - # global behaviors - logger.info(f"Performing code transformation for feature: [{feature}] ...") - - for i in globals.list_code_path: - list_transformed_code.append(open(i, "r").read()) - - ## 1. Features in Harness Scope - if feature not in features_outside_harness: - from .coders.transform import execute_indent_transformation, execute_insert_transformation - from .graphers.code_line import register_code_line - from .graphers.function import register_func_wrap_pair - from .graphers.model import register_nnModule_class, register_nnModule_instance_definition - - # code analysis (call graph, type inference etc) - register_code_line() - register_func_wrap_pair() - register_nnModule_class() - if cache_load_transformers: - preload_file = open(os.path.dirname(__file__) + "/graphers/preloads/" + "transformers" + ".yaml") - preload_dict = yaml.load(preload_file, Loader=yaml.BaseLoader) - globals.list_class_name += preload_dict["class"] - register_nnModule_instance_definition() - # register transformation - if ( - feature == "pytorch_dummy_dataloader" - ): # is not in harness scope, but needs call graph and type inference - from .coders.pytorch.dummy_dataloader import DummyDataLoader - - opt = DummyDataLoader(globals.list_model_def_instance) - opt.register_transformation() - elif feature == "pytorch_reclaim_inputs": - from .coders.pytorch.reclaim_inputs import ReclaimInputs - - opt = ReclaimInputs(globals.list_model_def_instance) - opt.register_transformation() - elif feature == "pytorch_reclaim_inference_transformers_trainer": - from .coders.pytorch.reclaim_inference_transformers_trainer import ReclaimInferenceTransformersTrainer - - opt = ReclaimInferenceTransformersTrainer(globals.list_model_def_instance) - opt.register_transformation() - elif feature in [ - "pytorch_inc_dynamic_quant", - "pytorch_inc_static_quant_fx", - "pytorch_inc_static_quant_ipex", - "pytorch_inc_static_quant_ipex_xpu", - "pytorch_inc_huggingface_optimum_static", - "pytorch_inc_huggingface_optimum_dynamic", - "onnx_inc_static_quant_qlinear", - "onnx_inc_static_quant_qdq", - "onnx_inc_dynamic_quant", - "intel_extension_for_transformers", - ]: - # determine domain - from .coders.autoinc.domain import determine_domain - - globals.code_domain = determine_domain(globals.list_code_path[0]) - - # for transformers code, enable optimum-intel api by default - # if specify use_inc, then still use INC API - if "transformers" in globals.code_domain and not use_inc: - if "static_quant" in feature: - feature = "pytorch_inc_huggingface_optimum_static" - elif "dynamic_quant" in feature: - feature = "pytorch_inc_huggingface_optimum_dynamic" - - # optimum-intel quantization config for static and dynamic - if feature == "pytorch_inc_huggingface_optimum_static": - globals.optimum_quant_config = "quantization/quant_config_static" - elif feature == "pytorch_inc_huggingface_optimum_dynamic": - globals.optimum_quant_config = "quantization/quant_config_dynamic" - else: - pass - - from .coders.autoinc.autoinc_harness import AutoInc_Harness - from .coders.autoinc.calib_dataloader import Calib_Dataloader - from .coders.autoinc.eval_func import Eval_Func - - opt = Calib_Dataloader() - opt.register_transformation() - - opt = Eval_Func() - opt.register_transformation() - - opt = AutoInc_Harness(backend=feature) - opt.register_transformation() - else: - from .coders.pytorch.harness import Harness - - opt = Harness(backend=feature) - opt.register_transformation() - - # execute transformation - list_transformed_code = execute_indent_transformation(list_transformed_code) - list_transformed_code = execute_insert_transformation(list_transformed_code) - - ## 2. Features NOT in Harness Scope - else: - for i in range(len(list_transformed_code)): - # Batch Size - if "pytorch_change_batch_size" in features: - if "batch_size" in list_transformed_code[0]: # entry code has "batch_size" - globals.batch_size_changed = True - from .coders.pytorch.batch_size import BatchSizeCoder - - globals.target_batch_size = str(target_batch_size) - list_transformed_code[i] = BatchSizeCoder(list_transformed_code[i]).transform() - # CUDA to CPU - if "pytorch_cuda_to_cpu" in features: - from .coders.pytorch.cuda_to_cpu import CudaToCpu - - list_transformed_code[i] = CudaToCpu(list_transformed_code[i]).transform() - # Lightning - if "pytorch_lightning_bf16_cpu" in features: - from .coders.pytorch.lightning import Lightning - - list_transformed_code[i] = Lightning(list_transformed_code[i]).transform() - # TF & Keras AMP - if "tensorflow_mixed_precision" in features: - from .coders.tensorflow.amp import TensorFlowKerasAMP - - list_transformed_code[i] = TensorFlowKerasAMP(list_transformed_code[i]).transform() - if feature == "tensorflow_inc": - from .coders.tensorflow.inc import TensorFlowKerasINC - - list_transformed_code[i] = TensorFlowKerasINC(list_transformed_code[i]).transform() - # Change Trainer to NLPTrainer (only for intel_extension_for_pytorch) - if "change_trainer_to_nlptrainer" in features: - from .coders.pytorch.change_trainer_to_nlptrainer import TrainerToNLPTrainer - - list_transformed_code[i] = TrainerToNLPTrainer(list_transformed_code[i]).transform() - - logger.info(f"Code transformation for feature: [{feature}] finished.") - - for idx_path, path in enumerate(globals.list_code_path): - if path[-14:] == "_nc_enabled.py": - path_transformed = path - else: - path_transformed = path[:-3] + "_nc_enabled.py" - if idx_feature != len(features) - 1: - open(path_transformed, "w").write(list_transformed_code[idx_path]) - else: - open(path_transformed, "w").write(list_transformed_code[idx_path].replace(" # [coder-enabled]", "")) - globals.list_code_path[idx_path] = path_transformed - transformed_list_code_path = globals.list_code_path - - # test code_line.py - if test_code_line: - # reset globals - globals.reset_globals() - globals.print_code_line_info = True - - from .utils import handle_user_input - - globals.list_code_path, num_user_code_path = handle_user_input.get_all_code_path(code) - if len(transformed_list_code_path) > 0: - globals.list_code_path = transformed_list_code_path - - # common for all features (transformations), - list_transformed_code = [] - # in this list, each item stores the transformed code - # of the corresponding original code - # by the order in code_path - - for i in globals.list_code_path: - list_transformed_code.append(open(i, "r").read()) - - from .coders.transform import execute_indent_transformation, execute_insert_transformation - from .graphers.code_line import register_code_line - from .graphers.function import register_func_wrap_pair - from .graphers.model import register_nnModule_class, register_nnModule_instance_definition - - # code analysis (call graph, type inference etc) - register_code_line() - register_func_wrap_pair() - register_nnModule_class() - register_nnModule_instance_definition() - - ### Output of Enabling - globals.list_code_path, num_user_code_path = handle_user_input.get_all_code_path(code) - - if generate_patch: - whole_patch_user_code = "" - for path in globals.list_code_path[0:num_user_code_path]: - path_transformed = path[:-3] + "_nc_enabled.py" - if path_transformed[-25:] == "_nc_enabled_nc_enabled.py": - continue - cmd_gen_patch = "diff -up " + path + " " + path_transformed - sp_gen_patch = subprocess.Popen(cmd_gen_patch, env=os.environ, shell=True, stdout=subprocess.PIPE) # nosec - sp_gen_patch.wait() - this_patch, _ = sp_gen_patch.communicate() - this_patch = str(this_patch)[2:-1] - whole_patch_user_code += this_patch - if save_patch_path == "": - save_patch_path = ws_path + "neural_coder_patch" - open(save_patch_path + patch_suffix, "w").write( - whole_patch_user_code.replace(r"\n", "\n").replace(r"\t", "\t").replace(r"\'", "'") - ) - abs_patch_path = os.path.abspath(save_patch_path + patch_suffix) - logger.info(f"The patch is saved to: [{abs_patch_path}]") - - if overwrite: - sp_overwrite = subprocess.Popen( - "patch -d/ -p0 < " + abs_patch_path, env=os.environ, shell=True, stdout=subprocess.PIPE - ) # nosec - sp_overwrite.wait() - # os.remove(abs_patch_path) # remove patch after overwrite - - if patch_imports: - whole_patch_import_modules = "" - for path in globals.list_code_path[num_user_code_path:]: - path_transformed = path[:-3] + "_nc_enabled.py" - cmd_gen_patch = "diff -up " + path + " " + path_transformed - sp_gen_patch = subprocess.Popen( - cmd_gen_patch, env=os.environ, shell=True, stdout=subprocess.PIPE - ) # nosec - sp_gen_patch.wait() - this_patch, _ = sp_gen_patch.communicate() - this_patch = str(this_patch)[2:-1] - whole_patch_import_modules += this_patch - if save_patch_path == "": - save_patch_path = ws_path + "neural_coder_patch_import_modules" - open(save_patch_path + patch_suffix, "w").write( - whole_patch_import_modules.replace(r"\n", "\n").replace(r"\t", "\t").replace(r"\'", "'") - ) - abs_patch_path = os.path.abspath(save_patch_path + patch_suffix) - logger.info(f"The patch for imported modules is saved to: [{abs_patch_path}]") - - # remove copy for imports - if remove_copy: - for path in globals.list_code_path: - try: - path_transformed = path[:-3] + "_nc_enabled.py" - os.remove(path_transformed) - except: - pass - - ### Benchmark - if run_bench: - if "github" in code and ".com" in code and ".py" in code: - code = globals.list_code_path[0] - entry_code = globals.list_code_path[0] - - bench_performance, bench_mode, bench_ws_path = bench( - code=code, - entry_code=entry_code, - args=args, - patch_path=abs_patch_path, - mode=mode, - cpu_set_env=cpu_set_env, - ncore_per_instance=ncore_per_instance, # only for "self_defined" mode - ninstances=ninstances, # only for "self_defined" mode - bench_batch_size=bench_batch_size, # only for "self_defined" mode - ) - - return bench_performance, bench_mode, bench_ws_path - - -def bench( - code, - entry_code="", - args="", - patch_path="", - mode="throughput", # throughput, latency, multi_instance or self_defined - logging_level="info", - cpu_set_env=True, - ncore_per_instance=-1, # only for "self_defined" mode - ninstances=-1, # only for "self_defined" mode - bench_batch_size=-1, # only for "self_defined" mode -): - """Benchmark on either "optimized code", or "patch" + "original code" - it does not enable benchmark code lines, or enable change of batch size - all the enabling should be done within enable API - which means the "optimized code" should already have - "pytorch_benchmark" and "pytorch_change_batch_size" enabled - or the "patch" should already have the code modification - for "pytorch_benchmark" and "pytorch_change_batch_size" in it.""" - # set up workspace - ws_path = "neural_coder_workspace/" + "bench" + str(time.time()).replace(".", "") + "/" - os.makedirs(ws_path) - - # set up logging - logging_var = "logging." + logging_level.upper() - globals.logging_level = eval(logging_var) - - logger = logging.getLogger(ws_path) - logger.setLevel(globals.logging_level) - formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s: - %(message)s", datefmt="%Y-%m-%d %H:%M:%S") - - fh = logging.FileHandler(ws_path + "bench.log") - fh.setLevel(globals.logging_level) - fh.setFormatter(formatter) - ch = logging.StreamHandler() - ch.setLevel(globals.logging_level) - ch.setFormatter(formatter) - - logger.addHandler(ch) - logger.addHandler(fh) - - # device detection - detect_device_(logger) - - # print key inputs - logger.info("Benchmarking started ...") - logger.info(f"code: {code}") - logger.info(f"mode: {mode}") - - # entry code - if entry_code == "": - # if not specify entry_code, - # then code has to be a list of one element, or a single string of single path, otherwise quit - if type(code) == list and len(code) == 1: - entry_code = code[0] - elif type(code) == str: - entry_code = code - else: - logger.error(f"You have to specify an entry_code of your code: [{code}]") - quit() - - # patch - if patch_path != "": - sp_patch = subprocess.Popen( - "patch -d/ -p0 < " + patch_path, env=os.environ, shell=True, stdout=subprocess.PIPE - ) # nosec - sp_patch.wait() - - # if mode is "self_defined", user must specify ncpi, nins and bs - if mode == "self_defined": - if ncore_per_instance == -1 or ninstances == -1 or bench_batch_size == -1: - logger.error( - "You have to specify ncore_per_instance," - "ninstances and bench_batch_size for self-defined benchmark mode." - ) - quit() - - # numactl - from .utils import numa_launcher - from .utils.cpu_info import get_num_cpu_cores - - ncores = get_num_cpu_cores() - - # numactl setup for different modes - if mode == "throughput": - ncore_per_instance = ncores - ninstances = 1 - bench_batch_size = 2 * ncores - elif mode == "multi_instance": - ncore_per_instance = 4 - ninstances = int(ncores / ncore_per_instance) - bench_batch_size = 1 - elif mode == "latency": - ncore_per_instance = 1 - ninstances = ncores - bench_batch_size = 1 - elif mode == "self_defined": - ncore_per_instance = ncore_per_instance - ninstances = ninstances - bench_batch_size = bench_batch_size - - # set cpu env variables - if cpu_set_env: - cmd_env = "" - cmd_env += "export LD_PRELOAD=${CONDA_PREFIX}/lib/libjemalloc.so" - cmd_env += " && " - cmd_env += "export LD_PRELOAD=${LD_PRELOAD}:${CONDA_PREFIX}/lib/libiomp5.so" - cmd_env += " && " - cmd_env += 'export MALLOC_CONF="oversize_threshold:1,background_thread:true,metadata_thp:auto,' - cmd_env += 'dirty_decay_ms:9000000000,muzzy_decay_ms:9000000000"' - cmd_env += " && " - cmd_env += 'export KMP_AFFINITY="granularity=fine,compact,1,0"' - cmd_env += " && " - cmd_env += "export KMP_BLOCKTIME=1" - cmd_env += " && " - cmd_env += "export DNNL_PRIMITIVE_CACHE_CAPACITY=1024" - cmd_env += " && " - cmd_env += "export KMP_SETTINGS=1" - - sp_set_env = subprocess.Popen(cmd_env, env=os.environ, shell=True, stdout=subprocess.PIPE) # nosec - sp_set_env.wait() - - # benchmark - logger.info("Start benchmark on the code ...") - - bench_log_path = ws_path + "performance.log" - os.remove(bench_log_path) if os.path.exists(bench_log_path) else 0 - - args = [args] - numa_launcher.exec_launcher(ncore_per_instance, ninstances, entry_code, args, bench_log_path) - - # get performance (throughput and latency) - bench_log = open(bench_log_path, "r", encoding="unicode_escape").read().split("\n") - IPS = [] - MSPI = 0 - count_MSPI = 0 - P50 = 0 - count_P50 = 0 - P90 = 0 - count_P90 = 0 - P99 = 0 - count_P99 = 0 - acc_delta = 0 - for line in bench_log: - if "Neural_Coder_Bench_IPS" in line: - try: - IPS.append(float(line[line.find(":") + 3 :])) - except ValueError as ve: - pass - if "Neural_Coder_Bench_MSPI" in line: - try: - MSPI += float(line[line.find(":") + 3 :]) - count_MSPI += 1 - except ValueError as ve: - pass - if "Neural_Coder_Bench_P50" in line: - try: - P50 += float(line[line.find(":") + 3 :]) - count_P50 += 1 - except ValueError as ve: - pass - if "Neural_Coder_Bench_P90" in line: - try: - P90 += float(line[line.find(":") + 3 :]) - count_P90 += 1 - except ValueError as ve: - pass - if "Neural_Coder_Bench_P99" in line: - try: - P99 += float(line[line.find(":") + 3 :]) - count_P99 += 1 - except ValueError as ve: - pass - if "Accuracy (int8|fp32)" in line: - try: - acc_int8 = float(re.search(r"\d+\.\d+", line).group()) - acc_fp32 = float(re.search(r"(?<=\|)\d+\.\d+", line).group()) - acc_delta = round((acc_int8 - acc_fp32) / acc_fp32 * 100, 2) # percent of increase/decrease - except ValueError as ve: - pass - - if len(IPS) >= 4: # handle extreme values - IPS.sort() - IPS[0] = IPS[1] - IPS[-1] = IPS[-2] - - try: - if globals.batch_size_changed: # only times BS if BS has been modified, otherwise times 1 - FPS = round(sum(IPS) / len(IPS) * ninstances * bench_batch_size, 3) - else: - FPS = round(sum(IPS) / len(IPS) * ninstances * 1, 3) - except: - FPS = 0 - try: - MSPI = round(MSPI / count_MSPI, 3) - except: - MSPI = 0 - try: - P50 = round(P50 / count_P50, 3) - except: - P50 = 0 - try: - P90 = round(P90 / count_P90, 3) - except: - P90 = 0 - try: - P99 = round(P99 / count_P99, 3) - except: - P99 = 0 - - logger.info(f"Collected throughput on the code is: [{FPS}] (fps)") - logger.info(f"Collected latency on the code is: [{MSPI}] (mspi)") - logger.info(f"Collected latency_p50 on the code is: [{P50}] (mspi)") - logger.info(f"Collected latency_p90 on the code is: [{P90}] (mspi)") - logger.info(f"Collected latency_p99 on the code is: [{P99}] (mspi)") - logger.info(f"Collected accuracy delta on the code is: [{acc_delta}]") - - # unpatch - if patch_path != "": - sp_unpatch = subprocess.Popen( - "patch -R -d/ -p0 < " + patch_path, env=os.environ, shell=True, stdout=subprocess.PIPE - ) # nosec - sp_unpatch.wait() - - return [FPS, MSPI, P50, P90, P99, acc_delta], mode, os.path.abspath(ws_path) - - -def superbench( - code, - entry_code="", - args="", - sweep_objective="feature", # "feature" or "bench_config" - specify_features=[], - bench_feature=[], # only effective when sweep_objective is "bench_config" - mode="throughput", - num_benchmark_iteration=5, - iteration_dynamic_adjust=True, - logging_level="info", - cpu_set_env=True, - ncore_per_instance=-1, # only for "self_defined" mode - ninstances=-1, # only for "self_defined" mode - bench_batch_size=-1, # only for "self_defined" mode - use_inc=True, - auto_quant=False, -): - # set up workspace - ws_path = "neural_coder_workspace/" + "superbench" + str(time.time()).replace(".", "") + "/" - os.makedirs(ws_path) - - # set up logging - logging_var = "logging." + logging_level.upper() - globals.logging_level = eval(logging_var) - - logger = logging.getLogger(ws_path) - logger.setLevel(globals.logging_level) - formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s: - %(message)s", datefmt="%Y-%m-%d %H:%M:%S") - - fh = logging.FileHandler(ws_path + "superbench.log") - fh.setLevel(globals.logging_level) - fh.setFormatter(formatter) - ch = logging.StreamHandler() - ch.setLevel(globals.logging_level) - ch.setFormatter(formatter) - - logger.addHandler(ch) - logger.addHandler(fh) - - # device detection - detect_device_(logger) - - # print key inputs - if auto_quant: - logger.info("Auto-Quant started ...") - logger.info(f"Code: {code}") - logger.info(f"Benchmark Mode: {mode} mode") - logger.debug(f"Number of benchmark iterations: {num_benchmark_iteration}") - else: - logger.info("SuperBench started ...") - logger.info(f"Code: {code}") - logger.info(f"Benchmark Mode: {mode} mode") - logger.debug(f"Sweep Objective: {sweep_objective}") - logger.debug(f"Number of benchmark iterations: {num_benchmark_iteration}") - - # entry code - if entry_code == "": - # if not specify entry_code, - # then code has to be a list of one element, - # or a single string of single path, otherwise quit - if type(code) == list and len(code) == 1: - entry_code = code[0] - elif type(code) == str: - entry_code = code - else: - logger.error(f"You have to specify an entry_code of your code: [{code}]") - quit() - - # detect device compatibility of entry code - from .utils.device import detect_code_device_compatibility - - detect_code_device_compatibility(entry_code) - - if sweep_objective == "feature": - list_FPS = [] - list_accuracy = [] - list_features = [] - list_mode = [] - list_ws_path = [] - result = [] - - if auto_quant: - backends = [ - [], - ["pytorch_inc_dynamic_quant"], - ["pytorch_inc_static_quant_fx"], - ["pytorch_inc_static_quant_ipex"], - ["pytorch_inc_static_quant_ipex_xpu"], - ["pytorch_inc_bf16"], - ] - standalones_pool = [] - elif len(specify_features) != 0: - backends = [ - [], - ] - for item in specify_features: - backends.append([item]) - standalones_pool = [] - else: - # features that is a "backend": - backends = [ - "", - "pytorch_ipex_fp32", - "pytorch_ipex_bf16", - "pytorch_inc_static_quant_fx", - "pytorch_inc_static_quant_ipex", - "pytorch_inc_static_quant_ipex_xpu", - "pytorch_inc_dynamic_quant", - "pytorch_ipex_int8_static_quant", - "pytorch_ipex_int8_dynamic_quant", - ] - # features that can be standalone (either use alone or use with "backend"): - standalones_pool = [ - "pytorch_ipex_xpu", - "pytorch_mixed_precision_cpu", - "pytorch_channels_last", - ] - - standalones = [] - standalones.append("") - from itertools import combinations - - for num_items in range(len(standalones_pool)): - list_comb = list(combinations(standalones_pool, num_items + 1)) - for item in list_comb: - jit_feature_count = 0 - for i in list(item): - if "jit" in i: - jit_feature_count += 1 - if jit_feature_count <= 1: - standalones.append(list(item)) # only appends the item with one JIT feature in it - - dry_run = True - for backend in backends: - for standalone in standalones: - features = [] - if auto_quant: - features += backend - elif len(specify_features) != 0: - features += backend - else: - features.append(backend) - features += standalone - - # exclude conflict features (like jit and jit_ofi) - if "pytorch_ipex_fp32" in features and "pytorch_mixed_precision_cpu" in features: - continue - if "pytorch_ipex_bf16" in features and "pytorch_mixed_precision_cpu" in features: - continue - if "pytorch_ipex_int8_static_quant" in features and "pytorch_mixed_precision_cpu" in features: - continue - if "pytorch_ipex_int8_dynamic_quant" in features and "pytorch_mixed_precision_cpu" in features: - continue - if "pytorch_inc_static_quant_fx" in features and "pytorch_mixed_precision_cpu" in features: - continue - if "pytorch_inc_static_quant_ipex" in features and "pytorch_mixed_precision_cpu" in features: - continue - if "pytorch_inc_static_quant_ipex_xpu" in features and "pytorch_mixed_precision_cpu" in features: - continue - if "pytorch_inc_dynamic_quant" in features and "pytorch_mixed_precision_cpu" in features: - continue - - # device conversion - if "cpu" in globals.device and "cpu" not in globals.list_code_device_compatibility: - features.append("pytorch_cuda_to_cpu") - - if features[0] == "" and len(features) > 1: - features = features[1:] # remove "" - - if dry_run: - t_start = time.time() - - bench_performance, bench_mode, bench_ws_path = enable( - code=code, - entry_code=entry_code, - args=args, - features=features, - mode=mode, - run_bench=True, - num_benchmark_iteration=num_benchmark_iteration, - cpu_set_env=cpu_set_env, - ncore_per_instance=ncore_per_instance, - ninstances=ninstances, - bench_batch_size=bench_batch_size, - use_inc=use_inc, - ) - - if dry_run: - t_end = time.time() - if iteration_dynamic_adjust: - num_benchmark_iteration = max(int(300 / (t_end - t_start)), 5) - logger.debug( - f"Adjusted number of benchmark iterations after dry-run is {num_benchmark_iteration}" - ) - dry_run = False - - def remove_if_have(list, element): - if element in list: - list.remove(element) - return list - - features = remove_if_have(features, "pytorch_benchmark") - features = remove_if_have(features, "pytorch_change_batch_size") - features = remove_if_have(features, "pytorch_cuda_to_cpu") - - if auto_quant: - # convert feature name to display name for better user experience - if features == ["pytorch_inc_dynamic_quant"]: - features_display = "Intel INT8 (Dynamic)" - elif features == ["pytorch_inc_static_quant_fx"]: - features_display = "Intel INT8 (Static)" - elif features == ["pytorch_inc_static_quant_ipex"]: - features_display = "Intel INT8 (IPEX)" - elif features == ["pytorch_inc_static_quant_ipex_xpu"]: - features_display = "Intel INT8 (IPEX XPU)" - elif features == ["pytorch_inc_bf16"]: - features_display = "Intel BF16" - elif features == []: - features_display = "The Original Model" - - logger.info( - f"Benchmark result (performance) of {features_display}" f" is {bench_performance[0]} (FPS)" - ) - logger.info(f"Benchmark result (accuracy delta) of {features_display} is {bench_performance[5]} %") - else: - logger.info( - f"Benchmark result (performance) of optimization set [{features}]" - f" is [{bench_performance[0]}] (FPS)" - ) - logger.info( - f"Benchmark result (accuracy delta) of optimization set [{features}]" - f" is [{bench_performance[5]}] %" - ) - - d = {} # initialize dict - d["features"] = features - d["FPS"] = bench_performance[0] - d["accuracy"] = bench_performance[5] - d["mode"] = bench_mode - d["workspace_path"] = bench_ws_path - result.append(d) - - list_FPS.append(bench_performance[0]) - list_accuracy.append(bench_performance[5]) - list_features.append(features) - list_mode.append(bench_mode) - list_ws_path.append(bench_ws_path) - - # print result - print(f"Superbench result of sweeping [{sweep_objective}] printed below with sorted FPS: ") - print( - "{:<20} {:<20} {:<20} {:<120}".format( - "Numactl Mode", "Performance (FPS)", "Accuracy Delta (%)", "Features Applied" - ) - ) - - sort_index = sorted( - range(len(list_FPS)), - key=lambda k: list_FPS[k], - reverse=True, - ) - - for i in sort_index: - if list_FPS[i] != 0: - print( - "{:<20} {:<20} {:<20} {:<120}".format( - str(list_mode[i]), - str(list_FPS[i]), - str(list_accuracy[i]), - str(list_features[i]), - ) - ) - - # for superbench report generation - list_optimization_set_top3 = [] - list_performance_top3 = [] - count_top3 = 0 - for i in sort_index: - if list_FPS[i] != 0: - list_performance_top3.append(list_FPS[i]) - list_optimization_set_top3.append(list_features[i]) - count_top3 += 1 - if count_top3 == 3: - break - - original_model_performance = 0 - original_model_ranking = 0 - for i in sort_index: - if list_FPS[i] != 0: - original_model_ranking += 1 - if list_features[i] == []: - original_model_performance = list_FPS[i] - break - - if auto_quant: - # convert feature name to display name for better user experience - if list_optimization_set_top3[0] == ["pytorch_inc_dynamic_quant"]: - best_optimization_display = "Intel INT8 (Dynamic)" - elif list_optimization_set_top3[0] == ["pytorch_inc_static_quant_fx"]: - best_optimization_display = "Intel INT8 (Static)" - elif list_optimization_set_top3[0] == ["pytorch_inc_static_quant_ipex"]: - best_optimization_display = "Intel INT8 (IPEX)" - elif list_optimization_set_top3[0] == ["pytorch_inc_static_quant_ipex_xpu"]: - best_optimization_display = "Intel INT8 (IPEX XPU)" - elif list_optimization_set_top3[0] == ["pytorch_inc_bf16"]: - best_optimization_display = "Intel BF16" - elif list_optimization_set_top3[0] == []: - best_optimization_display = "The Original Model" - - logger.info(f"The best optimization set for your model is {best_optimization_display}") - logger.info( - f"You can get up to " - f"{round(list_performance_top3[0] / original_model_performance, 1)}" - f" X performance boost." - ) - else: - logger.info(f"The best optimization set for your model is: {list_optimization_set_top3[0]}") - logger.info( - f"You can get up to " - f"{round(list_performance_top3[0] / original_model_performance, 1)}" - f" X performance boost." - ) - - # generate patch for the best optimization - features_to_generate = list_optimization_set_top3[0] - features_to_generate.append("pytorch_cuda_to_cpu") - enable( - code=code, - features=features_to_generate, - save_patch_path="intel_optimization", - use_inc=use_inc, - ) - logger.info('The optimization patch was saved to "intel_optimziation.diff"') - - return list_optimization_set_top3, list_performance_top3, original_model_ranking, original_model_performance - - elif sweep_objective == "bench_config": - result_ncpi = [] - result_nins = [] - result_bs = [] - result_regular_thp = [] - result_p50_thp = [] - result_p90_thp = [] - result_p99_thp = [] - if bench_feature == []: - logger.error( - "You must specify a feature (optimization set) " - 'for benchmark when "sweep_objective" is "bench_config"' - ) - quit() - else: - from .utils.cpu_info import get_num_cpu_cores - - ncores = get_num_cpu_cores() - list_ncpi = [1, 2, 4, 8] - for i in [1, 2, 4, 8]: - list_ncpi.append(int(ncores / i)) - list_ncpi = list(set(list_ncpi)) - list_ncpi.sort() - logger.debug(f"list_ncpi = {list_ncpi}") - - dry_run = True - for this_ncpi in list_ncpi: - ncore_per_instance = this_ncpi - ninstances = int(ncores / this_ncpi) - list_bs = [ - 1, - 2, - 4, - 8, - this_ncpi * 1, - this_ncpi * 2, - this_ncpi * 4, - this_ncpi * 8, - this_ncpi * 16, - this_ncpi * 32, - this_ncpi * 64, - ] - list_bs = list(set(list_bs)) - list_bs.sort() - if logging_level == "debug": - list_bs = [list_bs[-5]] - logger.debug(f"this_ncpi = {this_ncpi}") - logger.debug(f"list_bs = {list_bs}") - for this_bs in list_bs: - bench_batch_size = this_bs - try: - if dry_run: - t_start = time.time() - - bench_performance, bench_mode, bench_ws_path = enable( - code=code, - entry_code=entry_code, - args=args, - features=bench_feature, - mode="self_defined", # sweep bench_config, so mode set to "self_defined" - run_bench=True, - num_benchmark_iteration=num_benchmark_iteration, - cpu_set_env=cpu_set_env, - ncore_per_instance=ncore_per_instance, - ninstances=ninstances, - bench_batch_size=bench_batch_size, - use_inc=use_inc, - ) - - if dry_run: - t_end = time.time() - if iteration_dynamic_adjust: - num_benchmark_iteration = max(int(300 / (t_end - t_start)), 5) - logger.debug( - f"Adjusted number of benchmark iterations after dry-run is " - f"{num_benchmark_iteration}" - ) - dry_run = False - - socket_regular_thp = bench_performance[0] - socket_p50_thp = round(1000 / bench_performance[2] * ninstances * bench_batch_size, 3) - socket_p90_thp = round(1000 / bench_performance[3] * ninstances * bench_batch_size, 3) - socket_p99_thp = round(1000 / bench_performance[4] * ninstances * bench_batch_size, 3) - - result_ncpi.append(ncore_per_instance) - result_nins.append(ninstances) - result_bs.append(bench_batch_size) - result_regular_thp.append(socket_regular_thp) - result_p50_thp.append(socket_p50_thp) - result_p90_thp.append(socket_p90_thp) - result_p99_thp.append(socket_p99_thp) - - logger.info( - f"ncpi: {ncore_per_instance}, nins: {ninstances}, bs: {bench_batch_size}, " - f"regular_thp: {socket_regular_thp}, p50_thp: {socket_p50_thp}, " - f"p90_thp: {socket_p90_thp}, p99_thp: {socket_p99_thp}" - ) - - except: - logger.warning( - f"ncpi: {ncore_per_instance}, nins: {ninstances}, bs: {bench_batch_size}, " - f"Benchmark failed. It might be due to HW limitation such as CPU load limit." - ) - continue - - # print result - for item in [result_regular_thp, result_p50_thp, result_p90_thp, result_p99_thp]: - if item is result_regular_thp: - display_item_name = "Throughput" - elif item is result_p50_thp: - display_item_name = "Throughput based on P50-Latency" - elif item is result_p90_thp: - display_item_name = "Throughput based on P90-Latency" - elif item is result_p99_thp: - display_item_name = "Throughput based on P99-Latency" - - print( - "{:<30} {:<30} {:<30} {:<30}".format( - "Num Cores Per Instance", "Num of Instances", "Batch Size", display_item_name - ) - ) - sort_index = sorted(range(len(item)), key=lambda k: item[k], reverse=True) - for i in sort_index: - print( - "{:<30} {:<30} {:<30} {:<30}".format( - str(result_ncpi[i]), str(result_nins[i]), str(result_bs[i]), str(item[i]) - ) - ) - - list_config_best_ncpi = [] - list_config_best_nins = [] - list_config_best_bs = [] - list_config_best_performance = [] - for item in [result_regular_thp, result_p50_thp, result_p90_thp, result_p99_thp]: - sort_index = sorted(range(len(item)), key=lambda k: item[k], reverse=True) - for i in sort_index: - list_config_best_ncpi.append(result_ncpi[i]) - list_config_best_nins.append(result_nins[i]) - list_config_best_bs.append(result_bs[i]) - list_config_best_performance.append(item[i]) - break # only fetch the top result - - return list_config_best_ncpi, list_config_best_nins, list_config_best_bs, list_config_best_performance - - -# def superreport( -# code, -# save_path="superbench_report.pdf", -# logging_level="info", -# platform="bare_metal", -# bare_metal_machine_type="SPR", -# ): - -# from .utils.pdf_report import PDFReport - -# logging_level = logging_level -# res1, res2, res3, res4 = superbench( -# code=code, -# sweep_objective="feature", -# mode="throughput", -# logging_level=logging_level, -# ) - -# res5, res6, res7, res8 = superbench( -# code=code, -# sweep_objective="bench_config", -# bench_feature=res1[0], -# logging_level=logging_level, -# ) -# res1[0] = res1[0][0:-2] - -# if platform == "AWS": -# # get AWS cloud_vendor and cloud_instance_type -# # pricing: https://aws.amazon.com/ec2/pricing/on-demand/ -# import subprocess -# res = subprocess.Popen( -# "grep 'DMI' /var/log/dmesg", -# shell=True, -# stdout=subprocess.PIPE, -# stderr=subprocess.PIPE, -# ) -# res.wait() -# result = res.stdout.read() -# result = str(result, encoding="utf-8") -# cloud_vendor = result.split()[4] + ' ' + result.split()[5] -# if cloud_vendor == 'Amazon EC2': -# cloud_vendor = 'AWS' -# cloud_instance_type = result.split()[6].strip(',').strip('/') - -# # pricing to get automatically from AWS website -# import pandas as pd -# url = 'https://pricing.us-east-1.amazonaws.com/offers/v1.0/aws/AmazonEC2/current/us-east-2/index.csv' -# df = pd.read_csv(url, skiprows=5, delimiter=',') -# for i in range(len(df)): -# if df['Location Type'][i] == "AWS Region" and df['Instance Type'][i] == cloud_instance_type \ -# and df['Tenancy'][i] == "Shared" and df['Operating System'][i] == "Linux" \ -# and df['operation'][i] == "RunInstances" and df['CapacityStatus'][i] == "UnusedCapacityReservation": -# cloud_unit_price = float(df['PricePerUnit'][i]) -# elif platform == "bare_metal": -# cloud_vendor="Intel internal machine" -# cloud_instance_type=bare_metal_machine_type -# cloud_unit_price="1" - -# report = PDFReport( -# path=save_path, -# list_optimization_set_top3=res1, -# list_performance_top3=res2, -# original_model_ranking=res3, -# original_model_performance=res4, -# list_config_best_ncpi=res5, -# list_config_best_nins=res6, -# list_config_best_bs=res7, -# list_config_best_performance=res8, -# TCO_unit_pricing=cloud_unit_price, # 2.448 -# cloud_vendor=cloud_vendor, # "AWS" -# cloud_instance_type=cloud_instance_type, # "c6i" -# ) - - -def auto_quant( - code, - entry_code="", - args="", - sweep_objective="feature", - bench_feature=[], - mode="throughput", - num_benchmark_iteration=30, - iteration_dynamic_adjust=False, - logging_level="info", - cpu_set_env=True, - ncore_per_instance=-1, # only for "self_defined" mode - ninstances=-1, # only for "self_defined" mode - bench_batch_size=-1, # only for "self_defined" mode - use_inc=True, -): - return superbench( - code, - entry_code=entry_code, - args=args, - sweep_objective=sweep_objective, - bench_feature=bench_feature, - mode=mode, - num_benchmark_iteration=num_benchmark_iteration, - iteration_dynamic_adjust=iteration_dynamic_adjust, - logging_level=logging_level, - cpu_set_env=cpu_set_env, - ncore_per_instance=ncore_per_instance, # only for "self_defined" mode - ninstances=ninstances, # only for "self_defined" mode - bench_batch_size=bench_batch_size, # only for "self_defined" mode - use_inc=use_inc, - auto_quant=True, - ) diff --git a/neural_coder/launcher.py b/neural_coder/launcher.py deleted file mode 100644 index a24b265994c..00000000000 --- a/neural_coder/launcher.py +++ /dev/null @@ -1,105 +0,0 @@ -import os -import shutil -import subprocess -import sys -from argparse import REMAINDER, ArgumentParser - - -class Launcher: - def parse_args(): - """ - Helper function parsing the command line options - @retval ArgumentParser - """ - parser = ArgumentParser(description="command-launch a Python script with quantization auto-enabled") - - parser.add_argument("-o", "--opt", type=str, default="", help="optimization feature to enable") - - parser.add_argument("-a", "--approach", type=str, default="auto", help="quantization approach (strategy)") - - parser.add_argument("--config", type=str, default="", help="quantization configuration file path") - - parser.add_argument( - "-b", "--bench", default=False, action="store_true", help="conduct auto_quant benchmark instead of enable" - ) - - parser.add_argument( - "-e", "--enable", default=False, action="store_true", help="only do enable, not overwrite or run program" - ) - - # positional - parser.add_argument( - "script", - type=str, - help="The full path to the script to be launched. " "followed by all the arguments for the script", - ) - - # script args - parser.add_argument("script_args", nargs=REMAINDER) - return parser.parse_args() - - def execute( - args, - use_modular=False, - modular_pattern={}, - use_inc=True, - ): - # copy user entry script (main.py -> main_optimized.py) - script_copied = args.script[:-3] + "_optimized.py" - shutil.copy(args.script, script_copied) - - if not args.bench: # "enable and run" or "only enable" - # optimize on copied script with Neural Coder - from neural_coder import enable - - if args.opt == "": - if args.approach == "static": - args.opt = "pytorch_inc_static_quant_fx" - if args.approach == "static_ipex": - args.opt = "pytorch_inc_static_quant_ipex" - if args.approach == "static_ipex_xpu": - args.opt = "pytorch_inc_static_quant_ipex_xpu" - if args.approach == "dynamic": - args.opt = "pytorch_inc_dynamic_quant" - if args.approach == "auto": - args.opt = "inc_auto" - features = [args.opt] - else: - features = args.opt.split(",") - - # modular design - modular_item = "" - if use_modular: - modular_item = modular_pattern[args.opt] - - # execute optimization enabling - enable( - code=script_copied, - features=features, - overwrite=True, - use_modular=use_modular, - modular_item=modular_item, - use_inc=use_inc, - ) - - if not args.enable: # enable and run - # execute on copied script, which has already been optimized - cmd = [] - - cmd.append(sys.executable) # "/xxx/xxx/python" - cmd.append("-u") - cmd.append(script_copied) - cmd.extend(args.script_args) - - cmd = " ".join(cmd) # list convert to string - - process = subprocess.Popen(cmd, env=os.environ, shell=True) # nosec - process.wait() - else: # auto_quant - from neural_coder import auto_quant - - auto_quant( - code=script_copied, - args=" ".join(args.script_args), # convert list of strings to a single string - use_inc=use_inc, - ) diff --git a/neural_coder/utils/__init__.py b/neural_coder/utils/__init__.py deleted file mode 100644 index e833188cc78..00000000000 --- a/neural_coder/utils/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. diff --git a/neural_coder/utils/common.py b/neural_coder/utils/common.py deleted file mode 100644 index 474f4cf0643..00000000000 --- a/neural_coder/utils/common.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -def move_element_to_front(list, element): - if element in list: - idx = list.index(element) - list.insert(0, list.pop(idx)) - return list - - -def move_element_to_last(list, element): - if element in list: - idx = list.index(element) - list.insert(len(list), list.pop(idx)) - return list diff --git a/neural_coder/utils/cpu_info.py b/neural_coder/utils/cpu_info.py deleted file mode 100644 index 276b1271fe6..00000000000 --- a/neural_coder/utils/cpu_info.py +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import subprocess - - -def get_num_cpu_cores() -> int: - cmd_cpu_info = "" - cmd_cpu_info += "sockets_num=$(lscpu |grep 'Socket(s):' |sed 's/[^0-9]//g')" - cmd_cpu_info += " && " - cmd_cpu_info += "cores_per_socket=$(lscpu |grep 'Core(s) per socket:' |sed 's/[^0-9]//g')" - cmd_cpu_info += " && " - cmd_cpu_info += 'phsical_cores_num=$( echo "${sockets_num} * ${cores_per_socket}" |bc )' - cmd_cpu_info += " && " - cmd_cpu_info += "numa_nodes_num=$(lscpu |grep 'NUMA node(s):' |sed 's/[^0-9]//g')" - cmd_cpu_info += " && " - cmd_cpu_info += 'cores_per_node=$( echo "${phsical_cores_num} / ${numa_nodes_num}" |bc )' - cmd_cpu_info += " && " - cmd_cpu_info += "echo ${cores_per_node}" - original_lang_val = os.environ.get("LANG") - os.environ["LANG"] = "C" - sp_grep_cpu_info = subprocess.Popen(cmd_cpu_info, env=os.environ, shell=True, stdout=subprocess.PIPE) # nosec - sp_grep_cpu_info.wait() - if original_lang_val: - os.environ["LANG"] = original_lang_val - else: - del os.environ["LANG"] - - log_cpu_info, _ = sp_grep_cpu_info.communicate() - ncores = int(str(log_cpu_info)[2:-3]) - - return ncores diff --git a/neural_coder/utils/device.py b/neural_coder/utils/device.py deleted file mode 100644 index ccad2678087..00000000000 --- a/neural_coder/utils/device.py +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import subprocess - -from .. import globals - - -def detect_device(): - try: - import torch - - if torch.cuda.is_available(): - globals.device = "cuda" - return - except: - pass # cuda tf wip - - if check_has('clinfo | grep "Intel(R) Graphics"'): - globals.device = "intel_gpu" - return - - if check_has('lscpu | grep "amx"'): - globals.device = "cpu_with_amx" - return - - globals.device = "cpu_without_amx" - return - - -def check_has(s): - cmd = s - try: - sp = subprocess.Popen(cmd, env=os.environ, shell=True, stdout=subprocess.PIPE) # nosec # nosec - sp.wait() - sp, _ = sp.communicate() - has = bool(len(sp.decode()) > 0) # 0: no, >0: yes - except: - has = False - print("Checking failed.") - return has - - -def detect_code_device_compatibility(code_path): - # handle github py url - if "github" in code_path and ".com" in code_path and ".py" in code_path: - import requests - - code_path = code_path.replace("github.com", "raw.githubusercontent.com").replace("/blob", "") - r = requests.get(code_path) - save_py_path = "./neural_coder_workspace/model_analyze_device.py" - f = open(save_py_path, "wb") - f.write(r.content) - code_path = save_py_path - - lines = open(code_path, "r").read().split("\n") - for line in lines: - if "torch.cuda.is_available()" in line: - globals.list_code_device_compatibility.append("cuda") - globals.list_code_device_compatibility.append("cpu") - if "--device" in line: - if "cpu" in line: - globals.list_code_device_compatibility.append("cpu") - if "cuda" in line: - globals.list_code_device_compatibility.append("cuda") - if "gpu" in line: - globals.list_code_device_compatibility.append("gpu") - if "cpu" not in line and "gpu" not in line and "cuda" not in line: - globals.list_code_device_compatibility = ["cpu", "cuda", "gpu"] - if "args.cpu" in line: - globals.list_code_device_compatibility.append("cpu") - if "args.cuda" in line: - globals.list_code_device_compatibility.append("cuda") - if "args.gpu" in line: - globals.list_code_device_compatibility.append("gpu") - - globals.list_code_device_compatibility = list(set(globals.list_code_device_compatibility)) diff --git a/neural_coder/utils/handle_user_input.py b/neural_coder/utils/handle_user_input.py deleted file mode 100644 index 292b49280cf..00000000000 --- a/neural_coder/utils/handle_user_input.py +++ /dev/null @@ -1,237 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import logging -import os -from typing import List - -from .. import globals - -logging.basicConfig( - level=globals.logging_level, format="%(asctime)s %(levelname)s %(message)s", datefmt="%a, %d %b %Y %H:%M:%S +0000" -) -logger = logging.getLogger(__name__) - - -def get_all_code_path(user_input: str) -> List: - user_code_path = get_user_code_path(user_input) - if globals.consider_imports: - import_path = get_imports_path(user_code_path) - else: - import_path = [] - - # if import_path intersects user_code_path, clear import_path: this is - # for cases where there is import of self folder and we only care about - # the main file (user_code_path) itself - if len(list(set(user_code_path).intersection(set(import_path)))) > 0: - import_path = [] - - all_code_path = user_code_path + import_path - logger.debug(f"Number of code files to analyze: {len(all_code_path)}") - - num_user_code_path = len(user_code_path) - - return all_code_path, num_user_code_path - - -def get_user_code_path(user_input: str) -> List: - list_path = [] - - # detect whether (a list of files)/file/folder/url - global user_input_type - if type(user_input) == list: - user_input_type = "a list of files" - elif "github" in user_input and ".com" in user_input and ".py" in user_input: - user_input_type = "url_py" - elif ".py" in user_input: - user_input_type = "file" - elif "github" in user_input and ".com" in user_input: - user_input_type = "url_repo" - else: - user_input_type = "folder" - - logger.debug(f"user input code type: {user_input_type}") - - # get list of file path - if user_input_type == "url_repo": - from git import Repo - - Repo.clone_from(user_input, "./cloned_github_repo") - dir_input = "./cloned_github_repo" - if user_input_type == "folder": - dir_input = user_input - - if user_input_type == "file": - list_path.append(os.path.abspath(user_input)) - elif user_input_type == "url_py": - import requests - - user_input = user_input.replace("github.com", "raw.githubusercontent.com").replace("/blob", "") - r = requests.get(user_input) - save_py_path = "./neural_coder_workspace/model.py" - f = open(save_py_path, "wb") - f.write(r.content) - list_path.append(os.path.abspath(save_py_path)) - elif user_input_type == "a list of files": - list_path += [os.path.abspath(i) for i in user_input] - else: - for path, dir_list, file_list in os.walk(dir_input): - for file_name in file_list: - file_path = os.path.join(path, file_name) - if file_path[-3:] == ".py" and file_path[-11:] != "__init__.py" and file_path[-8:] != "setup.py": - list_path.append(os.path.abspath(file_path)) - - return list_path - - -def get_imports_path(user_code_path: List) -> List: - pip_name_exceptions = [ - "argparse", - "ast", - "classy_vision", - "collections", - "contextlib", - "data", - "dataclasses", - "dataloader", - "dataset", - "datasets", - "einops", - "enum", - "evaluate", - "fx", - "glob", - "h5py", - "imageio", - "importlib", - "inspect", - "intel_extension_for_pytorch", - "itertools", - "jax", - "joblib", - "json", - "keras", - "libcst", - "linecache", - "logging", - "loggings", - "math", - "model", - "models", - "neural_coder", - "neural_compressor", - "numpy", - "os", - "onnxruntime", - "pandas", - "PIL", - "random", - "requests", - "shutil", - "subprocess", - "sys", - "system", - "tempfile", - "typing", - "tensorflow", - "threading", - "time", - "timeit", - "torch", - "torchdynamo", - "tqdm", - "traceback", - "trainer_qa", - "unittest", - "utils_qa", - "vissl", - "warning", - "warnings", - "packaging", - "pytorch_lightning", - "__future__", - "matplotlib", - "progress", - "tensorboard", - "onnx", - "coloredlogs", - "cpuinfo", - "rsa", - ] - - if globals.cache_load_transformers: - pip_name_exceptions.append("transformers") - - list_pip_path = [] - list_pip_name = [] - - # get list of pip name - for path in user_code_path: - lines = open(path, "r").read().split("\n") - for line in lines: - is_import_line = False - if line[0:6] == "import" and line[0:8] != "import ." and "," not in line: # to-do: handle "," case - is_import_line = True - start = 7 - elif line[0:4] == "from" and line[0:6] != "from .": - is_import_line = True - start = 5 - if is_import_line: - space_idx = line[start:].find(" ") - dot_idx = line[start:].find(".") - if space_idx == -1 and dot_idx == -1: - pip_name = line[start:] - elif space_idx > 0 and dot_idx == -1: - pip_name = line[start : start + space_idx] - elif space_idx == -1 and dot_idx > 0: - pip_name = line[start : start + dot_idx] - elif space_idx > 0 and dot_idx > 0: - pip_name = line[start : start + min(space_idx, dot_idx)] - list_pip_name.append(pip_name) - list_pip_name = list(set(list_pip_name).difference(set(pip_name_exceptions))) - for item in list_pip_name: - if "_nc" in item: - list_pip_name.remove(item) - - logger.debug(f"list pip name: {list_pip_name}") - - # get list of pip path - cmd_import = " ".join(["import " + i + ";" for i in list_pip_name]) - try: - exec(cmd_import) - except ModuleNotFoundError as mnfe: - logger.error( - f"Please install all required pip modules defined in your Python scripts " - f"before running Neural Coder: {mnfe}" - ) - quit() - - import inspect - - for i in list_pip_name: - try: - pip_dir_path = inspect.getsourcefile(eval(i)) - pip_dir_path = pip_dir_path[0 : pip_dir_path.rfind("/")] - for path, dir_list, file_list in os.walk(pip_dir_path): - for file_name in file_list: - file_path = os.path.join(path, file_name) - if file_path[-3:] == ".py" and file_path[-11:] != "__init__.py" and file_path[-8:] != "setup.py": - list_pip_path.append(os.path.abspath(file_path)) - except TypeError as te: - logger.error( - f"Please reinstall certain pip modules as its detected as a built-in module " - f"and the installation path cannot be retrieved: {te}" - ) - - return list_pip_path diff --git a/neural_coder/utils/line_operation.py b/neural_coder/utils/line_operation.py deleted file mode 100644 index abac3fba6ff..00000000000 --- a/neural_coder/utils/line_operation.py +++ /dev/null @@ -1,148 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# get line's indent level -def get_line_indent_level(line: str) -> int: - if list(set(line)) == [" "]: - return 0 - else: - return len(line) - len(line.lstrip()) - - -# determine if line is multi-line comment -def multi_line_comment_detection(line: str, previous_line_is_multi_line_comment: bool, end_ml_comment_flag: bool): - this_line_is_multi_line_comment = previous_line_is_multi_line_comment - - if previous_line_is_multi_line_comment: - if end_ml_comment_flag: - this_line_is_multi_line_comment = False - else: - this_line_is_multi_line_comment = True - if '"""' in line: # end of multi line comment - end_ml_comment_flag = True - else: - end_ml_comment_flag = False - else: - if '"""' in line and line.count('"') == 3: # start of multi line comment, e.g. [ """] - this_line_is_multi_line_comment = True - end_ml_comment_flag = False - else: - this_line_is_multi_line_comment = False - end_ml_comment_flag = False - - if not this_line_is_multi_line_comment: - if '"""' in line: - this_line_is_multi_line_comment = True - end_ml_comment_flag = False - - if '"""' in line and line.count('"') == 6: - this_line_is_multi_line_comment = True - end_ml_comment_flag = True - - return this_line_is_multi_line_comment, end_ml_comment_flag - - -# determine if line is single-line comment or empty -def single_line_comment_or_empty_line_detection(line: str) -> bool: - this_line_is_single_line_comment_or_empty_line = False - - if len(line) == 0 or line.isspace(): # empty line or all spaces - this_line_is_single_line_comment_or_empty_line = True - elif '"""' in line and line.count('"') == 6: # e.g. [ """ some single-line comment """] - this_line_is_single_line_comment_or_empty_line = True - # e.g. [ # some single-line comment] - elif len(line) > 0 and len(line.lstrip()) > 0 and line.lstrip()[0] == "#": - this_line_is_single_line_comment_or_empty_line = True - - return this_line_is_single_line_comment_or_empty_line - - -# determine if line is a eval func of model_name, -# like "xxx = model_name(yyy)" or "model_name(yyy)" or "model_name.some_func(yyy)" -def is_eval_func_model_name(model_name: str, line: str) -> str: - line_ = line.replace(" ", "") - # model(input) - judge_1 = line_.find(model_name + "(") > -1 - judge_2 = ( - line_.find("=") > 0 - and line_.find("=") < line_.find(model_name) - and line_[line_.find("=") + 1 : line_.find("(")] == model_name - ) or line_.find(model_name) == 0 - # model.some_func(input) - judge_3 = line_.find(model_name + ".") > -1 - judge_4 = line_.find("(") > -1 - judge_5 = ( - line_.find("=") > 0 - and line_.find("=") < line_.find(model_name) - and line_[line_.find("=") + 1 : line_.find(".")] == model_name - ) or line_.find(model_name) == 0 - exclude_function_list = [ - "__init__", - "to", - "eval", - "train", - "optimize", - "model", - "framework", - "config", - "load_state_dict", - "cpu", - "cuda", - "contiguous", - "features", - "freeze_feature_encoder", - ] - judge_6 = line_[line_.find(".") + 1 : line_.find("(")] not in exclude_function_list - judge_7 = "model.config" not in line and "model.features" not in line - judge_8 = "model(**inputs)" in line - - if judge_1 and judge_2: - return True, "forward" - elif judge_3 and judge_4 and judge_5 and judge_6 and judge_7: - return True, "non-forward" - elif judge_8: - return True, "non-forward" - else: - return False, "not an eval func" - - -# get lhs of line of format "xxx = yyy" -def get_line_left_hand_side(line: str) -> str: - line_ = line.replace(" ", "") - lhs = line_[: line_.find("=")] - return lhs - - -# determine if line is for format "xxx = yyy(zzz)" and get lhs and rhs of "=" -def of_definition_format(line: str): - line_ = line.replace(" ", "") - is_def = False - lhs = "" - rhs = "" - if "=" in line_ and "(" in line_ and line_.find("=") < line_.find("("): - is_def = True - lhs = line_[: line_.find("=")] - rhs = line_[line_.find("=") + 1 : line_.find("(")] - if "." not in rhs: - pass - else: - rhs = rhs[rhs.find(".") + 1 :] - return is_def, lhs, rhs - - -# get the line without comment -def get_line_wo_comment(line: str): - line = line[: line.find("#")].rstrip() - return line diff --git a/neural_coder/utils/numa_launcher.py b/neural_coder/utils/numa_launcher.py deleted file mode 100644 index 9563d44ee8b..00000000000 --- a/neural_coder/utils/numa_launcher.py +++ /dev/null @@ -1,913 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from __future__ import absolute_import, division, print_function, unicode_literals - -import glob -import logging -import os -import platform -import re -import subprocess -import sys -from argparse import REMAINDER, ArgumentParser, RawTextHelpFormatter -from datetime import datetime -from os.path import expanduser - -import numpy as np -import psutil - -format_str = "%(asctime)s - %(name)s - %(levelname)s - %(message)s" -logging.basicConfig(level=logging.INFO, format=format_str) -logger = logging.getLogger(__name__) - - -class CPUinfo: - """Get CPU information, such as cores list and NUMA information.""" - - def __init__(self): - self.cpuinfo = [] - if platform.system() == "Windows": - raise RuntimeError("Windows platform is not supported!!!") - elif platform.system() == "Linux": - args = ["lscpu", "--parse=CPU,Core,Socket,Node"] - lscpu_info = subprocess.check_output(args, universal_newlines=True).split("\n") - - # Get information about cpu, core, socket and node - for line in lscpu_info: - pattern = r"^([\d]+,[\d]+,[\d]+,[\d]?)" - regex_out = re.search(pattern, line) - if regex_out: - self.cpuinfo.append(regex_out.group(1).strip().split(",")) - self.get_socket_info() - - def get_socket_info(self): - self.sockets = int(max([line[2] for line in self.cpuinfo])) + 1 - self.socket_physical_cores = [] # socket_id is index - self.socket_logical_cores = [] # socket_id is index - self.physical_core_socket_map = {} # phyical core to numa node id - self.logical_core_socket_map = {} # logical core to numa node id - - self.nodes = int(max([line[3] for line in self.cpuinfo])) + 1 - self.node_physical_cores = [] # node_id is index - self.node_logical_cores = [] # node_id is index - self.physical_core_node_map = {} # phyical core to numa node id - self.logical_core_node_map = {} # logical core to numa node id - - for socket_id in range(self.sockets): - cur_socket_physical_core = [] - cur_socket_logical_core = [] - for line in self.cpuinfo: - if socket_id == int(line[2]): - if int(line[1]) not in cur_socket_physical_core: - cur_socket_physical_core.append(int(line[1])) - self.physical_core_socket_map[int(line[1])] = int(socket_id) - cur_socket_logical_core.append(int(line[0])) - self.logical_core_socket_map[int(line[0])] = int(socket_id) - self.socket_physical_cores.append(cur_socket_physical_core) - self.socket_logical_cores.append(cur_socket_logical_core) - - for node_id in range(self.nodes): - cur_node_physical_core = [] - cur_node_logical_core = [] - for line in self.cpuinfo: - nid = line[3] if line[3] != "" else "0" - if node_id == int(nid): - if int(line[1]) not in cur_node_physical_core: - cur_node_physical_core.append(int(line[1])) - self.physical_core_node_map[int(line[1])] = int(node_id) - cur_node_logical_core.append(int(line[0])) - self.logical_core_node_map[int(line[0])] = int(node_id) - self.node_physical_cores.append(cur_node_physical_core) - self.node_logical_cores.append(cur_node_logical_core) - - def socket_nums(self): - return self.sockets - - def node_nums(self): - return self.nodes - - def physical_core_nums(self): - return len(self.node_physical_cores) * len(self.node_physical_cores[0]) - - def logical_core_nums(self): - return len(self.node_logical_cores) * len(self.node_logical_cores[0]) - - def get_node_physical_cores(self, node_id): - if node_id < 0 or node_id > self.nodes - 1: - logger.error("Invalid node id") - return self.node_physical_cores[node_id] - - def get_node_logical_cores(self, node_id): - if node_id < 0 or node_id > self.nodes - 1: - logger.error("Invalid node id") - return self.node_logical_cores[node_id] - - def get_all_physical_cores(self): - return np.array(self.node_physical_cores).flatten().tolist() - - def get_all_logical_cores(self): - return np.array(self.node_logical_cores).flatten().tolist() - - def numa_aware_check(self, core_list): - """Check whether all cores in core_list are in the same NUMA node. - - cross NUMA will reduce performance. - We strongly advice to not use cores on different nodes. - """ - cores_numa_map = self.logical_core_node_map - if len(core_list) < 1: - return True - numa_ids = [] - for core in core_list: - numa_id = cores_numa_map[core] - if numa_id not in numa_ids: - numa_ids.append(numa_id) - if len(numa_ids) > 1: - logger.warning("Numa Aware: cores:{} on different NUMA nodes:{}".format(str(core_list), str(numa_ids))) - return numa_ids - - -class Launcher: - r"""Base class for launcher.""" - - def __init__(self): - self.cpuinfo = CPUinfo() - - def launch(self, args): - pass - - def add_lib_preload(self, lib_type=None): - """Enale TCMalloc/JeMalloc/intel OpenMP.""" - library_paths = [] - if "CONDA_PREFIX" in os.environ: - library_paths.append(os.environ["CONDA_PREFIX"] + "/lib/") - if "VIRTUAL_ENV" in os.environ: - library_paths.append(os.environ["VIRTUAL_ENV"] + "/lib/") - - library_paths += [ - "{}/.local/lib/".format(expanduser("~")), - "/usr/local/lib/", - "/usr/local/lib64/", - "/usr/lib/", - "/usr/lib64/", - ] - - lib_find = False - lib_set = False - for item in os.getenv("LD_PRELOAD", "").split(":"): - if item.endswith("lib{}.so".format(lib_type)): - lib_set = True - break - if not lib_set: - for lib_path in library_paths: - library_file = lib_path + "lib" + lib_type + ".so" - matches = glob.glob(library_file) - if len(matches) > 0: - if "LD_PRELOAD" in os.environ: - os.environ["LD_PRELOAD"] = matches[0] + ":" + os.environ["LD_PRELOAD"] - else: - os.environ["LD_PRELOAD"] = matches[0] - lib_find = True - break - return lib_set or lib_find - - def set_memory_allocator(self, enable_tcmalloc=True, enable_jemalloc=False, use_default_allocator=False): - """Enable TCMalloc/JeMalloc with LD_PRELOAD and set configuration for JeMalloc. - - By default, PTMalloc will be used for PyTorch, but TCMalloc and JeMalloc can get better - memory reuse and reduce page fault to improve performance. - """ - if enable_tcmalloc and enable_jemalloc: - logger.error("Unable to enable TCMalloc and JEMalloc at the same time") - exit(-1) - - if enable_tcmalloc: - find_tc = self.add_lib_preload(lib_type="tcmalloc") - if not find_tc: - logger.warning( - "Unable to find the {} library file lib{}.so in $CONDA_PREFIX/lib \ - or $VIRTUAL_ENV/lib" - " or /.local/lib/ or /usr/local/lib/ or /usr/local/lib64/ or /usr/lib \ - or /usr/lib64 or " - "{}/.local/lib/ so the LD_PRELOAD environment variable will not be set." - "you can use 'conda install -c conda-forge gperftools' to install tcmalloc".format( - "TCmalloc", "tcmalloc", expanduser("~") - ) - ) - else: - logger.info("Use TCMalloc memory allocator") - - elif enable_jemalloc: - find_je = self.add_lib_preload(lib_type="jemalloc") - if not find_je: - logger.warning( - "Unable to find the {} library file lib{}.so in \ - $CONDA_PREFIX/lib or $VIRTUAL_ENV/lib" - " or /.local/lib/ or /usr/local/lib/ or /usr/local/lib64/ or \ - /usr/lib or /usr/lib64 or " - "{}/.local/lib/ so the LD_PRELOAD environment variable will not be set." - "you can use 'conda install -c conda-forge jemalloc' to install jemalloc".format( - "JeMalloc", "jemalloc", expanduser("~") - ) - ) - else: - logger.info("Use JeMalloc memory allocator") - self.set_env("MALLOC_CONF", "oversize_threshold:1,background_thread:true,metadata_thp:auto") - - elif use_default_allocator: - pass - - else: - find_tc = self.add_lib_preload(lib_type="tcmalloc") - if find_tc: - logger.info("Use TCMalloc memory allocator") - return - find_je = self.add_lib_preload(lib_type="jemalloc") - if find_je: - logger.info("Use JeMalloc memory allocator") - return - logger.warning( - "Neither TCMalloc nor JeMalloc is found in $CONDA_PREFIX/lib or $VIRTUAL_ENV/lib" - " or /.local/lib/ or /usr/local/lib/ or /usr/local/lib64/ or /usr/lib or /usr/lib64 or " - "{}/.local/lib/ so the LD_PRELOAD environment variable will not be set. \ - This may drop the performance".format( - expanduser("~") - ) - ) - - def logger_env(self, env_name=""): - if env_name in os.environ: - logger.info("{}={}".format(env_name, os.environ[env_name])) - - def set_env(self, env_name, env_value=None): - if not env_value: - logger.warning("{} is None".format(env_name)) - if env_name not in os.environ: - os.environ[env_name] = env_value - elif os.environ[env_name] != env_value: - logger.warning( - "{} in environment variable is {} while the value you set is {}".format( - env_name, os.environ[env_name], env_value - ) - ) - logger.warning("Resetting {} to {}".format(env_name, env_value)) - os.environ[env_name] = env_value - self.logger_env(env_name) - - # set_kmp_affinity is used to control whether to set KMP_AFFINITY or not. - # In scenario that use all cores on all nodes, including logical cores, - # setting KMP_AFFINITY disables logical cores. - # In this case, KMP_AFFINITY should not be set. - def set_multi_thread_and_allocator( - self, - ncore_per_instance, - disable_iomp=False, - set_kmp_affinity=True, - enable_tcmalloc=True, - enable_jemalloc=False, - use_default_allocator=False, - ): - """Set multi-thread configuration and enable Intel openMP and TCMalloc/JeMalloc. - - By default, GNU openMP and PTMalloc are used in PyTorch. - but Intel openMP and TCMalloc/JeMalloc are better alternatives - to get performance benefit. - """ - self.set_memory_allocator(enable_tcmalloc, enable_jemalloc, use_default_allocator) - self.set_env("OMP_NUM_THREADS", str(ncore_per_instance)) - if not disable_iomp: - find_iomp = self.add_lib_preload(lib_type="iomp5") - if not find_iomp: - logger.warning( - "Unable to find the {} library file lib{}.so \ - in $CONDA_PREFIX/lib or $VIRTUAL_ENV/lib" - " or /.local/lib/ or /usr/local/lib/ or \ - /usr/local/lib64/ or /usr/lib or /usr/lib64 or " - "{}/.local/lib/ so the LD_PRELOAD environment variable will not be set." - "you can use 'conda install intel-openm' to install intel openMP".format( - "iomp", "iomp5", expanduser("~") - ) - ) - else: - logger.info("Using Intel OpenMP") - if set_kmp_affinity: - self.set_env("KMP_AFFINITY", "granularity=fine,compact,1,0") - self.set_env("KMP_BLOCKTIME", "1") - self.logger_env("LD_PRELOAD") - - -class MultiInstanceLauncher(Launcher): - r"""Launcher for single instance and multi-instance.""" - - def launch(self, args): - processes = [] - cores = [] - set_kmp_affinity = True - if args.core_list: # user specify what cores will be used by params - cores = [int(x) for x in args.core_list.split(",")] - if args.ncore_per_instance == -1: - logger.error("please specify the '--ncore_per_instance' if you have pass the --core_list params") - exit(-1) - elif args.ninstances > 1 and args.ncore_per_instance * args.ninstances < len(cores): - logger.warning( - "only first {} cores will be used, but you specify {} cores in core_list".format( - args.ncore_per_instance * args.ninstances, len(cores) - ) - ) - else: - args.ninstances = len(cores) // args.ncore_per_instance - - else: - if args.use_logical_core: - if args.node_id != -1: - cores = self.cpuinfo.get_node_logical_cores(args.node_id) - else: - cores = self.cpuinfo.get_all_logical_cores() - # When using all cores on all nodes, including logical cores, - # setting KMP_AFFINITY disables logical cores. - # Thus, KMP_AFFINITY should not be set. - set_kmp_affinity = False - else: - if args.node_id != -1: - cores = self.cpuinfo.get_node_physical_cores(args.node_id) - else: - cores = self.cpuinfo.get_all_physical_cores() - if not args.multi_instance and args.ninstances == -1 and args.ncore_per_instance == -1: - args.ninstances = 1 - args.ncore_per_instance = len(cores) - elif args.multi_instance and args.ninstances == -1 and args.ncore_per_instance == -1: - args.throughput_mode = True - elif args.ncore_per_instance == -1 and args.ninstances != -1: - if args.ninstances > len(cores): - logger.error( - "there are {} total cores but you specify {} ninstances; \ - please make sure ninstances <= total_cores)".format( - len(cores), args.ninstances - ) - ) - exit(-1) - else: - args.ncore_per_instance = len(cores) // args.ninstances - elif args.ncore_per_instance != -1 and args.ninstances == -1: - args.ninstances = len(cores) // args.ncore_per_instance - else: - if args.ninstances * args.ncore_per_instance > len(cores): - logger.error("Please make sure ninstances * ncore_per_instance <= total_cores") - exit(-1) - if args.latency_mode: - logger.warning( - "--latency_mode is exclusive to --ninstances, \ - --ncore_per_instance, --node_id and --use_logical_core. \ - They won't take effect even they are set explicitly." - ) - args.ncore_per_instance = 4 - cores = self.cpuinfo.get_all_physical_cores() - args.ninstances = len(cores) // args.ncore_per_instance - - if args.throughput_mode: - logger.warning( - "--throughput_mode is exclusive to --ninstances, \ - --ncore_per_instance, --node_id and --use_logical_core. \ - They won't take effect even they are set explicitly." - ) - args.ninstances = self.cpuinfo.node_nums() - cores = self.cpuinfo.get_all_physical_cores() - args.ncore_per_instance = len(cores) // args.ninstances - - if args.ninstances > 1 and args.instance_idx != -1: - logger.info("assigning {} cores for instance {}".format(args.ncore_per_instance, args.instance_idx)) - - self.set_multi_thread_and_allocator( - args.ncore_per_instance, - args.disable_iomp, - set_kmp_affinity, - args.enable_tcmalloc, - args.enable_jemalloc, - args.use_default_allocator, - ) - os.environ["LAUNCH_CMD"] = "#" - for i in range(args.ninstances): - cmd = [] - cur_process_cores = "" - if not args.disable_numactl: - cmd = ["numactl"] - cores = sorted(cores) - if args.instance_idx == -1: # sequentially assign ncores_per_instance to ninstances - core_list = cores[i * args.ncore_per_instance : (i + 1) * args.ncore_per_instance] - else: # assign ncores_per_instance from instance_idx - core_list = cores[ - args.instance_idx * args.ncore_per_instance : (args.instance_idx + 1) * args.ncore_per_instance - ] - - core_ranges = [] - for core in core_list: - if len(core_ranges) == 0: - range_elem = {"start": core, "end": core} - core_ranges.append(range_elem) - else: - if core - core_ranges[-1]["end"] == 1: - core_ranges[-1]["end"] = core - else: - range_elem = {"start": core, "end": core} - core_ranges.append(range_elem) - for r in core_ranges: - cur_process_cores = cur_process_cores + "{}-{},".format(r["start"], r["end"]) - cur_process_cores = cur_process_cores[:-1] - numa_params = "-C {} ".format(cur_process_cores) - numa_params += "-m {}".format( - ",".join([str(numa_id) for numa_id in self.cpuinfo.numa_aware_check(core_list)]) - ) - cmd.extend(numa_params.split()) - with_python = not args.no_python - if with_python: - cmd.append(sys.executable) - cmd.append("-u") - if args.module: - cmd.append("-m") - cmd.append(args.program) - log_name = ( - args.log_file_prefix + "_instance_{}_cores_".format(i) + cur_process_cores.replace(",", "_") + ".log" - ) - log_name = os.path.join(args.log_path, log_name) - cmd.extend(args.program_args) - os.environ["LAUNCH_CMD"] += " ".join(cmd) + ",#" - cmd_s = " ".join(cmd) - cmd_s = "{} 2>&1 | tee -a {}".format(cmd_s, args.log_path) - logger.info(cmd_s) - process = subprocess.Popen(cmd_s, env=os.environ, shell=True) # nosec - processes.append(process) - - if args.instance_idx != -1: # launches single instance, instance_idx, only - break - - os.environ["LAUNCH_CMD"] = os.environ["LAUNCH_CMD"][:-2] - for process in processes: - process.wait() - if process.returncode != 0: - raise subprocess.CalledProcessError(returncode=process.returncode, cmd=cmd_s) - - -class DistributedTrainingLauncher(Launcher): - r"""Launcher for distributed training with MPI launcher.""" - - def get_mpi_pin_domain(self, nproc_per_node, ccl_worker_count, total_cores): - """I_MPI_PIN_DOMAIN specify the cores used for every MPI process. - - The first ccl_worker_count cores of every rank for ccl communication - and the other cores will be used to do computation. - For example: on CascadeLake 8280 CPU, 2 ranks on one node. ccl_worker_count=4 - CCL_WORKER_COUNT=4 - CCL_WORKER_AFFINITY="0,1,2,3,28,29,30,31" - I_MPI_PIN_DOMAIN=[0xffffff0,0xffffff0000000] - """ - ppn = nproc_per_node - cores_per_rank = total_cores // ppn - pin_domain = "[" - for proc in range(ppn): - domain_binary = 0 - begin = proc * cores_per_rank + ccl_worker_count - end = proc * cores_per_rank + cores_per_rank - 1 - for i in range(begin, end + 1): - domain_binary |= 1 << i - pin_domain += hex(domain_binary) + "," - pin_domain += "]" - return pin_domain - - def get_ccl_worker_affinity(self, nproc_per_node, ccl_worker_count, total_cores): - """Computation and communication use different cores when using oneCCL - backend for distributed training. - - we use first ccl_worker_count cores of - every rank for ccl communication - """ - ppn = nproc_per_node - cores_per_rank = total_cores // ppn - affinity = "" - for proc in range(ppn): - for ccl_worker in range(ccl_worker_count): - affinity += str(proc * cores_per_rank + ccl_worker) + "," - affinity = affinity[:-1] - return affinity - - def launch(self, args): - """Set ENVs and launch MPI process for distributed training.""" - if args.nnodes > 1 and not os.path.exists(args.hostfile): - raise ValueError( - "hostfile is necessary when you use multi-node distributed training," - "Please create hostfile which include the ip list you used for distributed running" - ) - elif args.nnodes > 1: - ipv4_addr_pattern = ( - r"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$" - ) - ip_list = [] - with open(args.hostfile) as f: - for line in f: - line = line.strip().strip("\n") - # is_valid = re.match(ipv4_addr_pattern, line) - # if not is_valid: - # logger.error("{} is not valid IPV4 address".format(line)) - # exit(-1) - # else: - # ip_list.append(line) - ip_list.append(line) - if len(ip_list) < args.nnodes: - logger.error( - "The number of IP {} should greater than nnodes parameters {}".format(len(ip_list), args.nnodes) - ) - exit(-1) - master_check = False - dic = psutil.net_if_addrs() - for adapter in dic: - snicList = dic[adapter] - for snic in snicList: - if snic.address == ip_list[0]: - master_check = True - if not master_check: - logger.error( - "MASTER_ADDR is incorrect. Please make sure the first line {} \ - in your hostfile is ip address of the current node".format( - ip_list[0] - ) - ) - exit(-1) - - logger.info("Begin to validate the ip connect") - args.master_addr = ip_list[0] - for ip in ip_list[1:]: - completed_process = subprocess.run( - "ssh -o PasswordAuthentication=no {} ':'".format(ip), shell=True - ) # nosec - if completed_process.returncode != 0: - logger.error( - "Passwordless SSH login to {} failed, please \ - make sure you have setup SSH public key right" - ) - exit(-1) - else: - logger.info("connection from master node {} to slave node {} is OK".format(args.master_addr, ip)) - - total_cores_per_node = self.cpuinfo.physical_core_nums() - if args.use_logical_core: - total_cores_per_node = self.cpuinfo.logical_core_nums() - - # set distributed related environmental variables - self.set_env("MASTER_ADDR", args.master_addr) - self.set_env("MASTER_PORT", str(args.master_port)) - mpi_pin_domain = self.get_mpi_pin_domain(args.nproc_per_node, args.ccl_worker_count, total_cores_per_node) - self.set_env("I_MPI_PIN_DOMAIN", mpi_pin_domain) - - ppn = args.nproc_per_node - cores_per_rank = total_cores_per_node // ppn - - opm_num_threads = cores_per_rank - args.ccl_worker_count - self.set_multi_thread_and_allocator( - opm_num_threads, - args.disable_iomp, - True, - args.enable_tcmalloc, - args.enable_jemalloc, - args.use_default_allocator, - ) - - self.set_env("CCL_WORKER_COUNT", str(args.ccl_worker_count)) - ccl_affinity = self.get_ccl_worker_affinity(args.nproc_per_node, args.ccl_worker_count, total_cores_per_node) - self.set_env("CCL_WORKER_AFFINITY", ccl_affinity) - - os.environ["LAUNCH_CMD"] = "#" - cmd = ["mpiexec.hydra"] - mpi_config = "-l -np {} -ppn {} -genv I_MPI_PIN_DOMAIN={} -genv OMP_NUM_THREADS={} ".format( - args.nnodes * args.nproc_per_node, args.nproc_per_node, mpi_pin_domain, opm_num_threads - ) - mpi_config += args.more_mpi_params - if args.nnodes > 1: - mpi_config += " -hostfile {}".format(args.hostfile) - cmd.extend(mpi_config.split()) - with_python = not args.no_python - if with_python: - cmd.append(sys.executable) - cmd.append("-u") - if args.module: - cmd.append("-m") - cmd.append(args.program) - cmd.extend(args.program_args) - logger.info(cmd) - process = subprocess.Popen(cmd, env=os.environ) - process.wait() - os.environ["LAUNCH_CMD"] += " ".join(cmd) + ",#" - os.environ["LAUNCH_CMD"] = os.environ["LAUNCH_CMD"][:-2] - - -def add_distributed_training_params(parser): - cpuinfo = CPUinfo() - node_nums = cpuinfo.node_nums() - - group = parser.add_argument_group("Distributed Training Parameters With oneCCL backend") - group.add_argument( - "--nnodes", metavar="\b", type=int, default=1, help="The number of nodes to use for distributed " "training" - ) - group.add_argument( - "--nproc_per_node", - metavar="\b", - type=int, - default=node_nums, - help="The number of processes to launch on each node", - ) - # ccl control - group.add_argument( - "--ccl_worker_count", metavar="\b", default=4, type=int, help="Core numbers per rank used for ccl communication" - ) - # mpi control - group.add_argument( - "--master_addr", - metavar="\b", - default="127.0.0.1", - type=str, - help="Master node (rank 0)'s address, should be either " - "the IP address or the hostname of node 0, for " - "single node multi-proc training, the " - "--master_addr can simply be 127.0.0.1", - ) - group.add_argument( - "--master_port", - metavar="\b", - default=29500, - type=int, - help="Master node (rank 0)'s free port that needs to " - "be used for communication during distributed " - "training", - ) - group.add_argument( - "--hostfile", - metavar="\b", - default="hostfile", - type=str, - help="Hostfile is necessary for multi-node multi-proc " - "training. hostfile includes the node address list " - "node address which should be either the IP address" - "or the hostname.", - ) - group.add_argument( - "--more_mpi_params", - metavar="\b", - default="", - type=str, - help="User can pass more parameters for mpiexec.hydra " - "except for -np -ppn -hostfile and -genv I_MPI_PIN_DOMAIN", - ) - - -def add_memory_allocator_params(parser): - group = parser.add_argument_group("Memory Allocator Parameters") - # allocator control - group.add_argument("--enable_tcmalloc", action="store_true", default=False, help="Enable tcmalloc allocator") - group.add_argument("--enable_jemalloc", action="store_true", default=False, help="Enable jemalloc allocator") - group.add_argument( - "--use_default_allocator", action="store_true", default=False, help="Use default memory allocator" - ) - - -def add_multi_instance_params(parser): - group = parser.add_argument_group("Multi-instance Parameters") - # multi-instance control - group.add_argument("--ncore_per_instance", metavar="\b", default=-1, type=int, help="Cores per instance") - group.add_argument( - "--ninstances", - metavar="\b", - default=-1, - type=int, - help="For multi-instance,\ \ - you should give the cores number you used for per instance.", - ) - group.add_argument( - "--instance_idx", - metavar="\b", - default="-1", - type=int, - help="Specify instance index to assign ncores_per_instance for instance_idx; \ - otherwise ncore_per_instance will be assigned sequentially to ninstances. \ - Please refer to https://github.com/intel/intel-extension-for-pytorch/\ - blob/master/docs/tutorials/performance_tuning/launch_script.md", - ) - group.add_argument( - "--latency_mode", - action="store_true", - default=False, - help="By default 4 core per instance and use all physical cores", - ) - group.add_argument( - "--throughput_mode", - action="store_true", - default=False, - help="By default one instance per node and use all physical cores", - ) - group.add_argument( - "--node_id", - metavar="\b", - default=-1, - type=int, - help="node id for multi-instance, by default all nodes will be used", - ) - group.add_argument("--use_logical_core", action="store_true", default=False, help="Whether only use physical cores") - group.add_argument("--disable_numactl", action="store_true", default=False, help="Disable numactl") - group.add_argument( - "--core_list", - metavar="\b", - default=None, - type=str, - help="Specify the core list as 'core_id, core_id, ....', \ - otherwise, all the cores will be used.", - ) - group.add_argument( - "--log_path", - metavar="\b", - default="", - type=str, - help="The log file directory. Default path is '', \ - which means disable logging to files.", - ) - group.add_argument("--log_file_prefix", metavar="\b", default="run", type=str, help="log file prefix") - - -def add_kmp_iomp_params(parser): - group = parser.add_argument_group("IOMP Parameters") - group.add_argument( - "--disable_iomp", - action="store_true", - default=False, - help="By default, we use Intel OpenMP and libiomp5.so will be add to LD_PRELOAD", - ) - - -def parse_args(): - """ - Helper function parsing the command line options - @retval ArgumentParser - """ - parser = ArgumentParser( - description="This is a script for launching PyTorch training and inference on Intel Xeon CPU " - "with optimal configurations. Now, single instance inference/training, multi-instance " - "inference/training and distributed training with oneCCL backend is enabled. " - "To get the peak performance on Intel Xeon CPU, the script optimizes the configuration " - "of thread and memory management. For thread management, the script configures thread " - "affinity and the preload of Intel OMP library. For memory management, it configures " - "NUMA binding and preload optimized memory allocation library (e.g. tcmalloc, jemalloc) " - "\n################################# Basic usage ############################# \n" - "\n 1. single instance\n" - "\n >>> python -m intel_extension_for_pytorch.cpu.launch python_script args \n" - "\n2. multi-instance \n" - "\n >>> python -m intel_extension_for_pytorch.cpu.launch --ninstances xxx \ - --ncore_per_instance xx python_script args\n" - "\n3. Single-Node multi-process distributed training\n" - "\n >>> python -m intel_extension_for_pytorch.cpu.launch --distributed python_script args\n" - "\n4. Multi-Node multi-process distributed training: (e.g. two nodes)\n" - "\n rank 0: *(IP: 192.168.10.10, and has a free port: 295000)*\n" - "\n >>> python -m intel_extension_for_pytorch.cpu.launch --distributed --nproc_per_node=2\n" - "\n --nnodes=2 --hostfile hostfile python_script args\n" - "\n############################################################################# \n", - formatter_class=RawTextHelpFormatter, - ) - - parser.add_argument( - "--multi_instance", - action="store_true", - default=False, - help="Enable multi-instance, by default one instance per node", - ) - - parser.add_argument("--distributed", action="store_true", default=False, help="Enable distributed training.") - parser.add_argument( - "-m", - "--module", - default=False, - action="store_true", - help="Changes each process to interpret the launch script " - "as a python module, executing with the same behavior as" - "'python -m'.", - ) - - parser.add_argument( - "--no_python", - default=False, - action="store_true", - help='Do not prepend the --program script with "python" - just exec ' - "it directly. Useful when the script is not a Python script.", - ) - - add_memory_allocator_params(parser) - add_kmp_iomp_params(parser) - - add_distributed_training_params(parser) - add_multi_instance_params(parser) - # positional - parser.add_argument( - "program", - type=str, - help="The full path to the proram/script to be launched. " "followed by all the arguments for the script", - ) - - # rest from the training program - parser.add_argument("program_args", nargs=REMAINDER) - return parser.parse_args() - - -def exec_launcher(ncore_per_instance, ninstances, program, program_args, log_path): - env_before = set(os.environ.keys()) - if platform.system() == "Windows": - raise RuntimeError("Windows platform is not supported!!!") - - # args = parse_args() - import argparse - - args = argparse.Namespace( - multi_instance=True, - distributed=False, - module=False, - no_python=False, - enable_tcmalloc=False, - enable_jemalloc=False, - use_default_allocator=False, - disable_iomp=False, - nnodes=1, - nproc_per_node=2, - ccl_worker_count=4, - master_addr="127.0.0.1", - master_port=29500, - hostfile="hostfile", - more_mpi_params="", - ncore_per_instance=ncore_per_instance, - ninstances=ninstances, - instance_idx=-1, - latency_mode=False, - throughput_mode=False, - node_id=-1, - use_logical_core=False, - disable_numactl=False, - core_list=None, - log_path=log_path, - log_file_prefix="run", - program=program, - program_args=program_args, - ) - - # if args.log_path: - # path = os.path.dirname(args.log_path if args.log_path.endswith('/') else args.log_path + '/') - # if not os.path.exists(path): - # os.makedirs(path) - # args.log_path = path - - # args.log_file_prefix = '{}_{}'.format(args.log_file_prefix, datetime.now().strftime("%Y%m%d%H%M%S")) - # fileHandler = logging.FileHandler("{0}/{1}_instances.log".format(args.log_path, args.log_file_prefix)) - # logFormatter = logging.Formatter(format_str) - # fileHandler.setFormatter(logFormatter) - # logger.addHandler(fileHandler) - - if args.distributed and args.multi_instance: - raise RuntimeError("Either args.distributed or args.multi_instance should be set") - - if args.latency_mode and args.throughput_mode: - raise RuntimeError("Either args.latency_mode or args.throughput_mode should be set") - - if args.nnodes > 1: - args.distributed = True - - if not args.no_python and not args.program.endswith(".py"): - logger.error("For non Python script, you should use '--no_python' parameter.") - exit() - - # Verify LD_PRELOAD - if "LD_PRELOAD" in os.environ: - lst_valid = [] - tmp_ldpreload = os.environ["LD_PRELOAD"] - for item in tmp_ldpreload.split(":"): - matches = glob.glob(item) - if len(matches) > 0: - lst_valid.append(item) - else: - logger.warning("{} doesn't exist. Removing it from LD_PRELOAD.".format(item)) - if len(lst_valid) > 0: - os.environ["LD_PRELOAD"] = ":".join(lst_valid) - else: - os.environ["LD_PRELOAD"] = "" - - launcher = None - if args.distributed: - launcher = DistributedTrainingLauncher() - else: - launcher = MultiInstanceLauncher() - - launcher.launch(args) - for x in sorted(set(os.environ.keys()) - env_before): - logger.debug("{0}={1}".format(x, os.environ[x])) diff --git a/neural_coder/utils/pdf_report.py b/neural_coder/utils/pdf_report.py deleted file mode 100644 index 3a333f34592..00000000000 --- a/neural_coder/utils/pdf_report.py +++ /dev/null @@ -1,424 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# from reportlab.pdfgen import canvas -# from reportlab.platypus import ( -# SimpleDocTemplate, Paragraph, PageBreak, Image, Spacer, Table, TableStyle) -# from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY -# from reportlab.lib.styles import ParagraphStyle, getSampleStyleSheet -# from reportlab.lib.pagesizes import LETTER, inch -# from reportlab.graphics.shapes import Line, LineShape, Drawing, String -# from reportlab.lib.colors import Color - - -# class FooterCanvas(canvas.Canvas): - -# def __init__(self, *args, **kwargs): -# canvas.Canvas.__init__(self, *args, **kwargs) -# self.pages = [] -# self.width, self.height = LETTER - -# def showPage(self): -# self.pages.append(dict(self.__dict__)) -# self._startPage() - -# def save(self): -# page_count = len(self.pages) -# for page in self.pages: -# self.__dict__.update(page) -# if (self._pageNumber > 1): -# self.draw_canvas(page_count) -# canvas.Canvas.showPage(self) -# canvas.Canvas.save(self) - -# def draw_canvas(self, page_count): -# page = "Page %s of %s" % (self._pageNumber, page_count) -# x = 128 -# self.saveState() -# self.setStrokeColorRGB(0, 0, 0) -# self.setLineWidth(0.5) -# self.line(20, 740, LETTER[0] - 50, 740) -# self.line(66, 78, LETTER[0] - 66, 78) -# self.setFont('Times-Roman', 10) -# self.drawString(LETTER[0] - x, 65, page) -# self.restoreState() - - -# class PDFReport: - -# def __init__(self, -# path, -# list_optimization_set_top3, -# list_performance_top3, -# original_model_ranking, -# original_model_performance, -# list_config_best_ncpi, -# list_config_best_nins, -# list_config_best_bs, -# list_config_best_performance, -# TCO_unit_pricing, # 2.448 -# cloud_vendor, # "AWS" -# cloud_instance_type, # "c6i" -# ): -# self.path = path -# self.styleSheet = getSampleStyleSheet() -# self.elements = [] - -# # from superbench results -# self.list_optimization_set_top3 = list_optimization_set_top3 -# self.list_performance_top3 = list_performance_top3 -# self.original_model_ranking = original_model_ranking -# self.original_model_performance = original_model_performance - -# self.list_config_best_ncpi = list_config_best_ncpi -# self.list_config_best_nins = list_config_best_nins -# self.list_config_best_bs = list_config_best_bs -# self.list_config_best_performance = list_config_best_performance - -# # from Cloud -# self.TCO_unit_pricing = TCO_unit_pricing -# self.cloud_vendor = cloud_vendor -# self.cloud_instance_type = cloud_instance_type - -# # colors -# self.IntelBlueDark = Color((0 / 255), (74 / 255), (134 / 255), 1) -# self.IntelBlueLight = Color((0 / 255), (178 / 255), (227 / 255), 1) -# self.IntelBlueReg = Color((0 / 255), (104 / 255), (181 / 255), 1) - -# self.nextPagesHeader(True) -# self.MainpageMaker() - -# self.doc = SimpleDocTemplate(path, pagesize=LETTER) -# self.doc.multiBuild(self.elements, canvasmaker=FooterCanvas) - -# def nextPagesHeader(self, isSecondPage): -# if isSecondPage: -# psHeaderText = ParagraphStyle( -# 'Hed0', fontSize=20, alignment=TA_LEFT, borderWidth=3, textColor=self.IntelBlueDark) -# text = 'AI Deployment Report' -# paragraphReportHeader = Paragraph(text, psHeaderText) -# self.elements.append(paragraphReportHeader) - -# spacer = Spacer(10, 15) -# self.elements.append(spacer) - -# d = Drawing(500, 1) -# line = Line(0, 0, 460, 0) -# line.strokeColor = self.IntelBlueReg -# line.strokeWidth = 2.5 -# d.add(line) -# self.elements.append(d) - -# spacer = Spacer(10, 2) -# self.elements.append(spacer) - -# d = Drawing(500, 1) -# line = Line(0, 0, 460, 0) -# line.strokeColor = self.IntelBlueReg -# line.strokeWidth = 1 -# d.add(line) -# self.elements.append(d) - -# spacer = Spacer(10, 15) -# self.elements.append(spacer) - -# def MainpageMaker(self): -# # Optimization Table - -# psHeaderText = ParagraphStyle( -# 'Hed0', fontSize=16, alignment=TA_LEFT, borderWidth=3, textColor=self.IntelBlueDark) -# text = 'Best Optimization (Default Config)' -# paragraphReportHeader = Paragraph(text, psHeaderText) -# self.elements.append(paragraphReportHeader) - -# spacer = Spacer(5, 11) -# self.elements.append(spacer) - -# psHeaderText = ParagraphStyle( -# 'Hed0', fontSize=12, alignment=TA_JUSTIFY) -# text = "Congratulations! You are able to boost deployment performance up to " \ -# + "" + str(round(self.list_performance_top3[0] / self.original_model_performance, 1)) + \ -# "" + "X on your model with the most performant " -# "Deep Learning acceleration optimization set." -# paragraphReportHeader = Paragraph(text, psHeaderText) -# self.elements.append(paragraphReportHeader) - -# spacer = Spacer(10, 15) -# self.elements.append(spacer) - -# d = [] -# textData = ["Ranking", "Optimization Set", "Performance (sample/sec)"] - -# fontSize = 8 -# centered = ParagraphStyle(name="centered", alignment=TA_LEFT) -# for text in textData: -# ptext = "%s" % (fontSize, text) -# titlesTable = Paragraph(ptext, centered) -# d.append(titlesTable) - -# data = [d] -# formattedLineData = [] - -# alignStyle = [ParagraphStyle(name="01", alignment=TA_LEFT), -# ParagraphStyle(name="02", alignment=TA_LEFT), -# ParagraphStyle(name="03", alignment=TA_LEFT), ] - -# list_ranking = [1, 2, 3] -# list_ranking.append(self.original_model_ranking) -# list_optimization_set = self.list_optimization_set_top3 -# list_optimization_set.append(['Default']) -# list_performance = self.list_performance_top3 -# list_performance.append(self.original_model_performance) - -# list_optimization_set_display = [] -# for i in list_optimization_set: -# i = str(i).replace("[", "").replace("]", "").replace( -# "'", "").replace('"', "").replace(",", " +") -# i = i.replace("pytorch_", "") -# i = i.replace( -# "inc_static_quant_fx", "Intel Neural Compressor Post-Training Static Quantization (FX)") -# i = i.replace( -# "inc_static_quant_ipex", "Intel Neural Compressor Post-Training Static Quantization (IPEX)") -# i = i.replace( -# "inc_dynamic_quant", "Intel Neural Compressor Post-Training Dynamic Quantization") -# i = i.replace("channels_last", "Channels Last") -# i = i.replace("ipex_fp32", "Intel Extension for PyTorch FP32") -# i = i.replace("ipex_bf16", "Intel Extension for PyTorch BF16") -# i = i.replace("ipex_bf16", "Intel Extension for PyTorch BF16") -# i = i.replace("ipex_int8_static_quant", -# "Intel Extension for PyTorch INT8 Static Quantization") -# i = i.replace("ipex_int8_dynamic_quant", -# "Intel Extension for PyTorch INT8 Dynamic Quantization") -# i = i.replace("torchdynamo_", "TorchDynamo ") -# i = i.replace("jit_script", "JIT Script") -# i = i.replace("jit_trace", "JIT Trace") -# i = i.replace("_ofi", " with JIT Optimize-for-Inference") -# i = i.replace("mixed_precision_cpu", -# "Automatic Mixed Precision (CPU)") -# i = i.replace("mixed_precision_cuda", -# "Automatic Mixed Precision (CUDA)") - -# list_optimization_set_display.append(i) -# for i in range(len(list_ranking)): -# lineData = [list_ranking[i], list_optimization_set_display[i], int( -# list_performance[i])] -# columnNumber = 0 -# for item in lineData: -# ptext = "%s" % (fontSize - 1, item) -# p = Paragraph(ptext, alignStyle[columnNumber]) -# formattedLineData.append(p) -# columnNumber = columnNumber + 1 -# data.append(formattedLineData) -# formattedLineData = [] - -# # totalRow = ["The most performant optimization set is: " + list_optimization_set_display[0]] -# # for item in totalRow: -# # ptext = "%s" % (fontSize-1, item) -# # p = Paragraph(ptext, alignStyle[1]) -# # formattedLineData.append(p) -# # data.append(formattedLineData) - -# table = Table(data, colWidths=[50, 290, 120]) -# tStyle = TableStyle([ -# ('ALIGN', (0, 0), (0, -1), 'LEFT'), -# ('VALIGN', (0, 0), (-1, -1), 'TOP'), -# ("ALIGN", (1, 0), (1, -1), 'RIGHT'), -# ('LINEABOVE', (0, 0), (-1, -1), 1, self.IntelBlueLight), -# ('BACKGROUND', (0, 0), (-1, 0), self.IntelBlueLight), -# ('BACKGROUND', (0, 5), (0, 0), Color( -# (225 / 255), (225 / 255), (225 / 255), 1)), -# ('BACKGROUND', (3, 5), (0, 3), Color( -# (240 / 255), (240 / 255), (240 / 255), 1)), -# ('LINEBELOW', (0, 0), (-1, -1), 1, self.IntelBlueLight), -# ]) -# table.setStyle(tStyle) -# self.elements.append(table) - -# spacer = Spacer(10, 2) -# self.elements.append(spacer) -# psHeaderText = ParagraphStyle('Hed0', fontSize=7, alignment=TA_JUSTIFY) -# from neural_coder.utils.cpu_info import get_num_cpu_cores -# text = "*(1) All optimization sets are measured with default configuration " \ -# "(single instance on single socket), among which the top 3 performant ones are displayed. " \ -# "(2) This report evaluates performance only (accuracy under development)." -# paragraphReportHeader = Paragraph(text, psHeaderText) -# self.elements.append(paragraphReportHeader) - -# spacer = Spacer(10, 10) -# self.elements.append(spacer) - -# # Configuration Table - -# psHeaderText = ParagraphStyle( -# 'Hed0', fontSize=16, alignment=TA_LEFT, borderWidth=3, textColor=self.IntelBlueDark) -# text = 'Best Optimization (Sweeping Configs)' -# paragraphReportHeader = Paragraph(text, psHeaderText) -# self.elements.append(paragraphReportHeader) - -# spacer = Spacer(5, 11) -# self.elements.append(spacer) - -# psHeaderText = ParagraphStyle( -# 'Hed0', fontSize=12, alignment=TA_JUSTIFY) -# text = "For the most performant optimization set, " \ -# "you can further boost your deployment performance to up to " \ -# + "" + \ -# str(round(self.list_config_best_performance[0] / self.original_model_performance, 1)) + "" + \ -# "X if using the most performant deployment configuration according to our sweeping result." -# paragraphReportHeader = Paragraph(text, psHeaderText) -# self.elements.append(paragraphReportHeader) - -# spacer = Spacer(10, 15) -# self.elements.append(spacer) - -# d = [] -# textData = ["Category", "Num Instances", -# "Num Cores Per Instance", "BS", "Performance (sample/sec)"] - -# fontSize = 8 -# centered = ParagraphStyle(name="centered", alignment=TA_LEFT) -# for text in textData: -# ptext = "%s" % (fontSize, text) -# titlesTable = Paragraph(ptext, centered) -# d.append(titlesTable) - -# data = [d] -# formattedLineData = [] - -# alignStyle = [ParagraphStyle(name="01", alignment=TA_LEFT), -# ParagraphStyle(name="02", alignment=TA_LEFT), -# ParagraphStyle(name="03", alignment=TA_LEFT), -# ParagraphStyle(name="04", alignment=TA_LEFT), -# ParagraphStyle(name="05", alignment=TA_LEFT)] - -# list_category = ["Throughput", -# "Throughput based on P50-Latency", -# "Throughput based on P90-Latency", -# "Throughput based on P99-Latency"] - -# for i in range(len(list_category)): -# lineData = [list_category[i], -# self.list_config_best_ncpi[i], -# self.list_config_best_nins[i], -# self.list_config_best_bs[i], -# int(self.list_config_best_performance[i])] -# columnNumber = 0 -# for item in lineData: -# ptext = "%s" % (fontSize - 1, item) -# p = Paragraph(ptext, alignStyle[columnNumber]) -# formattedLineData.append(p) -# columnNumber = columnNumber + 1 -# data.append(formattedLineData) -# formattedLineData = [] - -# table = Table(data, colWidths=[140, 65, 105, 30, 120]) -# tStyle = TableStyle([ -# ('ALIGN', (0, 0), (0, -1), 'LEFT'), -# ('VALIGN', (0, 0), (-1, -1), 'TOP'), -# ("ALIGN", (1, 0), (1, -1), 'RIGHT'), -# ('LINEABOVE', (0, 0), (-1, -1), 1, self.IntelBlueLight), -# ('BACKGROUND', (0, 0), (-1, 0), self.IntelBlueLight), -# ('BACKGROUND', (0, 5), (0, 0), Color( -# (235 / 255), (235 / 255), (235 / 255), 1)), -# ('LINEBELOW', (0, 0), (-1, -1), 1, self.IntelBlueLight), -# ]) -# table.setStyle(tStyle) -# self.elements.append(table) - -# spacer = Spacer(10, 2) -# self.elements.append(spacer) -# psHeaderText = ParagraphStyle('Hed0', fontSize=7, alignment=TA_JUSTIFY) -# text = "*Measured on the most performant optimization set (Ranking 1 in above table) " \ -# "by sweeping configurations among batch size, number of instances, and number of cores per instance." -# paragraphReportHeader = Paragraph(text, psHeaderText) -# self.elements.append(paragraphReportHeader) - -# spacer = Spacer(10, 10) -# self.elements.append(spacer) - -# # TCO - -# psHeaderText = ParagraphStyle( -# 'Hed0', fontSize=16, alignment=TA_LEFT, borderWidth=3, textColor=self.IntelBlueDark) -# text = 'Cost Saving' -# paragraphReportHeader = Paragraph(text, psHeaderText) -# self.elements.append(paragraphReportHeader) - -# # spacer = Spacer(5, 11) -# # self.elements.append(spacer) - -# # psHeaderText = ParagraphStyle('Hed0', fontSize=12, alignment=TA_LEFT) -# # text = "Samples per Dollar:" -# # paragraphReportHeader = Paragraph(text, psHeaderText) -# # self.elements.append(paragraphReportHeader) - -# spacer = Spacer(5, 11) -# self.elements.append(spacer) - -# from reportlab.graphics.shapes import Drawing -# from reportlab.graphics.charts.barcharts import HorizontalBarChart -# from reportlab.graphics.charts.textlabels import Label -# drawing = Drawing(0, 80) -# TCO_raw = int(self.original_model_performance / -# (self.TCO_unit_pricing / 3600)) -# TCO_accelerated = int( -# self.list_config_best_performance[0] / (self.TCO_unit_pricing / 3600)) -# data = [ -# (TCO_raw, TCO_accelerated) -# ] -# bc = HorizontalBarChart() -# bc.valueAxis.labels.fontName = 'Helvetica' -# bc.barLabels.fontName = 'Helvetica' -# bc.categoryAxis.labels.fontName = 'Helvetica' -# bc.x = 180 -# bc.y = 10 -# bc.height = 65 -# bc.width = 250 -# bc.data = data -# bc.strokeColor = Color((235 / 255), (235 / 255), (235 / 255), 1) -# bc.bars[(0, 0)].fillColor = self.IntelBlueDark -# bc.bars[(0, 1)].fillColor = self.IntelBlueLight -# bc.valueAxis.valueMin = 0 -# import math -# bc.valueAxis.valueMax = max(TCO_accelerated, TCO_raw) -# # bc.valueAxis.valueStep = math.ceil(TCO_raw)/10 -# bc.categoryAxis.labels.boxAnchor = 'ne' -# bc.categoryAxis.labels.dx = -10 -# bc.categoryAxis.labels.dy = 4 -# bc.categoryAxis.labels.angle = 0 -# bc.categoryAxis.categoryNames = ["Default: " + str(format(TCO_raw, ',')) + " (sample/$)", -# "Optimized: " + str(format(TCO_accelerated, ',')) + " (sample/$)"] -# drawing.add(bc) - -# # add label -# lab = Label() -# lab.setOrigin(0, 0) -# lab.boxAnchor = 'ne' -# lab.angle = 0 -# lab.dx = 420 -# lab.dy = 35 -# lab.fontName = 'Helvetica-Bold' -# lab.fontSize = 13 -# lab.setText(str(round(self.list_config_best_performance[0] / self.original_model_performance, 1)) + 'X') -# drawing.add(lab) - -# self.elements.append(drawing) - -# spacer = Spacer(10, 9) -# self.elements.append(spacer) -# psHeaderText = ParagraphStyle('Hed0', fontSize=8, alignment=TA_JUSTIFY) -# text = "*Sample/$ is calculated based on " + self.cloud_vendor + \ -# " " + self.cloud_instance_type + " instance and on-demand price." -# paragraphReportHeader = Paragraph(text, psHeaderText) -# self.elements.append(paragraphReportHeader) diff --git a/neural_coder/version.py b/neural_coder/version.py deleted file mode 100644 index c5e54c7424d..00000000000 --- a/neural_coder/version.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (c) 2022 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -__version__ = "0.3" diff --git a/neural_compressor/adaptor/onnxrt.py b/neural_compressor/adaptor/onnxrt.py index 6cc17942577..a564b62086a 100644 --- a/neural_compressor/adaptor/onnxrt.py +++ b/neural_compressor/adaptor/onnxrt.py @@ -1697,57 +1697,6 @@ def eval_func(dataloader): acc = 0 if metrics is None else [metric.result() for metric in metrics] return acc if not isinstance(acc, list) or len(acc) > 1 else acc[0] - def diagnosis_helper(self, fp32_model, int8_model, tune_cfg=None, save_path=None): - from neural_compressor.adaptor.ox_utils.util import find_by_name - from neural_compressor.utils.utility import dump_data_to_local - - if self.format == "qlinearops": - supported_optype = [ - "Conv", - "MatMul", - "Concat", - "Attention", - "FusedConv", - "Add", - "Mul", - "LeakyRelu", - "Sigmoid", - "GlobalAveragePool", - "AveragePool", - ] - elif self.format == "qdq": - supported_optype = [ - "Conv", - "MatMul", - "Concat", - "Attention", - "FusedConv", - "LeakyRelu", - "Sigmoid", - "GlobalAveragePool", - "AveragePool", - ] - else: - supported_optype = ["Conv", "MatMul", "Attention", "LSTM"] - inspect_node_list = [] - int8_node_names = [i.name for i in int8_model.nodes()] - for node in fp32_model.nodes(): - if node.op_type in supported_optype and node.name + "_quant" in int8_node_names: - inspect_node_list.append(node.name) - - filtered_params = {} - if self.min_max: - for node_name in inspect_node_list: - node = find_by_name(node_name, fp32_model.nodes()) - filtered_params[node_name] = { - "min": np.array(self.min_max[node.output[0]][0], dtype=np.float32), - "max": np.array(self.min_max[node.output[0]][1], dtype=np.float32), - } - if save_path: - dump_data_to_local(filtered_params, save_path, "activation_min_max.pkl") - dump_data_to_local(tune_cfg, save_path, "cfg.pkl") - return inspect_node_list, tune_cfg - def save(self, model, path): """Save model. diff --git a/neural_compressor/adaptor/pytorch.py b/neural_compressor/adaptor/pytorch.py index 35bf5ae496a..530e15f2308 100644 --- a/neural_compressor/adaptor/pytorch.py +++ b/neural_compressor/adaptor/pytorch.py @@ -1303,32 +1303,6 @@ def get_fused_list(self, model): fused_dict.update({op_name: fp32_int8_ops}) return fused_dict - def diagnosis_helper(self, fp32_model, int8_model, tune_cfg=None, save_path=None): - """This is a helper function to diagnosis. - - Args: - fp32_model (object): Fp32 model (original) - int8_model (object): Quantized model - tune_cfg (dict): Quantization config - save_path (Path): The path to save min/max value of op outputs - - Returns: - Op name list for inspecting, tuning configuration - """ - exclude_list = ["QuantStub", "DeQuantStub", "BatchNorm2d", "Sequential"] - optype_list = torch.quantization.get_default_qconfig_propagation_list() - supported_optype = [] - for optype in optype_list: - op_type = str(optype).rstrip("'>").split(".")[-1] - if "intrinsic." not in str(optype) and op_type not in exclude_list: - supported_optype.append(optype) - inspect_node_list = [] - for name, child in fp32_model.model.named_modules(): - op_type = type(child) - if op_type in supported_optype: - inspect_node_list.append(name) - return inspect_node_list, tune_cfg - def inspect_tensor( self, model, diff --git a/neural_compressor/adaptor/tensorflow.py b/neural_compressor/adaptor/tensorflow.py index 41b4c148192..c893f6f4f1d 100644 --- a/neural_compressor/adaptor/tensorflow.py +++ b/neural_compressor/adaptor/tensorflow.py @@ -1640,12 +1640,6 @@ def recover_tuned_model(self, model, q_config): return converter.convert_without_calib() - def diagnosis_helper(self, fp32_model, quan_model, tune_cfg, save_path): - """Tensorflow diagnosis helper function.""" - from .tf_utils.util import tf_diagnosis_helper - - return tf_diagnosis_helper(fp32_model, quan_model, tune_cfg, save_path) - def get_output_op_names(self, qmodel): """Get the oupur OPs's names.""" from .tf_utils.graph_util import GraphAnalyzer diff --git a/neural_compressor/adaptor/tf_utils/util.py b/neural_compressor/adaptor/tf_utils/util.py index 7e3e0da8462..c2716d55b9c 100644 --- a/neural_compressor/adaptor/tf_utils/util.py +++ b/neural_compressor/adaptor/tf_utils/util.py @@ -524,40 +524,6 @@ def int8_node_name_reverse(node): return node_name -def tf_diagnosis_helper(fp32_model, quan_model, tune_cfg, save_path): - """Tensorflow diagnosis helper function.""" - from ...utils.utility import dump_data_to_local - - fp32_node_mapping = {} - qnode_mapping = {} - for node in fp32_model.graph_def.node: - fp32_node_mapping[node.name] = node - for node in quan_model.graph_def.node: - qnode_mapping[node.name] = node - supported_op_lst = set(["Conv2D", "MatMul", "ConcatV2", "MaxPool", "AvgPool", "DepthwiseConv2dNative"]) - fp32_node_lst = set() - for node in fp32_model.graph_def.node: - if node.op in supported_op_lst: - fp32_node_lst.add(node.name) - int8_node_lst = set() - bf16_node_lst = set() - for node in quan_model.graph_def.node: - node_name = node.name - node_name = int8_node_name_reverse(node) - if "Quantized" in node.op: - int8_node_lst.add(node_name) - elif node.attr["value"].tensor.dtype == tf.dtypes.bfloat16.as_datatype_enum: # pragma: no cover - bf16_node_lst.add(node.name) - else: - continue - inspect_node_lst = fp32_node_lst.intersection(bf16_node_lst.union(int8_node_lst)) - activation_min_max, updated_cfg = _parse_config(quan_model.q_config, tune_cfg, inspect_node_lst) - dump_data_to_local(activation_min_max, save_path, "activation_min_max.pkl") - dump_data_to_local(updated_cfg, save_path, "cfg.pkl") - - return inspect_node_lst, updated_cfg - - def _parse_config(q_config, cfg, op_list): """Parse q_config and get dequantize min max value.""" activation_min_max = {} diff --git a/neural_compressor/benchmark.py b/neural_compressor/benchmark.py index 25dab584168..56d6afcf339 100644 --- a/neural_compressor/benchmark.py +++ b/neural_compressor/benchmark.py @@ -37,7 +37,6 @@ from .profiling.parser.parser import ProfilingParser from .profiling.profiler.profiler import Profiler from .utils import OPTIONS, alias_param, logger -from .utils.neural_insights_utils import register_neural_insights_workload, update_neural_insights_workload from .utils.utility import GLOBAL_STATE, MODE, Statistics, dump_table, print_table @@ -396,7 +395,6 @@ def profile(model, conf, b_dataloader) -> None: profiling_log = os.path.abspath( os.path.join( options.workspace, - "diagnosis.log", ), ) profiler: Profiler = ProfilerFactory.get_profiler( @@ -516,25 +514,6 @@ def fit(model, conf, b_dataloader=None, b_func=None): if conf.device == "gpu" or conf.device == "npu" or sys.platform == "darwin": set_env_var("NC_ENV_CONF", True, overwrite_existing=True) - if conf.diagnosis and os.environ.get("NC_ENV_CONF", None) in [None, "False"]: - if b_dataloader is not None: - logger.info("Start to run Profiling") - ni_workload_id = register_neural_insights_workload( - workload_location=os.path.abspath(os.path.abspath(options.workspace)), - model=wrapped_model, - workload_mode="benchmark", - workload_name=conf.ni_workload_name, - ) - try: - update_neural_insights_workload(ni_workload_id, "wip") - profile(wrapped_model, conf, b_dataloader=b_dataloader) - update_neural_insights_workload(ni_workload_id, "success") - except Exception as e: - logger.error(e) - update_neural_insights_workload(ni_workload_id, "failure") - else: - logger.warning("Profiling is only supported with b_dataloader.") - logger.info("Start to run Benchmark.") if os.environ.get("NC_ENV_CONF") == "True": return run_instance(model=wrapped_model, conf=conf, b_dataloader=b_dataloader, b_func=b_func) diff --git a/neural_compressor/config.py b/neural_compressor/config.py index 2503a78744e..8189e3aa766 100644 --- a/neural_compressor/config.py +++ b/neural_compressor/config.py @@ -301,7 +301,6 @@ def __init__( num_of_instance=1, inter_num_of_threads=None, intra_num_of_threads=None, - diagnosis=False, ni_workload_name="profiling", ): """Init a BenchmarkConfig object.""" @@ -316,7 +315,6 @@ def __init__( self.num_of_instance = num_of_instance self.inter_num_of_threads = inter_num_of_threads self.intra_num_of_threads = intra_num_of_threads - self.diagnosis = diagnosis self.ni_workload_name = ni_workload_name self._framework = None @@ -455,17 +453,6 @@ def intra_num_of_threads(self, intra_num_of_threads): if intra_num_of_threads is None or _check_value("intra_num_of_threads", intra_num_of_threads, int): self._intra_num_of_threads = intra_num_of_threads - @property - def diagnosis(self): - """Get diagnosis property.""" - return self._diagnosis - - @diagnosis.setter - def diagnosis(self, diagnosis): - """Set diagnosis property.""" - if _check_value("diagnosis", diagnosis, bool): - self._diagnosis = diagnosis - @property def ni_workload_name(self): """Get Neural Insights workload name.""" @@ -813,7 +800,6 @@ def __init__( quant_level="auto", accuracy_criterion=accuracy_criterion, tuning_criterion=tuning_criterion, - diagnosis=False, ni_workload_name="quantization", ): """Initialize _BaseQuantizationConfig class.""" @@ -835,7 +821,6 @@ def __init__( self.calibration_sampling_size = calibration_sampling_size self.quant_level = quant_level self._framework = None - self.diagnosis = diagnosis self.ni_workload_name = ni_workload_name self._example_inputs = example_inputs @@ -1279,10 +1264,6 @@ class PostTrainingQuantConfig(_BaseQuantizationConfig): accuracy_criterion: Instance of AccuracyCriterion class. In this class you can set higher_is_better, criterion and tolerable_loss. Please refer to docstring of AccuracyCriterion class. - diagnosis(bool): This flag indicates whether to do diagnosis. - Default value is False. - ni_workload_name: Custom workload name for Neural Insights diagnosis workload. - Default value is "quantization". Example:: @@ -1316,7 +1297,6 @@ def __init__( quant_level="auto", accuracy_criterion=accuracy_criterion, tuning_criterion=tuning_criterion, - diagnosis=False, ni_workload_name="quantization", ): """Init a PostTrainingQuantConfig object.""" @@ -1337,14 +1317,10 @@ def __init__( quant_level=quant_level, accuracy_criterion=accuracy_criterion, tuning_criterion=tuning_criterion, - diagnosis=diagnosis, ni_workload_name=ni_workload_name, ) self.approach = approach - self.diagnosis = diagnosis self.ni_workload_name = ni_workload_name - if self.diagnosis: - self.tuning_criterion.max_trials = 1 @property def approach(self): @@ -1361,28 +1337,6 @@ def approach(self, approach): if _check_value("approach", approach, str, ["static", "dynamic", "auto", "weight_only"]): self._approach = QUANTMAPPING[approach] - @property - def diagnosis(self): - """Get diagnosis.""" - return self._diagnosis - - @diagnosis.setter - def diagnosis(self, diagnosis): - """Set diagnosis.""" - if _check_value("diagnosis", diagnosis, bool): - self._diagnosis = diagnosis - - @property - def ni_workload_name(self): - """Get Neural Insights workload name.""" - return self._ni_workload_name - - @ni_workload_name.setter - def ni_workload_name(self, ni_workload_name): - """Set Neural Insights workload name.""" - if _check_value("ni_workload_name", ni_workload_name, str): - self._ni_workload_name = ni_workload_name - class QuantizationAwareTrainingConfig(_BaseQuantizationConfig): """Config Class for Quantization Aware Training. @@ -2508,7 +2462,6 @@ def __init__( pytorch=pytorch_config, mxnet=mxnet_config, keras=keras_config, - diagnosis=None, ): """Init a config object.""" self._quantization = quantization @@ -2522,13 +2475,6 @@ def __init__( self._pytorch = pytorch self._mxnet = mxnet self._keras = keras - if diagnosis is None: - diagnosis = False - if (quantization is not None and quantization.diagnosis) or (benchmark is not None and benchmark.diagnosis): - diagnosis = True - if diagnosis: - tuning_criterion.max_trials = 1 - self._diagnosis = diagnosis @property def distillation(self): @@ -2585,10 +2531,5 @@ def onnxruntime(self): """Get the onnxruntime object.""" return self._onnxruntime - @property - def diagnosis(self): - """Get the diagnosis value.""" - return self._diagnosis - config = _Config() diff --git a/neural_compressor/quantization.py b/neural_compressor/quantization.py index 784053cee44..138dce19913 100644 --- a/neural_compressor/quantization.py +++ b/neural_compressor/quantization.py @@ -27,11 +27,6 @@ from .model import Model from .strategy import STRATEGIES from .utils import logger -from .utils.neural_insights_utils import ( - register_neural_insights_workload, - update_neural_insights_workload, - update_neural_insights_workload_accuracy_data, -) from .utils.utility import dump_class_attrs, time_limit @@ -144,7 +139,6 @@ def eval_func(model): q_model.save("./saved") """ _raw_model = model - ni_workload_id = None if calib_dataloader is not None: check_dataloader(calib_dataloader) @@ -222,29 +216,13 @@ def update(d): return o logger.info(update(conf_dict)) - if conf.diagnosis: - ni_workload_id = register_neural_insights_workload( - workload_location=os.path.abspath(options.workspace), - model=wrapped_model, - workload_mode="quantization", - workload_name=conf.ni_workload_name, - ) - if ni_workload_id: - update_neural_insights_workload(ni_workload_id, "wip") + strategy.traverse() - if ni_workload_id: - update_neural_insights_workload(ni_workload_id, "success") - update_neural_insights_workload_accuracy_data( - ni_workload_id, - strategy.baseline[0], - strategy.cur_best_acc, - ) + except KeyboardInterrupt: pass except Exception as e: # pragma: no cover logger.error("Unexpected exception {} happened during tuning.".format(repr(e))) - if ni_workload_id: - update_neural_insights_workload(ni_workload_id, "failure") import traceback traceback.print_exc() diff --git a/neural_compressor/strategy/strategy.py b/neural_compressor/strategy/strategy.py index 06c5b0d0783..7acd7fb581b 100644 --- a/neural_compressor/strategy/strategy.py +++ b/neural_compressor/strategy/strategy.py @@ -110,7 +110,6 @@ def __call__(cls, *args, pre_strategy=None, **kwargs): new_strategy.pre_tuning_algo_scheduler = pre_strategy.pre_tuning_algo_scheduler new_strategy.algo_scheduler = pre_strategy.algo_scheduler new_strategy.tuning_history = pre_strategy.tuning_history - new_strategy.diagnosis_done = pre_strategy.diagnosis_done return new_strategy @@ -212,8 +211,6 @@ def __init__( self._not_tuning_recipes_values = {} self._initialize_recipe() self.applied_all_recipes_flag = False - # for diagnosis - self.diagnosis_done = False self._resume = resume self._initial_adaptor() @@ -439,7 +436,6 @@ def _initialize_config(self, conf): Tuning config """ config = conf.quantization - config.diagnosis = getattr(config, "diagnosis", None) return config @abstractmethod @@ -512,9 +508,6 @@ def traverse(self): ) self.last_qmodel = self.algo_scheduler("post_quantization") # pylint: disable=E1102 self.last_tune_cfg = copy.deepcopy(tune_cfg) - # start diagnose, if needed - if self._need_do_diagnosis(): - self._diagnosis(tune_cfg) # remove the reference to model self.algo_scheduler.reset_exec_algorithms() assert self.last_qmodel @@ -551,9 +544,6 @@ def traverse(self): continue # recover the best quantized model from tuning config self._recover_best_qmodel_from_tuning_cfg() - if self._need_do_diagnosis(): - logger.debug("*** Start to do diagnosis (inspect tensor).") - self._diagnosis(tune_cfg) if ( self.use_multi_objective and len(self.tune_result_record) > 1 and self.best_tune_result is not None ): # pragma: no cover @@ -1029,12 +1019,8 @@ def _eval_baseline(self): logger.info("Do not evaluate the baseline and quantize the model with default configuration.") return else: - # If needed, push off the baseline evaluation until the diagnosis is finished. - if self._need_do_diagnosis(): - logger.info("Push off the baseline evaluation until the diagnosis is finished.") - return # get fp32 model baseline - elif self.baseline is None: + if self.baseline is None: logger.info("Get FP32 model baseline.") self._fp32_model = self.model self.baseline = self._evaluate(self.model) @@ -1356,17 +1342,6 @@ def _tune_cfg_converter(self, op_tuning_cfg): if isinstance(op_config, OpTuningConfig): tune_cfg["op"][op_name_type] = op_config.get_state() op_cap_lst = self.capability["opwise"][op_name_type] - # Add pattern for diagnosis - for op_cap in op_cap_lst: - if "pattern" in op_cap: - op_pattern = {} - op_pattern["sequence"] = ( - op_cap["pattern"]["sequence"][0] if "sequence" in op_cap["pattern"] else None - ) - op_pattern["precision"] = ( - op_cap["pattern"]["precision"][0] if "precision" in op_cap["pattern"] else None - ) - tune_cfg["op"][op_name_type]["pattern"] = op_pattern else: tune_cfg[op_name_type] = op_config tune_cfg["calib_sampling_size"] = op_tuning_cfg["calib_sampling_size"] @@ -2095,107 +2070,3 @@ def _collect_ops_by_quant_mode(self, tune_cfg, quant_mode): if isinstance(op_config, OpTuningConfig) and quant_mode in op_config.op_quant_mode: ops_lst.append(op_info) return ops_lst - - def _need_do_diagnosis(self): - """Check if need to do diagnosis or not.""" - # if user specifies to do it and does not do it. - if getattr(self.config, "diagnosis", None) is True and not self.diagnosis_done: - return True - return False - - def _diagnosis(self, tune_cfg): - """Dump diagnosis information.""" - import logging - - logger = logging.getLogger("neural_compressor") - logger.debug("[Strategy] Start to do diagnosis (inspect tensor).") - iteration_list = [1] - inspect_type = "all" - save_to_disk = True - save_path = os.path.join(options.workspace, "inspect_saved") - inspect_node_lst, updated_cfg = self.adaptor.diagnosis_helper( - self.model, - self.last_qmodel, - tune_cfg, - save_path=save_path, - ) - op_list = [] - if not op_list: - op_list = list(inspect_node_lst) - else: - op_list = list(set(op_list).intersection(inspect_node_lst)) - - # step1. inspect tensor - logger.debug(f"[Strategy] Start to inspect tensor :{op_list} in fp32 model.") - self.adaptor.inspect_tensor( - self.model, - dataloader=self.calib_dataloader, - op_list=op_list, - iteration_list=iteration_list, - inspect_type=inspect_type, - save_to_disk=save_to_disk, - save_path=os.path.join(save_path, "fp32"), - quantization_cfg=updated_cfg, - ) - - logger.debug(f"[Strategy] Start to inspect tensor :{op_list} in quantized model.") - self.adaptor.inspect_tensor( - self.last_qmodel, - dataloader=self.calib_dataloader, - op_list=op_list, - iteration_list=iteration_list, - inspect_type=inspect_type, - save_to_disk=save_to_disk, - save_path=os.path.join(save_path, "quan"), - quantization_cfg=updated_cfg, - ) - - print_op_list(workload_location=options.workspace) - weights_details = get_weights_details(workload_location=options.workspace) - - sorted_weights_details: List[WeightsDetails] = sorted(weights_details, key=lambda x: x.mse, reverse=True) - print_table( - title="Weights summary", - column_mapping={ - "OP name": "op_name", - "MSE": "mse", - "Input model min": "input_stats.min", - "Input model max": "input_stats.max", - "Input model mean": "input_stats.mean", - "Input model standard deviation": "input_stats.std", - "Input model variance": "input_stats.var", - }, - table_entries=sorted_weights_details, - precision=5, - ) - logger.info("For more details execute quantization with Neural Insights GUI.") - - weights_table_file = os.path.join( - options.workspace, - "weights_table.csv", - ) - dump_table( - filepath=weights_table_file, - column_mapping={ - "OP name": "op_name", - "MSE": "mse", - "Input model min": "input_stats.min", - "Input model max": "input_stats.max", - "Input model mean": "input_stats.mean", - "Input model standard deviation": "input_stats.std", - "Input model variance": "input_stats.var", - "Optimized model min": "optimized_stats.min", - "Optimized model max": "optimized_stats.max", - "Optimized model mean": "optimized_stats.mean", - "Optimized model standard deviation": "optimized_stats.std", - "Optimized model variance": "optimized_stats.var", - }, - table_entries=sorted_weights_details, - file_type="csv", - ) - - logger.info(f"Weights data has been saved to {weights_table_file}") - - # step2.mask the diagnosis has been done and evaluate baseline (fp32 model) - self.diagnosis_done = True - self._eval_baseline() diff --git a/neural_compressor/template/qat.yaml b/neural_compressor/template/qat.yaml index 9572fc0772a..96200e30af6 100644 --- a/neural_compressor/template/qat.yaml +++ b/neural_compressor/template/qat.yaml @@ -129,11 +129,3 @@ tuning: workspace: path: /path/to/saving/directory # optional. default workspace is ./nc_workspace/current_time_stamp, saving tuning history and deploy yaml. resume: /path/to/a/specified/snapshot/file # optional. if specified, resume from tuning history. - - diagnosis: - diagnosis_after_tuning: False # optional. bool, defaults to False, whether or not dump tensor and show in Bench after tuning finish. - op_list: [] # optional. List[str], defaults to [], the op(s) to be dumped to reduce local disk consumption. the default setting means dump all quantized op instead of not dump anything. - iteration_list: [1] # optional. List[int], defaults to [1], the iteration that needs to dump activation, the default value is [1] which means dump the activation of the first iteration. - inspect_type: activation # optional. str, defaults to activation, dump weight, activation or all. can be one of 'weight', 'activation' or 'all'. - save_to_disk: True # optional. bool, defaults to True, whether or not to save the dumped tensor. - save_path: './nc_workspace/inspect_saved/' # optional. str, defaults to './nc_workspace/inspect_saved/', a path to save the dumped tensor. diff --git a/neural_compressor/utils/neural_insights_utils.py b/neural_compressor/utils/neural_insights_utils.py deleted file mode 100644 index 55cc156bb52..00000000000 --- a/neural_compressor/utils/neural_insights_utils.py +++ /dev/null @@ -1,174 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Neural Insights utils functions.""" -import os -from typing import Any, Optional - -from neural_compressor.utils import logger - - -def register_neural_insights_workload( - workload_location: str, - model: Any, - workload_mode: str, - workload_name: str, -) -> Optional[str]: - """Register workload to Neural Insights. - - Args: - workload_location: path to workload directory - model: Neural Compressor's model instance to be registered - workload_mode: workload mode - workload_name: Name of the workload - - Returns: - String with Neural Insight workload UUID if registered else None - """ - try: - import os - - from neural_insights import NeuralInsights - from neural_insights.utils.consts import WORKDIR_LOCATION, WorkloadModes - - try: - mode = WorkloadModes(workload_mode) - except ValueError: - raise Exception(f"Workload mode '{workload_mode}' is not supported.") - - model_path, model_summary_file = get_model_path(model, workload_location) - - neural_insights = NeuralInsights(workdir_location=WORKDIR_LOCATION) - ni_workload_uuid = neural_insights.add_workload( - workload_location=workload_location, - workload_mode=mode, - model_path=model_path, - workload_name=workload_name, - model_summary_file=model_summary_file, - ) - logger.info(f"Registered {workload_mode} workload to Neural Insights.") - return ni_workload_uuid - except ImportError: - logger.info("Neural Insights not found.") - except Exception as err: - logger.warning(f"Could not register workload to Neural Insights: {err}.") - return None - - -def update_neural_insights_workload(workload_uuid: str, status: str) -> None: - """Update status of specific workload. - - Args: - workload_uuid: string with Neural Insight workload UUID if registered else None - status: workload status to be set - - Returns: - None - """ - try: - from neural_insights import NeuralInsights - from neural_insights.utils.consts import WORKDIR_LOCATION - - neural_insights = NeuralInsights(workdir_location=WORKDIR_LOCATION) - neural_insights.update_workload_status(workload_uuid, status) - except ImportError: - logger.info("Neural Insights not found.") - except Exception as err: - logger.warning(f"Could not update workload status: {err}.") - - -def update_neural_insights_workload_accuracy_data( - workload_uuid: str, - baseline_accuracy: float, - optimized_accuracy: float, -) -> None: - """Update accuracy data of specific workload. - - Args: - workload_uuid: string with Neural Insight workload UUID if registered else None - baseline_accuracy: accuracy of input model - optimized_accuracy: accuracy of optimized model - - Returns: - None - """ - try: - from neural_insights import NeuralInsights - from neural_insights.utils.consts import WORKDIR_LOCATION - - neural_insights = NeuralInsights(workdir_location=WORKDIR_LOCATION) - neural_insights.update_workload_accuracy_data( - workload_uuid, - baseline_accuracy, - optimized_accuracy, - ) - except ImportError: - logger.info("Neural Insights not found.") - except Exception as err: - logger.warning(f"Could not update workload accuracy data: {err}.") - - -def get_model_path(model: Any, workload_location: str) -> Any: - """Get model path.""" - from neural_insights.utils.exceptions import ClientErrorException - from neural_insights.utils.utils import check_module - - model_path = None - model_summary_file = None - onnx_installed = False - pytorch_installed = False - - try: - check_module("onnx") - onnx_installed = True - except ClientErrorException: - pass - - try: - check_module("torch") - pytorch_installed = True - except ClientErrorException: - pass - - if isinstance(model.model_path, str): - return os.path.abspath(model.model_path), model_summary_file - if onnx_installed: - import onnx - - from neural_compressor.model.onnx_model import ONNXModel - - if isinstance(model, ONNXModel): - model_path: str = os.path.join(workload_location, "input_model.onnx") - os.makedirs(workload_location, exist_ok=True) - onnx.save(model.model, model_path) - return model_path, model_summary_file - if pytorch_installed: - import torch - from torchinfo import summary - - from neural_compressor.model.torch_model import PyTorchModel - - if isinstance(model, PyTorchModel): - model_path: str = os.path.join(workload_location, "input_model.pt") - os.makedirs(workload_location, exist_ok=True) - torch.save(model.model.state_dict(), model_path) - - model_stats = summary(model.model, depth=5, verbose=0) - summary_str = str(model_stats) - model_summary_file = os.path.join(workload_location, "model_summary.txt") - with open(model_summary_file, "w", encoding="utf-8") as summary_file: - summary_file.write(summary_str) - return model_path, model_summary_file - assert isinstance(model_path, str), "Model path not detected" diff --git a/neural_insights/README.md b/neural_insights/README.md deleted file mode 100644 index 4d090ec1d98..00000000000 --- a/neural_insights/README.md +++ /dev/null @@ -1,125 +0,0 @@ -
- -Neural Insights -=========================== -
- -Neural Insights is a web application for easier use of Intel® Neural Compressor [diagnosis](/docs/source/diagnosis.md) feature. -It provides the capability to show the model graph, histograms of weights and activations, quantization configs, etc. -The workflow shows the relationship of Neural Insights and diagnosis. -![workflow](/docs/source/imgs/workflow.jpg) - -## Installation - -Installation of Neural Insights is possible in one of following ways: - -### Install from pypi -```Shell -pip install neural-insights -``` - -### Install from Source - - ```Shell - # Install Neural Compressor - git clone https://github.com/intel/neural-compressor.git - cd neural-compressor - pip install -r requirements.txt - python setup.py install - - # Install Neural Insights - pip install -r neural_insights/requirements.txt - python setup.py install neural_insights - ``` - - -## Getting Started - -### Start the Neural Insights - -To start the Neural Insights server execute `neural_insights` command: - -```shell -neural_insights -``` -The server generates a self-signed TLS certificate and prints instruction how to access the Web UI. - -```text -Neural Insights Server started. - -Open address https://10.11.12.13:5000/?token=338174d13706855fc6924cec7b3a8ae8 - -``` - -Server generated certificate is not trusted by your web browser, you will need to accept usage of such certificate. - - -You might also use additional parameters and settings: -* Neural Insights listens on port 5000. -Make sure that port 5000 is accessible to your browser (you might need to open it in your firewall), -or specify different port that is already opened, for example 8080: - ```shell - neural_insights -p 8080 - ``` - - -* To start the Neural Insights server with your own TLS certificate add `--cert` and `--key` parameters: - - ```shell - neural_insights --cert path_to_cert.crt --key path_to_private_key.key - ``` - -* To start the Neural Insights server without TLS encryption use `--allow-insecure-connections` parameter: - - ```shell - neural_insights --allow-insecure-connections - ``` - - This enables access to the server from any machine in your local network (or the whole Internet if your server is exposed to it). - - You are forfeiting security, confidentiality and integrity of all client-server communication. Your server is exposed to external threats. -### Quantization with Python API - -```shell -# Install Intel Neural Compressor and TensorFlow -pip install neural-compressor -pip install neural-insights -pip install tensorflow -# Prepare fp32 model -wget https://storage.googleapis.com/intel-optimized-tensorflow/models/v1_6/mobilenet_v1_1.0_224_frozen.pb -``` - -```python -from neural_compressor import Metric -from neural_compressor.config import PostTrainingQuantConfig -from neural_compressor.data import DataLoader -from neural_compressor.data import Datasets - -top1 = Metric(name="topk", k=1) -dataset = Datasets("tensorflow")["dummy"](shape=(1, 224, 224, 3)) -dataloader = DataLoader(framework="tensorflow", dataset=dataset) - -from neural_compressor.quantization import fit - -q_model = fit( - model="./mobilenet_v1_1.0_224_frozen.pb", - conf=PostTrainingQuantConfig(diagnosis=True), - calib_dataloader=dataloader, - eval_dataloader=dataloader, - eval_metric=top1, -) -``` - -When the quantization is started, the workload should appear on the Neural Insights page and successively, new information should be available while quantization is in progress (such as weights distribution and accuracy data). - -> Note that above example uses dummy data which is used to describe usage of Neural Insights. For diagnosis purposes you should use real dataset specific for your use case. - -## Tensor dump examples -- [Step by step example how to dump weights data for PyTorch model with Neural Insights](docs/source/pytorch_nlp_cli_mode.md) - -## Step by Step Diagnosis Example -Refer to [Step by Step Diagnosis Example with TensorFlow](https://github.com/intel/neural-compressor/tree/master/neural_insights/docs/source/tf_accuracy_debug.md) and [Step by Step Diagnosis Example with ONNXRT](https://github.com/intel/neural-compressor/tree/master/neural_insights/docs/source/onnx_accuracy_debug.md) to get started with some basic quantization accuracy diagnostic skills. - -## Research Collaborations - -Welcome to raise any interesting research ideas on model compression techniques and feel free to reach us (inc.maintainers@intel.com). Look forward to our collaborations on Neural Insights! diff --git a/neural_insights/__init__.py b/neural_insights/__init__.py deleted file mode 100644 index 0c1671f07de..00000000000 --- a/neural_insights/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# flake8: noqa -"""The neural_insights package contains all components required for running Neural Insights.""" - -from neural_insights.ni import NeuralInsights -from neural_insights.version import __version__ diff --git a/neural_insights/bin/__init__.py b/neural_insights/bin/__init__.py deleted file mode 100644 index 4cdc25edc13..00000000000 --- a/neural_insights/bin/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The bin package contains executable for Neural Insights.""" diff --git a/neural_insights/bin/neural_insights.py b/neural_insights/bin/neural_insights.py deleted file mode 100644 index 388038027cf..00000000000 --- a/neural_insights/bin/neural_insights.py +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""WSGI Web Server.""" -import gevent.monkey - -gevent.monkey.patch_all() - - -def execute(): - from neural_insights.main import main - - main() - - -if __name__ == "__main__": - execute() diff --git a/neural_insights/components/__init__.py b/neural_insights/components/__init__.py deleted file mode 100644 index de458e5ca97..00000000000 --- a/neural_insights/components/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The components package contains all components used in Neural Insights server.""" diff --git a/neural_insights/components/diagnosis/__init__.py b/neural_insights/components/diagnosis/__init__.py deleted file mode 100644 index 2f9c45f5db8..00000000000 --- a/neural_insights/components/diagnosis/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The diagnosis package contains all components used for debugging of optimizations.""" diff --git a/neural_insights/components/diagnosis/diagnosis.py b/neural_insights/components/diagnosis/diagnosis.py deleted file mode 100644 index 9283d279cb5..00000000000 --- a/neural_insights/components/diagnosis/diagnosis.py +++ /dev/null @@ -1,307 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The diagnosis class.""" -import os -import pickle -from abc import abstractmethod -from typing import Any, List, Optional - -from neural_insights.components.diagnosis.op_details import OpDetails -from neural_insights.components.diagnosis.op_entry import OpEntry -from neural_insights.components.diagnosis.weights_details import WeightsDetails -from neural_insights.components.model.model import Model -from neural_insights.components.workload_manager.workload import Workload -from neural_insights.utils.exceptions import ClientErrorException, InternalException -from neural_insights.utils.logger import log -from neural_insights.utils.utils import check_module - - -class Diagnosis: - """Diagnosis class.""" - - def __init__(self, workload: Workload): - """Initialize diagnosis.""" - self.workload_location = workload.workload_location - self.model_path = workload.model_path - - @abstractmethod - def model(self) -> Model: - """Neural Insights model instance.""" - raise NotImplementedError - - def get_tensors_info(self, model_type: str = "optimized") -> dict: - """Get information about tensors.""" - tensors_filenames = { - "input": os.path.join("fp32", "inspect_result.pkl"), - "optimized": os.path.join("quan", "inspect_result.pkl"), - } - - tensors_filename = tensors_filenames.get(model_type, None) - if tensors_filename is None: - raise InternalException(f"Could not find tensors data for {model_type} model.") - tensors_path = os.path.join( - self.workload_location, - "inspect_saved", - tensors_filename, - ) - if not os.path.exists(tensors_path): - raise ClientErrorException("Could not find tensor data for specified optimization.") - with open(tensors_path, "rb") as tensors_pickle: - dump_tensor_result = pickle.load(tensors_pickle) - return dump_tensor_result - - def load_quantization_config(self) -> dict: - """Get config quantization data.""" - config_path = os.path.join( - self.workload_location, - "inspect_saved", - "cfg.pkl", - ) - if not os.path.exists(config_path): - log.debug("Could not find config data for specified optimization. Getting data from inspect files.") - input_model_tensors: dict = self.get_tensors_info(model_type="input")["activation"][0] - optimized_model_tensors: dict = self.get_tensors_info(model_type="optimized")["activation"][0] - common_ops = list(set(input_model_tensors.keys()) & set(optimized_model_tensors.keys())) - config_data = { - "op": {}, - } - for op in common_ops: - config_data["op"].update({(op,): {}}) - return config_data - - with open(config_path, "rb") as config_pickle: - config_data = pickle.load(config_pickle) - return config_data - - def get_op_list(self) -> List[dict]: - """Get OP list for model.""" - check_module("numpy") - import numpy as np - - op_list: List[dict] = [] - - input_model_tensors: dict = self.get_tensors_info(model_type="input")["activation"][0] - optimized_model_tensors: dict = self.get_tensors_info(model_type="optimized")["activation"][0] - - minmax_file_path = os.path.join( - self.workload_location, - "inspect_saved", - "activation_min_max.pkl", - ) - - try: - with open(minmax_file_path, "rb") as min_max_file: - min_max_data: dict = pickle.load(min_max_file) - except FileNotFoundError: - log.debug("Could not find minmax file.") - common_ops = list(set(input_model_tensors.keys()) & set(optimized_model_tensors.keys())) - min_max_data = dict(zip(common_ops, [{"min": None, "max": None}] * len(common_ops))) - - for op_name, min_max in min_max_data.items(): - mse = self.calculate_mse(op_name, input_model_tensors, optimized_model_tensors) - if mse is None or np.isnan(mse): - continue - min = min_max.get("min", None) - max = min_max.get("max", None) - - if min is not None: - min = float(min) - if max is not None: - max = float(max) - - op_entry = OpEntry(op_name, mse, min, max) - op_list.append(op_entry.serialize()) - return op_list - - def get_weights_details(self, inspect_type: str) -> List[WeightsDetails]: - """Get weights details for model.""" - weights_details = [] - - minmax_file_path = os.path.join( - self.workload_location, - "inspect_saved", - "activation_min_max.pkl", - ) - with open(minmax_file_path, "rb") as min_max_file: - min_max_data: dict = pickle.load(min_max_file) - - input_model_tensors: dict = self.get_tensors_info(model_type="input")[inspect_type] - optimized_model_tensors: dict = self.get_tensors_info(model_type="optimized")[inspect_type] - if inspect_type == "activation": - input_model_tensors = input_model_tensors[0] - optimized_model_tensors = optimized_model_tensors[0] - common_ops = list(set(input_model_tensors.keys()) & set(optimized_model_tensors.keys())) - for op_name in common_ops: - input_model_op_tensors = input_model_tensors[op_name] - optimized_model_op_tensors = optimized_model_tensors[op_name] - - if op_name not in min_max_data.keys(): - continue - - if isinstance(input_model_op_tensors, dict): - for (input_op_name, input_op_values), (optimized_op_name, optimized_op_values) in zip( - input_model_op_tensors.items(), optimized_model_op_tensors.items() - ): - if input_op_values.ndim != 4 or optimized_op_values.ndim != 4: - continue - - weights_entry = WeightsDetails( - input_op_name, - input_op_values, - optimized_op_values, - ) - weights_details.append(weights_entry) - return weights_details - - def calculate_mse( - self, - op_name: str, - input_model_tensors: dict, - optimized_model_tensors: dict, - ) -> Optional[float]: - """Calculate MSE for specified tensors.""" - input_model_op_data = input_model_tensors.get(op_name, None) - optimized_model_op_data = optimized_model_tensors.get(op_name, None) - - if input_model_op_data is None or optimized_model_op_data is None: - return None - - mse: float = self.mse_metric_gap( - next(iter(input_model_op_data.values()))[0], - next(iter(optimized_model_op_data.values()))[0], - ) - - return mse - - def get_op_details(self, name: str) -> Optional[OpDetails]: - """Get details of specific OP.""" - config_data = self.load_quantization_config() - for op_tuple, op_details in config_data["op"].items(): - if op_tuple[0] == name: - return OpDetails(name, op_details) - return None - - def get_histogram_data(self, op_name: str, inspect_type: str) -> list: - """Get data to draw histogram.""" - tensors = self.get_tensors_info(model_type="optimized").get(inspect_type, None) - if tensors is None: - raise ClientErrorException( - f"Could not get tensor information for {inspect_type} type.", - ) - - if inspect_type == "activation": - tensors = tensors[0] - - op_tensors: Optional[dict] = tensors.get(op_name, None) - if op_tensors is None: - raise ClientErrorException( - f"Could not get tensor information for {op_name} OP.", - ) - - op_histograms = [] - for tensor_name, tensor_data_raw in op_tensors.items(): - tensor_histograms = [] - - if tensor_data_raw.ndim == 1: - tensor_data = [tensor_data_raw] - elif tensor_data_raw.ndim == 2: - tensor_data = tensor_data_raw[0] - else: - tensor_data = tensor_data_raw[0] - for tensor_channel_data in tensor_data: - tensor_histograms.append( - { - "data": tensor_channel_data.flatten().tolist(), - }, - ) - - op_histograms.append( - { - "name": f"{tensor_name} {inspect_type} histogram", - "histograms": tensor_histograms, - }, - ) - - return op_histograms - - @staticmethod - def mse_metric_gap(fp32_tensor: Any, dequantize_tensor: Any) -> float: - """Calculate the euclidean distance between fp32 tensor and int8 dequantize tensor. - - Args: - fp32_tensor (tensor): The FP32 tensor. - dequantize_tensor (tensor): The INT8 dequantize tensor. - """ - check_module("numpy") - import numpy as np - - # Get input tensor min max - fp32_max = np.max(fp32_tensor) # type: ignore - fp32_min = np.min(fp32_tensor) # type: ignore - - # Get input dequantize tensor min max - dequantize_max = np.max(dequantize_tensor) # type: ignore - dequantize_min = np.min(dequantize_tensor) # type: ignore - - # Normalize tensor values - fp32_tensor = (fp32_tensor - fp32_min) / (fp32_max - fp32_min) - dequantize_tensor = (dequantize_tensor - dequantize_min) / (dequantize_max - dequantize_min) - - diff_tensor = fp32_tensor - dequantize_tensor - euclidean_dist = np.sum(diff_tensor**2) # type: ignore - return euclidean_dist / fp32_tensor.size - - def get_weights_data(self, op_name: str, channel_normalization=True) -> list: - """Get weights data for optimized model.""" - from PIL import Image - - check_module("numpy") - import numpy as np - - tensors = self.get_tensors_info(model_type="optimized").get("weight", None) - if tensors is None: - raise ClientErrorException( - "Could not get tensor information to display activations.", - ) - - op_tensors: Optional[dict] = tensors.get(op_name, None) - if op_tensors is None: - raise ClientErrorException( - f"Could not get tensor information for {op_name} OP.", - ) - - weights = [] - for tensor_name, tensor_data_raw in op_tensors.items(): - if tensor_data_raw.ndim != 4: - continue - tensor_data = tensor_data_raw[0] - shapes_order = self.model.shape_elements_order # pylint: disable=no-member - channels_index = shapes_order.index("channels") - new_order = [channels_index] - new_order.extend([x for x in range(len(shapes_order)) if x != channels_index]) - - tensor_data = np.transpose(tensor_data, new_order) - - if tensor_data.shape[1] != tensor_data.shape[2]: - continue - - for tensor in tensor_data: - if channel_normalization: - tensor = 255 * (tensor - np.min(tensor)) / (np.max(tensor) - np.min(tensor)) - img = Image.fromarray(tensor) - img = img.convert("L") - img.show() - weights.append(tensor.tolist()) - return weights diff --git a/neural_insights/components/diagnosis/factory.py b/neural_insights/components/diagnosis/factory.py deleted file mode 100644 index 544ec72a430..00000000000 --- a/neural_insights/components/diagnosis/factory.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Diagnosis class factory.""" -from neural_insights.components.diagnosis.diagnosis import Diagnosis -from neural_insights.components.diagnosis.onnx_diagnosis.onnxrt_diagnosis import OnnxRtDiagnosis -from neural_insights.components.diagnosis.pytorch_diagnosis.pytorch_diagnosis import PyTorchDiagnosis -from neural_insights.components.diagnosis.tensorflow_diagnosis.tensorflow_diagnosis import TensorflowDiagnosis -from neural_insights.components.workload_manager.workload import Workload -from neural_insights.utils.consts import Frameworks -from neural_insights.utils.exceptions import InternalException -from neural_insights.utils.logger import log - - -class DiagnosisFactory: - """Optimization factory.""" - - @staticmethod - def get_diagnosis( - workload: Workload, - ) -> Diagnosis: - """Get diagnosis for specified framework.""" - diagnosis_map = { - Frameworks.ONNX: OnnxRtDiagnosis, - Frameworks.TF: TensorflowDiagnosis, - Frameworks.PT: PyTorchDiagnosis, - } - diagnosis = diagnosis_map.get(workload.framework, None) - if diagnosis is None: - raise InternalException( - f"Could not find diagnosis class for {workload.framework.value} framework.", - ) - log.debug(f"Initializing {diagnosis.__name__} class.") - return diagnosis(workload) diff --git a/neural_insights/components/diagnosis/onnx_diagnosis/__init__.py b/neural_insights/components/diagnosis/onnx_diagnosis/__init__.py deleted file mode 100644 index 1b80ab83a9f..00000000000 --- a/neural_insights/components/diagnosis/onnx_diagnosis/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The onnxrt_diagnosis package contains all components used for onnxrt optimizations debug.""" diff --git a/neural_insights/components/diagnosis/onnx_diagnosis/onnxrt_diagnosis.py b/neural_insights/components/diagnosis/onnx_diagnosis/onnxrt_diagnosis.py deleted file mode 100644 index 540c9957ce9..00000000000 --- a/neural_insights/components/diagnosis/onnx_diagnosis/onnxrt_diagnosis.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The OnnxRT diagnosis class.""" -from typing import Optional - -from neural_insights.components.diagnosis.diagnosis import Diagnosis -from neural_insights.components.model.onnxrt.model import OnnxrtModel -from neural_insights.components.model.repository import ModelRepository -from neural_insights.components.workload_manager.workload import Workload - - -class OnnxRtDiagnosis(Diagnosis): - """OnnxRuntime diagnosis class.""" - - def __init__(self, workload: Workload): - """Initialize OnnxRtDiagnosis.""" - super().__init__(workload) - self._model: Optional[OnnxrtModel] = None - - @property - def model(self) -> OnnxrtModel: - """Get Neural Compressor Model instance.""" - self._ensure_model() - return self._model # type: ignore - - def _ensure_model(self) -> None: - """Create Neural Insights Model instance if needed.""" - if self._model is not None: - return - model_repository = ModelRepository() - self._model = model_repository.get_model(self.model_path) # type: ignore diff --git a/neural_insights/components/diagnosis/op_details.py b/neural_insights/components/diagnosis/op_details.py deleted file mode 100644 index 6b29da74307..00000000000 --- a/neural_insights/components/diagnosis/op_details.py +++ /dev/null @@ -1,71 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The OpDetails class.""" -from typing import Any, Dict, List - -from neural_insights.utils.json_serializer import JsonSerializer - - -class OpDetails(JsonSerializer): - """OP details class.""" - - def __init__(self, op_name: str, op_details: dict) -> None: - """Initialize OP details.""" - super().__init__() - self.op_name: str = op_name - self.pattern: OpPattern = OpPattern(op_details.get("pattern", {})) - self.weight: OpWeights = OpWeights(op_details.get("weight", {})) - self.activation: OpActivation = OpActivation(op_details.get("activation", {})) - - def serialize( - self, - serialization_type: str = "default", - ) -> Dict[str, Any]: - """Serialize OpDetails.""" - return { - "OP name": self.op_name, - "Pattern": self.pattern.serialize(), - "Weights": self.weight.serialize(), - "Activation": self.activation.serialize(), - } - - -class OpPattern(JsonSerializer): - """OP pattern class.""" - - def __init__(self, pattern_data: dict): - """Initialize OP pattern.""" - super().__init__() - self.sequence: List[str] = pattern_data.get("sequence", "").split(",") - self.precision: str = pattern_data.get("precision", None) - - -class OpWeights(JsonSerializer): - """OP weights class.""" - - def __init__(self, weights_data: dict): - """Initialize OP weights.""" - super().__init__() - self.dtype: str = weights_data.get("dtype", None) - self.granularity: str = weights_data.get("granularity", None) - - -class OpActivation(JsonSerializer): - """OP activation class.""" - - def __init__(self, op_activation: dict): - """Initialize OP activation.""" - super().__init__() - self.dtype: str = op_activation.get("dtype", None) diff --git a/neural_insights/components/diagnosis/op_entry.py b/neural_insights/components/diagnosis/op_entry.py deleted file mode 100644 index f889774a43b..00000000000 --- a/neural_insights/components/diagnosis/op_entry.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The OpEntry class.""" -from typing import Any, Dict - -from neural_insights.utils.json_serializer import JsonSerializer - - -class OpEntry(JsonSerializer): - """OP entry class.""" - - def __init__(self, op_name: str, mse: float, activation_min: float, activation_max: float): - """Initialize OP entry.""" - super().__init__() - self.op_name: str = op_name - self.mse: float = mse - self.activation_min: float = activation_min - self.activation_max: float = activation_max - - def serialize( - self, - serialization_type: str = "default", - ) -> Dict[str, Any]: - """Serialize OP entry.""" - return { - "OP name": self.op_name, - "MSE": self.mse, - "Activation Min": self.activation_min, - "Activation Max": self.activation_max, - } diff --git a/neural_insights/components/diagnosis/pytorch_diagnosis/__init__.py b/neural_insights/components/diagnosis/pytorch_diagnosis/__init__.py deleted file mode 100644 index 1ef0aa3b00b..00000000000 --- a/neural_insights/components/diagnosis/pytorch_diagnosis/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The pytorch_diagnosis package contains all components used for pytorch optimizations debug.""" diff --git a/neural_insights/components/diagnosis/pytorch_diagnosis/pytorch_diagnosis.py b/neural_insights/components/diagnosis/pytorch_diagnosis/pytorch_diagnosis.py deleted file mode 100644 index 994e7e2d722..00000000000 --- a/neural_insights/components/diagnosis/pytorch_diagnosis/pytorch_diagnosis.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The PyTorch diagnosis class.""" -from typing import Optional - -from neural_insights.components.diagnosis.diagnosis import Diagnosis -from neural_insights.components.model.pytorch.model import PyTorchModel -from neural_insights.components.model.repository import ModelRepository -from neural_insights.components.workload_manager.workload import Workload - - -class PyTorchDiagnosis(Diagnosis): - """PyTorch diagnosis class.""" - - def __init__(self, workload: Workload): - """Initialize PyTorchDiagnosis.""" - super().__init__(workload) - self._model: Optional[PyTorchModel] = None - - @property - def model(self) -> PyTorchModel: - """Get Neural Compressor Model instance.""" - self._ensure_model() - return self._model # type: ignore - - def _ensure_model(self) -> None: - """Create Neural Insights Model instance if needed.""" - if self._model is not None: - return - model_repository = ModelRepository() - self._model = model_repository.get_model(self.model_path) # type: ignore diff --git a/neural_insights/components/diagnosis/tensorflow_diagnosis/__init__.py b/neural_insights/components/diagnosis/tensorflow_diagnosis/__init__.py deleted file mode 100644 index 391a72fd766..00000000000 --- a/neural_insights/components/diagnosis/tensorflow_diagnosis/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The tensorflow_diagnosis package contains components used for tensorflow optimizations debug.""" diff --git a/neural_insights/components/diagnosis/tensorflow_diagnosis/tensorflow_diagnosis.py b/neural_insights/components/diagnosis/tensorflow_diagnosis/tensorflow_diagnosis.py deleted file mode 100644 index e0c80d1febf..00000000000 --- a/neural_insights/components/diagnosis/tensorflow_diagnosis/tensorflow_diagnosis.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The Tensorflow diagnosis class.""" -from typing import Optional - -from neural_insights.components.diagnosis.diagnosis import Diagnosis -from neural_insights.components.model.repository import ModelRepository -from neural_insights.components.model.tensorflow.model import TensorflowModel -from neural_insights.components.workload_manager.workload import Workload - - -class TensorflowDiagnosis(Diagnosis): - """OnnxRuntime diagnosis class.""" - - def __init__(self, workload: Workload): - """Initialize TensorflowDiagnosis.""" - super().__init__(workload) - self._model: Optional[TensorflowModel] = None - - @property - def model(self) -> TensorflowModel: - """Get Neural Compressor Model instance.""" - self._ensure_model() - return self._model # type: ignore - - def _ensure_model(self) -> None: - """Create Neural Insights Model instance if needed.""" - if self._model is not None: - return - model_repository = ModelRepository() - self._model = model_repository.get_model(self.model_path) # type: ignore diff --git a/neural_insights/components/diagnosis/weights_details.py b/neural_insights/components/diagnosis/weights_details.py deleted file mode 100644 index 68a64662668..00000000000 --- a/neural_insights/components/diagnosis/weights_details.py +++ /dev/null @@ -1,76 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The Weights details class.""" -from typing import Any, Dict, Optional - -from neural_compressor.utils.utility import mse_metric_gap -from neural_insights.utils.json_serializer import JsonSerializer -from neural_insights.utils.utils import check_module - - -class WeightsDetails(JsonSerializer): - """Weights details class.""" - - def __init__(self, op_name: str, input_tensor_data, optimized_tensor_data): - """Initialize Weights details.""" - super().__init__() - self.op_name: str = op_name - self.mse: Optional[float] = mse_metric_gap( - input_tensor_data, - optimized_tensor_data, - ) - self.input_stats: WeightsStatistics = WeightsStatistics(input_tensor_data) - self.optimized_stats: WeightsStatistics = WeightsStatistics(optimized_tensor_data) - - def serialize( - self, - serialization_type: str = "default", - ) -> Dict[str, Any]: - """Serialize Weights details.""" - return { - "OP name": self.op_name, - "MSE": self.mse, - "Input model": self.input_stats.serialize(), - "Optimized model": self.optimized_stats.serialize(), - } - - -class WeightsStatistics(JsonSerializer): - """Weights statistics class.""" - - def __init__(self, tensor_data) -> None: - """Initialize Weights details.""" - check_module("numpy") - import numpy as np - - super().__init__() - self.min: float = np.min(tensor_data) - self.max: float = np.max(tensor_data) - self.mean: float = np.mean(tensor_data) - self.std: float = np.std(tensor_data) - self.var: float = np.var(tensor_data) - - def serialize( - self, - serialization_type: str = "default", - ) -> Dict[str, Any]: - """Serialize Weights details.""" - return { - "Min weight": self.min, - "Max weight": self.max, - "Mean": self.mean, - "Standard deviation": self.std, - "Variance": self.var, - } diff --git a/neural_insights/components/graph/__init__.py b/neural_insights/components/graph/__init__.py deleted file mode 100644 index 602e3be0736..00000000000 --- a/neural_insights/components/graph/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Package graph contains all packages required to display model graph.""" diff --git a/neural_insights/components/graph/attribute.py b/neural_insights/components/graph/attribute.py deleted file mode 100644 index 8697a3ed875..00000000000 --- a/neural_insights/components/graph/attribute.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Graph Node Attribute.""" - -from typing import Any - -from neural_insights.utils.json_serializer import JsonSerializer - - -class Attribute(JsonSerializer): - """Graph Node Attribute.""" - - def __init__(self, name: str, attribute_type: str, value: Any): - """Construct the object.""" - super().__init__() - self.name = name - self.attribute_type = attribute_type - self.value = value diff --git a/neural_insights/components/graph/collapser.py b/neural_insights/components/graph/collapser.py deleted file mode 100644 index 7a2abcb3790..00000000000 --- a/neural_insights/components/graph/collapser.py +++ /dev/null @@ -1,132 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Graph collapser.""" - -from typing import Dict, List, Set - -from neural_insights.components.graph.graph import Graph -from neural_insights.components.graph.node import GroupNode, Node - - -class Collapser: - """Graph collapser.""" - - GROUP_NAME_PREFIX = "node_group_" - - def __init__(self, expanded_groups: List[str] = []) -> None: - """Construct the collapser.""" - restored_group_names = [self._unprepare_group_name(name) for name in expanded_groups] - self.expanded_groups: Set[str] = set(restored_group_names) - self.group_sizes: Dict[str, int] = {} - - def collapse(self, graph: Graph) -> Graph: - """Return graph with collapsed nodes.""" - collapsed_graph = Graph() - - self._calculate_group_sizes(graph) - self._add_nodes_to_collapsed_graph(collapsed_graph, graph) - self._add_edges_to_collapsed_graph(collapsed_graph, graph) - - return collapsed_graph - - def _calculate_group_sizes(self, graph: Graph) -> None: - """Create dict with number of nodes in each group.""" - self.group_sizes = {} - for node in graph.nodes: - for group in node.groups: - if not self.group_sizes.get(group): - self.group_sizes[group] = 0 - self.group_sizes[group] += 1 - - def _add_nodes_to_collapsed_graph(self, collapsed_graph: Graph, graph: Graph) -> None: - """Add Nodes from source graph to collapsed graph.""" - for node in graph.nodes: - collapsed_graph.add_node(self._get_node_for_collapsed_graph(node)) - - def _add_edges_to_collapsed_graph(self, collapsed_graph: Graph, graph: Graph) -> None: - """Add Edges from source graph to collapsed graph.""" - collapsed_edges_repository: Dict[str, bool] = {} - - for edge in graph.edges: - edge_added = collapsed_graph.add_edge( - source_id=edge.source, - target_id=edge.target, - ) - if edge_added: - continue - - source_node_id = self._get_collapsed_node_id(graph.get_node(edge.source)) - target_node_id = self._get_collapsed_node_id(graph.get_node(edge.target)) - - if source_node_id == target_node_id: - # skip edges inside collapsed node - continue - - collapsed_edge_designation = f"collapsed edge between {source_node_id} and {target_node_id}" - is_collapsed_already_added = collapsed_edges_repository.get( - collapsed_edge_designation, - False, - ) - if not is_collapsed_already_added: - collapsed_graph.add_edge( - source_id=source_node_id, - target_id=target_node_id, - ) - collapsed_edges_repository[collapsed_edge_designation] = True - - def _get_node_for_collapsed_graph(self, node: Node) -> Node: - """Return a node for collapsed graph.""" - if self._should_collapse_node(node): - return self._collapse_node(node) - return node - - def _should_collapse_node(self, node: Node) -> bool: - """Decide if given node should be collapsed.""" - if not node.groups: - return False - - for group in node.groups: - if group not in self.expanded_groups: - return self.group_sizes.get(group, 0) > 1 - - return False - - def _collapse_node(self, node: Node) -> Node: - """Collapse node into group node.""" - collapsed_node_id = self._get_collapsed_node_id(node) - group_name = self._unprepare_group_name(collapsed_node_id) - return GroupNode(id=collapsed_node_id, group_name=group_name) - - def _get_collapsed_node_id(self, node: Node) -> str: - """Collapse node into group node.""" - if not self._should_collapse_node(node): - return node.id - - for group in node.groups: - if group not in self.expanded_groups: - break - - return self._prepare_group_name(group) - - def _prepare_group_name(self, name: str) -> str: - """Convert group name to unique one.""" - return f"{self.GROUP_NAME_PREFIX}{name}" - - def _unprepare_group_name(self, name: str) -> str: - """Convert group name to unique one.""" - if not name.startswith(self.GROUP_NAME_PREFIX): - return name - - return name[len(self.GROUP_NAME_PREFIX) :] diff --git a/neural_insights/components/graph/edge.py b/neural_insights/components/graph/edge.py deleted file mode 100644 index 3f0a10f2e5e..00000000000 --- a/neural_insights/components/graph/edge.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Edge class.""" - -from neural_insights.components.graph.node import Node -from neural_insights.utils.json_serializer import JsonSerializer - - -class Edge(JsonSerializer): - """Edge in graph.""" - - def __init__(self, source: Node, target: Node) -> None: - """Construct object.""" - super().__init__() - self._source = source - self._target = target - - @property - def source(self) -> str: - """Return source Node id.""" - return self._source.id - - @property - def target(self) -> str: - """Return target Node id.""" - return self._target.id diff --git a/neural_insights/components/graph/graph.py b/neural_insights/components/graph/graph.py deleted file mode 100644 index 3d3093bb92f..00000000000 --- a/neural_insights/components/graph/graph.py +++ /dev/null @@ -1,88 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Graph class.""" - -from typing import Dict, List - -from neural_insights.components.graph.edge import Edge -from neural_insights.components.graph.node import Node -from neural_insights.utils.exceptions import NotFoundException -from neural_insights.utils.json_serializer import JsonSerializer -from neural_insights.utils.logger import log - - -class Graph(JsonSerializer): - """Model graph definition.""" - - def __init__(self) -> None: - """Construct object.""" - super().__init__() - self._nodes: Dict[str, Node] = {} - self._edges: List[Edge] = [] - - def add_node(self, node: Node) -> None: - """Add a Node to graph.""" - self._nodes[node.id] = node - - @property - def nodes(self) -> List[Node]: - """Return nodes as a list.""" - return list(self._nodes.values()) - - @property - def edges(self) -> List[Edge]: - """Return edges as a list.""" - return self._edges - - def add_edge(self, source_id: str, target_id: str) -> bool: - """Add an Edge to graph.""" - try: - source = self.get_node(source_id) - target = self.get_node(target_id) - except NotFoundException as err: - log.debug( - f"Got an error: {str(err)} while attempted " f"to add an Edge from {source_id} to {target_id}", - ) - return False - self._edges.append(Edge(source, target)) - return True - - def get_node(self, id: str) -> Node: - """Get a node by id.""" - if id not in self._nodes: - raise NotFoundException(f"Node id: {id} not found in Graph") - return self._nodes[id] - - def highlight_pattern(self, op_name: str, pattern: List[str]) -> None: - """Highlight pattern in graph.""" - source_op = op_name - self.get_node(source_op).highlight = True - for op in pattern[1:]: - target_nodes = self.get_target_nodes(source_op) - for target_node in target_nodes: - if target_node.label == op: - self.get_node(target_node.id).highlight = True - source_op = target_node.id - continue - - def get_target_nodes(self, op_name: str) -> List[Node]: - """Get target nodes from specified op.""" - target_nodes: List[Node] = [] - - for edge in self.edges: - if edge.source == op_name: - target_nodes.append(self.get_node(edge.target)) - - return target_nodes diff --git a/neural_insights/components/graph/graph_reader.py b/neural_insights/components/graph/graph_reader.py deleted file mode 100644 index 6228d94aeeb..00000000000 --- a/neural_insights/components/graph/graph_reader.py +++ /dev/null @@ -1,66 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Graph reader.""" -from typing import List, Optional, Tuple - -from neural_insights.components.graph.collapser import Collapser -from neural_insights.components.graph.graph import Graph -from neural_insights.components.graph.node import Node -from neural_insights.components.model.repository import ModelRepository -from neural_insights.utils.exceptions import ClientErrorException - - -class GraphReader: - """Model graph reader.""" - - def read(self, model_path: str, expanded_groups: List[str]) -> Graph: - """Return Graph for given model path.""" - model_repository = ModelRepository() - model = model_repository.get_model(model_path) - graph = model.get_model_graph() - - collapser = Collapser(expanded_groups) - collapsed_graph = collapser.collapse(graph) - - return collapsed_graph - - def find_pattern_in_graph( - self, - model_path: str, - op_name: str, - pattern: List[str], - ) -> Tuple[Graph, List[str]]: - """Search graph for specific nodes pattern.""" - model_repository = ModelRepository() - model = model_repository.get_model(model_path) - graph = model.get_model_graph() - - op_data: Optional[Node] = None - for node in graph.nodes: - if node.id == op_name: - op_data = node - break - - if op_data is None: - raise ClientErrorException(f"Could not find {op_name} in graph.") - - expanded_groups = op_data.groups - - collapser = Collapser(expanded_groups) - collapsed_graph = collapser.collapse(graph) - - collapsed_graph.highlight_pattern(op_name, pattern) - - return collapsed_graph, expanded_groups diff --git a/neural_insights/components/graph/node.py b/neural_insights/components/graph/node.py deleted file mode 100644 index 59d8e263684..00000000000 --- a/neural_insights/components/graph/node.py +++ /dev/null @@ -1,65 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Node class.""" - -from typing import Any, Dict, List - -from neural_insights.components.graph.attribute import Attribute -from neural_insights.utils.json_serializer import JsonSerializer - - -class Node(JsonSerializer): - """Single Node in graph.""" - - TYPE_SIMPLE_NODE = "node" - - def __init__( - self, - id: str, - label: str, - highlight: bool = False, - properties: Dict[str, Any] = {}, - attributes: List[Attribute] = [], - groups: List[str] = [], - ) -> None: - """Construct object.""" - super().__init__() - self.id = id - self.label = label - self.highlight = highlight - self.properties = properties - self.attributes = attributes - self.groups = groups - self.node_type = self.TYPE_SIMPLE_NODE - self._skip.append("groups") - - -class GroupNode(Node): - """Node being a group of Nodes in Graph.""" - - TYPE_GROUP_NODE = "group_node" - - def __init__( - self, - id: str, - group_name: str, - ) -> None: - """Construct object.""" - super().__init__( - id=id, - label=group_name, - ) - self.group = group_name - self.node_type = self.TYPE_GROUP_NODE diff --git a/neural_insights/components/graph/reader/__init__.py b/neural_insights/components/graph/reader/__init__.py deleted file mode 100644 index cac19a74909..00000000000 --- a/neural_insights/components/graph/reader/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Package with all graph readers.""" diff --git a/neural_insights/components/graph/reader/onnxrt_reader.py b/neural_insights/components/graph/reader/onnxrt_reader.py deleted file mode 100644 index 4c891d79252..00000000000 --- a/neural_insights/components/graph/reader/onnxrt_reader.py +++ /dev/null @@ -1,244 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Onnxrt Graph reader.""" - -import uuid -from typing import Any, Dict, List, Optional - -from neural_insights.components.graph.attribute import Attribute -from neural_insights.components.graph.graph import Graph -from neural_insights.components.graph.node import Node -from neural_insights.components.model.model import Model -from neural_insights.utils.exceptions import NotFoundException - - -class OnnxrtReader: - """Graph Reader for Onnxrt.""" - - def __init__(self, model: Model) -> None: - """Initialize object.""" - self._hidden_node_ids: Dict[str, bool] = {} - self.model: Model = model - - def read(self) -> Graph: - """Read a graph.""" - self._hidden_node_ids = {} - - from neural_insights.components.model.onnxrt.model import OnnxrtModel - - if not isinstance(self.model, OnnxrtModel): - raise NotFoundException(f"{self.model.path} is not Onnxrt model.") - - onnx_nodes = self.model.nc_model_instance.nodes() - graph = Graph() - - graph = self._add_boundary_nodes(graph) - - edges: dict = {} - - for node_def in onnx_nodes: - node_name = node_def.name - if node_name == "": - node_name = f"{node_def.op_type}_{uuid.uuid4()}" - - if self._should_hide_node(node_def): - self._hide_node(node_name) - continue - - edges = self._add_edges_from_node(edges, node_def, node_name) - - graph.add_node( - Node( - id=node_name, - label=node_def.op_type, - highlight=False, - properties={ - "name": node_name, - "type": node_def.op_type, - }, - attributes=self._convert_attributes(node_def), - groups=self._get_group_names(node_name), - ), - ) - - self._process_edges(graph, edges) - - return graph - - def _get_group_names(self, node_id: str) -> List[str]: - """Get a group names from Node starting from the top.""" - elements = node_id.split("/") - names = [] - for idx in range(1, len(elements)): - names.append("/".join(elements[0:idx])) - return names - - def _should_hide_node(self, node_def: Any) -> bool: - """Check if given node should be hidden.""" - if node_def.op_type not in ["Const", "Identity"]: - return False - - if self._node_def_has_not_hidden_inputs(node_def): - return False - - return True - - def _node_def_has_not_hidden_inputs(self, node_def: Any) -> bool: - """Check if node has any visible input.""" - not_hidden_input_ids = list( - filter( - lambda input_node: input_node not in self._hidden_node_ids, - node_def.input, - ), - ) - return len(not_hidden_input_ids) > 0 - - def _hide_node(self, node_name: str) -> None: - """Mark node as hidden.""" - self._hidden_node_ids[node_name] = True - - def _is_node_id_hidden(self, node_id: str) -> bool: - """Check if provided node_id is hidden.""" - return node_id in self._hidden_node_ids - - def _convert_attributes(self, node_def: Any) -> List[Attribute]: - """Convert NodeDef attributes to our format.""" - attributes = [] - - for attribute in node_def.attribute: - converted_attribute = self._convert_attribute(attribute) - if converted_attribute is not None: - attributes.append(converted_attribute) - - return attributes - - def _convert_attribute(self, attribute: Any) -> Optional[Attribute]: - """Convert NodeDef attribute to our format.""" - from onnx.mapping import TENSOR_TYPE_TO_NP_TYPE - - attr_type = str(TENSOR_TYPE_TO_NP_TYPE.get(attribute.type, "UNKNOWN")) - - attr_float = attribute.f - attr_floats = attribute.floats - - attr_int = attribute.i - attr_ints = attribute.ints - - value = None - if "int" in attr_type: - value = attr_int - if len(attr_ints) > 0: - value = list(attr_ints) - elif "float" in attr_type: - value = attr_float - if len(attr_floats) > 0: - value = list(attr_floats) - else: - print("Attribute type not yet supported") - - return Attribute( - attribute.name, - str(TENSOR_TYPE_TO_NP_TYPE.get(attribute.type, "UNKNOWN")), - value, - ) - - def _add_boundary_nodes(self, graph: Graph) -> Graph: - """Add boundary nodes to graph.""" - from neural_insights.components.model.onnxrt.model import OnnxrtModel - - if not isinstance(self.model, OnnxrtModel): - raise NotFoundException(f"{self.model.path} is not Onnxrt model.") - - onnx_graph = self.model.nc_model_instance.graph() - boundary_nodes = {"Input node": onnx_graph.input, "Output node": onnx_graph.output} - for node_type, nodes in boundary_nodes.items(): - for node in nodes: - graph.add_node( - Node( - id=node.name, - label=node_type, - highlight=False, - properties={ - "name": node.name, - "type": node_type, - }, - attributes=[], - groups=self._get_group_names(node.name), - ), - ) - return graph - - def _add_edges_from_node(self, edges: dict, node: Any, node_name: str) -> dict: - """Add update edges from node data.""" - for edge in node.input: - edge_data = edges.get(edge, {}) - input_nodes = edge_data.get("inputs", []) - input_nodes.append(node_name) - edge_data.update({"inputs": input_nodes}) - edges.update({edge: edge_data}) - - for edge in node.output: - edge_data = edges.get(edge, {}) - output_nodes = edge_data.get("outputs", []) - output_nodes.append(node_name) - edge_data.update({"outputs": output_nodes}) - edges.update({edge: edge_data}) - - return edges - - def _process_edges(self, graph: Graph, edges: dict) -> None: - """Process edges.""" - from neural_insights.components.model.onnxrt.model import OnnxrtModel - - if not isinstance(self.model, OnnxrtModel): - raise NotFoundException(f"{self.model.path} is not Onnxrt model.") - - for edge, edge_data in edges.items(): - # Check if edge connects to input node - input_nodes = [node.name for node in self.model.nc_model_instance.graph().input] - if edge in input_nodes and "inputs" in edge_data: - source_node = edge - for target_node in edge_data["inputs"]: - graph.add_edge( - source_id=source_node, - target_id=target_node, - ) - - # Check if edge connects to output node - output_nodes = [node.name for node in self.model.nc_model_instance.graph().output] - if edge in output_nodes and "outputs" in edge_data: - target_node = edge - for source_node in edge_data["outputs"]: - graph.add_edge( - source_id=source_node, - target_id=target_node, - ) - - self._process_standard_edge(graph, edge_data) - - def _process_standard_edge(self, graph: Graph, edge_data: dict) -> None: - """Process standard edges that contain both inputs and outputs.""" - if "inputs" not in edge_data or "outputs" not in edge_data: - return - for source_node in edge_data["outputs"]: - for target_node in edge_data["inputs"]: - if self._is_node_id_hidden(source_node) or self._is_node_id_hidden( - target_node, - ): - continue - graph.add_edge( - source_id=source_node, - target_id=target_node, - ) diff --git a/neural_insights/components/graph/reader/pytorch_reader.py b/neural_insights/components/graph/reader/pytorch_reader.py deleted file mode 100644 index 7bcab50ca34..00000000000 --- a/neural_insights/components/graph/reader/pytorch_reader.py +++ /dev/null @@ -1,34 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""PyTorch Graph reader.""" - -from typing import Dict - -from neural_insights.components.graph.graph import Graph -from neural_insights.components.model.model import Model - - -class PyTorchReader: - """Graph Reader for PyTorch.""" - - def __init__(self, model: Model) -> None: - """Initialize object.""" - self._hidden_node_ids: Dict[str, bool] = {} - self.model: Model = model - - def read(self) -> Graph: - """Read a graph.""" - graph = Graph() - return graph diff --git a/neural_insights/components/graph/reader/tensorflow_reader.py b/neural_insights/components/graph/reader/tensorflow_reader.py deleted file mode 100644 index f6866785550..00000000000 --- a/neural_insights/components/graph/reader/tensorflow_reader.py +++ /dev/null @@ -1,150 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Tensorflow Graph reader.""" - -from typing import Any, Dict, List, Optional - -from neural_insights.components.graph.attribute import Attribute -from neural_insights.components.graph.graph import Graph -from neural_insights.components.graph.node import Node -from neural_insights.components.model.model import Model -from neural_insights.utils.exceptions import NotFoundException - - -class TensorflowReader: - """Graph Reader for Tensorflow.""" - - def __init__(self, model: Model) -> None: - """Initialize object.""" - self._hidden_node_ids: Dict[str, bool] = {} - self.model: Model = model - - def read(self) -> Graph: - """Read a graph.""" - self._hidden_node_ids = {} - - from neural_insights.components.model.tensorflow.model import TensorflowModel - - if not isinstance(self.model, TensorflowModel): - raise NotFoundException(f"{self.model.path} is not Tensorflow model.") - - graph_def = self.model.nc_model_instance.graph_def - - graph = Graph() - - for node_def in graph_def.node: - if self._should_hide_node(node_def): - self._hide_node(node_def) - continue - - current_node_id = node_def.name - - graph.add_node( - Node( - id=current_node_id, - label=node_def.op, - highlight=False, - properties={ - "name": node_def.name, - "type": node_def.op, - }, - attributes=self._convert_attributes(node_def), - groups=self._get_group_names(current_node_id), - ), - ) - - for input_node_name in node_def.input: - if self._is_node_id_hidden(input_node_name) or self._is_node_id_hidden( - current_node_id, - ): - continue - graph.add_edge( - source_id=input_node_name, - target_id=current_node_id, - ) - - return graph - - def _get_group_names(self, node_id: str) -> List[str]: - """Get a group names from Node starting from the top.""" - elements = node_id.split("/") - names = [] - for idx in range(1, len(elements)): - names.append("/".join(elements[0:idx])) - return names - - def _should_hide_node(self, node_def: Any) -> bool: - """Check if given node should be hidden.""" - if node_def.op not in ["Const", "Identity"]: - return False - - if self._node_def_has_not_hidden_inputs(node_def): - return False - - return True - - def _node_def_has_not_hidden_inputs(self, node_def: Any) -> bool: - """Check if node has any visible input.""" - not_hidden_input_ids = list( - filter( - lambda input_node: input_node not in self._hidden_node_ids, - node_def.input, - ), - ) - return len(not_hidden_input_ids) > 0 - - def _hide_node(self, node: Any) -> None: - """Mark node as hidden.""" - self._hidden_node_ids[node.name] = True - - def _is_node_id_hidden(self, node_id: str) -> bool: - """Check if provided node_id is hidden.""" - return node_id in self._hidden_node_ids - - def _convert_attributes(self, node_def: Any) -> List[Attribute]: - """Convert NodeDef attributes to our format.""" - attributes = [] - - for attribute_name in node_def.attr: - converted_attribute = self._convert_attribute( - attribute_name, - node_def.attr[attribute_name], - ) - if converted_attribute is not None: - attributes.append(converted_attribute) - - return attributes - - def _convert_attribute(self, name: str, value: Any) -> Optional[Attribute]: - """Convert NodeDef attribute to our format.""" - from tensorflow.python.framework.dtypes import _TYPE_TO_STRING - - if name == "shape": - shape = [dim.size for dim in value.shape.dim] - return Attribute( - name, - "shape", - shape, - ) - - if 0 != len(value.s): - return Attribute(name, "string", str(value.s.decode("utf-8"))) - if 0 != value.type: - return Attribute( - name, - "type", - _TYPE_TO_STRING.get(value.type, "UNKNOWN"), - ) - return None diff --git a/neural_insights/components/model/__init__.py b/neural_insights/components/model/__init__.py deleted file mode 100644 index 32ce5f8d7cb..00000000000 --- a/neural_insights/components/model/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The model package contains all model related code used in Neural Insights server.""" diff --git a/neural_insights/components/model/domain.py b/neural_insights/components/model/domain.py deleted file mode 100644 index 1a20138d314..00000000000 --- a/neural_insights/components/model/domain.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Model domain class.""" -from neural_insights.utils.json_serializer import JsonSerializer - - -class Domain(JsonSerializer): - """Model domain definition.""" - - def __init__(self, domain: str = "", domain_flavour: str = "") -> None: - """Object construction.""" - super().__init__() - - if not domain and domain_flavour: - raise ValueError("Domain must be set when given flavour") - - self.domain = domain - self.domain_flavour = domain_flavour diff --git a/neural_insights/components/model/model.py b/neural_insights/components/model/model.py deleted file mode 100644 index fec5aa17261..00000000000 --- a/neural_insights/components/model/model.py +++ /dev/null @@ -1,140 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The abstract model class.""" - -from abc import ABC, abstractmethod -from typing import Any, List, Optional - -from neural_insights.components.graph.graph import Graph -from neural_insights.components.model.domain import Domain -from neural_insights.components.model.shape import Shape -from neural_insights.utils.consts import DomainFlavours, Domains -from neural_insights.utils.logger import log -from neural_insights.utils.utils import get_size - - -class Model(ABC): - """Abstract model class.""" - - def __init__(self, path: str) -> None: - """Initialize object.""" - self.ensure_supported_path(path) - self.path = path - self.size = get_size(self.path) - self.framework = None - - def get_input_nodes(self) -> Optional[List[Any]]: - """Get model input nodes.""" - self.guard_requirements_installed() - return None - - def get_output_nodes(self) -> Optional[List[Any]]: - """Get model output nodes.""" - self.guard_requirements_installed() - return None - - def ensure_supported_path(self, path: str) -> None: - """Make sure that provided path is to supported model.""" - if not self.supports_path(path): - klass = self.__class__ - model_name = ".".join([klass.__module__, klass.__qualname__]) - raise AttributeError(f"Model path: {path} is not supported by {model_name} class.") - - def get_model_graph(self) -> Graph: - """Get model graph.""" - raise NotImplementedError(f"Reading graph for model {self.path} is not supported.") - - def get_tensors_info(self) -> dict: - """Get information about tensors.""" - raise NotImplementedError( - f"Getting tensors informarmation for model {self.path} is not supported.", - ) - - @property - def domain(self) -> Domain: - """Get model domain.""" - try: - node_names = {node.id for node in self.get_model_graph().nodes} - except Exception: - return Domain() - - def has_name_part(name_part: str) -> bool: - """Check if a node exists with given name_part.""" - return bool([name for name in node_names if name_part in name]) - - def has_all_name_parts(name_parts: List[str]) -> bool: - """Check if there is a node for every name_part.""" - missing = [name_part for name_part in name_parts if not has_name_part(name_part)] - return not missing - - if has_all_name_parts(["bboxes", "scores", "classes", "ssd"]): - return Domain( - domain=Domains.OBJECT_DETECTION.value, - domain_flavour=DomainFlavours.SSD.value, - ) - if has_all_name_parts(["boxes", "yolo"]): - return Domain( - domain=Domains.OBJECT_DETECTION.value, - domain_flavour=DomainFlavours.YOLO.value, - ) - if has_all_name_parts(["boxes", "scores", "classes"]): - return Domain(domain=Domains.OBJECT_DETECTION.value) - if has_all_name_parts(["resnet"]): - return Domain(domain=Domains.IMAGE_RECOGNITION.value) - return Domain() - - @property - def input_shape(self) -> Shape: - """Try to detect data shape.""" - return Shape(trusted=True) - - @property - def shape_elements_order(self) -> List[str]: - """Get order of input shape channels.""" - raise NotImplementedError - - @staticmethod - @abstractmethod - def get_framework_name() -> str: - """Get the name of framework.""" - - @staticmethod - @abstractmethod - def supports_path(path: str) -> bool: - """Check if given path is of supported model.""" - - @property - def supports_profiling(self) -> bool: - """Check if profiling is supported for the model.""" - return False - - @property - def supports_graph(self) -> bool: - """Check if it is possible to display model's graph.""" - try: - self.get_model_graph() - return True - except Exception: - log.debug("Could not load graph of model.") - return False - - @property - def supports_pruning(self) -> bool: - """Check if pruning is supported for the model.""" - return False - - @abstractmethod - def guard_requirements_installed(self) -> None: - """Ensure all requirements are installed.""" diff --git a/neural_insights/components/model/model_type_getter.py b/neural_insights/components/model/model_type_getter.py deleted file mode 100644 index b82c96266b7..00000000000 --- a/neural_insights/components/model/model_type_getter.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Model type getter.""" - -from neural_compressor.model.model import get_model_type as nc_get_model_type -from neural_insights.utils.expiring_dict import ExpiringDict - -model_type_cache = ExpiringDict(ttl=600) - - -def get_model_type(model_path: str) -> str: - """Get model_type using local cache.""" - try: - return model_type_cache[model_path] - except KeyError: - try: - model_type = nc_get_model_type(model_path) - except Exception: - model_type = "not a model" - model_type_cache[model_path] = model_type - return model_type diff --git a/neural_insights/components/model/onnxrt/__init__.py b/neural_insights/components/model/onnxrt/__init__.py deleted file mode 100644 index e52d96d6833..00000000000 --- a/neural_insights/components/model/onnxrt/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""OnnxRt related models.""" diff --git a/neural_insights/components/model/onnxrt/model.py b/neural_insights/components/model/onnxrt/model.py deleted file mode 100644 index e60c0a1d457..00000000000 --- a/neural_insights/components/model/onnxrt/model.py +++ /dev/null @@ -1,230 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Onnxrt model class.""" -# pylint: disable=import-error -# pylint: disable=no-name-in-module -import os -import re -import sys -from typing import Any, List, Optional - -from neural_compressor.experimental.common.model import Model as NCModel -from neural_compressor.model.onnx_model import ONNXModel -from neural_compressor.utils.logger import Logger -from neural_insights.components.graph.graph import Graph -from neural_insights.components.graph.reader.onnxrt_reader import OnnxrtReader -from neural_insights.components.model.domain import Domain -from neural_insights.components.model.model import Model -from neural_insights.components.model.shape import Shape -from neural_insights.utils.consts import DomainFlavours, Domains, Frameworks -from neural_insights.utils.logger import log -from neural_insights.utils.utils import check_module, get_file_extension - - -class OnnxrtModel(Model): - """Onnxrt Model class.""" - - def __init__(self, path: str) -> None: - """Initialize object.""" - super().__init__(path) - self._nc_model_instance: Optional[ONNXModel] = None - - @property - def domain(self) -> Domain: - """Get model domain.""" - try: - input_node_names = {node.name for node in self.nc_model_instance.graph().input} # pylint: disable=E1101 - node_names = {node.name for node in self.nc_model_instance.nodes()} # pylint: disable=E1101 - boundary_nodes = [node.name for node in self.nc_model_instance.graph().input] # pylint: disable=E1101 - boundary_nodes.extend( - [node.name for node in self.nc_model_instance.graph().output], # pylint: disable=E1101 - ) - op_names = {node.op_type for node in self.nc_model_instance.nodes()} # pylint: disable=E1101 - - except Exception: - return Domain() - - nlp_domain = self._check_nlp_domain(input_node_names) - if nlp_domain is not None: - return nlp_domain - - object_detection_domain = self._check_object_detection_domain( - node_names, - boundary_nodes, - op_names, - ) - if object_detection_domain is not None: - return object_detection_domain - - image_recognition_domain = self._check_image_recognition_domain(op_names) - if image_recognition_domain is not None: - return image_recognition_domain - - return Domain() - - @staticmethod - def _has_any_name_parts(nodes: set, name_parts: List[str]) -> bool: - """Check if there is at least one node for name_parts.""" - matching_names = [] - for node in nodes: - for partial_name in name_parts: - search = re.match(partial_name, node) - if search: - matching_names.append(node) - return bool(matching_names) - - def _check_nlp_domain(self, input_node_names: set) -> Optional[Domain]: - """Check if model fits into NLP domain.""" - if self._has_any_name_parts( - input_node_names, - ["input_ids", "input_mask", "segment_ids"], - ): - return Domain( - domain=Domains.NLP.value, - domain_flavour=DomainFlavours.NONE.value, - ) - return None - - def _check_object_detection_domain( - self, - node_names: set, - boundary_nodes: list, - op_names: set, - ) -> Optional[Domain]: - """Check if model fits into Object Detection domain.""" - if ( - self._has_any_name_parts( - node_names, - ["NonMaxSuppression", "box", "score", "class", "detection"], - ) - or self._has_any_name_parts(op_names, ["NonMaxSuppression"]) - or self._has_any_name_parts( - set(boundary_nodes), - ["NonMaxSuppression", "box", "score", "class", "detection"], - ) - ): - return Domain( - domain=Domains.OBJECT_DETECTION.value, - domain_flavour=DomainFlavours.NONE.value, - ) - return None - - def _check_image_recognition_domain(self, op_names: set) -> Optional[Domain]: - """Check if model fits into Image Recognition domain.""" - if self._has_any_name_parts(op_names, ["Conv", "Relu/Clip"]): - return Domain( - domain=Domains.IMAGE_RECOGNITION.value, - domain_flavour=DomainFlavours.NONE.value, - ) - return None - - @property - def input_shape(self) -> Shape: - """Try to detect data shape.""" - from google.protobuf.json_format import MessageToDict - - shape = None - trusted = False - - if self.domain.domain == Domains.IMAGE_RECOGNITION.value: - shape_list = [] - - for input_node in self.filtered_input_nodes: - node_dict = MessageToDict(input_node) - dimensions = node_dict.get("type", {}).get("tensorType", {}).get("shape", {}).get("dim", []) - input_shape = [] - for dim in dimensions: - if dim.get("dimValue", None) is not None: - input_shape.append(dim["dimValue"]) - shape_list.append(",".join(input_shape)) - - if len(shape_list) == 1: - shape = shape_list[0] - shape = remove_number_of_samples_from_shape(shape) - trusted = True - if len(shape_list) > 1: - adjusted_shapes_list = [] - for sub_shape in shape_list: - adjusted_shapes_list.append( - remove_number_of_samples_from_shape(sub_shape), - ) - shape = ",".join( - ["[" + sub_shape + "]" for sub_shape in adjusted_shapes_list], - ) - trusted = True - - return Shape(shape=shape, trusted=trusted) - - @property - def shape_elements_order(self) -> List[str]: - """Get order of input shape channels.""" - return ["channels", "height", "width"] - - @staticmethod - def get_framework_name() -> str: - """Get the name of framework.""" - return Frameworks.ONNX.value - - def get_model_graph(self) -> Graph: - """Get model Graph.""" - graph_reader = OnnxrtReader(self) - return graph_reader.read() - - @property - def nc_model_instance(self) -> ONNXModel: - """Get Neural Compressor Model instance.""" - self._ensure_nc_model_instance() - return self._nc_model_instance - - def _ensure_nc_model_instance(self) -> None: - """Create Neural Compressor Model instance if needed.""" - if self._nc_model_instance is not None: - return - model_name = os.path.splitext(os.path.basename(self.path))[0] - Logger().get_logger().setLevel(log.level) - self._nc_model_instance = NCModel(self.path) - self._nc_model_instance.name = model_name - - @staticmethod - def supports_path(path: str) -> bool: - """Check if given path is of supported model.""" - return "onnx" == get_file_extension(path) - - def guard_requirements_installed(self) -> None: - """Ensure all requirements are installed.""" - check_module("onnx") - check_module("onnxruntime") - if sys.version_info < (3, 11): # pragma: no cover - check_module("onnxruntime_extensions") - - @property - def filtered_input_nodes(self) -> List[Any]: - """Get filtered input nodes.""" - input_nodes = self.nc_model_instance.graph().input # pylint: disable=E1101 - name_to_input = {} - for input in input_nodes: - name_to_input[input.name] = input - for initializer in self.nc_model_instance.graph().initializer: # pylint: disable=E1101 - if initializer.name in name_to_input: - input_nodes.remove(name_to_input[initializer.name]) - return input_nodes - - -def remove_number_of_samples_from_shape(shape: str) -> str: - """Remove number of samples from shape if exists.""" - shape_as_list = shape.split(",") - if len(shape_as_list) > 3: - shape_as_list.pop(0) - return ",".join(shape_as_list) diff --git a/neural_insights/components/model/pytorch/__init__.py b/neural_insights/components/model/pytorch/__init__.py deleted file mode 100644 index 0e070ced844..00000000000 --- a/neural_insights/components/model/pytorch/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""PyTorch related models.""" diff --git a/neural_insights/components/model/pytorch/model.py b/neural_insights/components/model/pytorch/model.py deleted file mode 100644 index 1d21fa823f1..00000000000 --- a/neural_insights/components/model/pytorch/model.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""PyTorch model class.""" -from neural_insights.components.graph.graph import Graph -from neural_insights.components.graph.reader.pytorch_reader import PyTorchReader -from neural_insights.components.model.model import Model -from neural_insights.utils.consts import Frameworks -from neural_insights.utils.utils import check_module, get_file_extension - - -class PyTorchModel(Model): - """PyTorch Script Model class.""" - - def get_model_graph(self) -> Graph: - """Get model summary.""" - graph_reader = PyTorchReader(self) - return graph_reader.read() - - def __init__(self, path: str) -> None: - """Initialize object.""" - super().__init__(path) - - @staticmethod - def get_framework_name() -> str: - """Get the name of framework.""" - return Frameworks.PT.value - - @staticmethod - def supports_path(path: str) -> bool: - """Check if given path is of supported model.""" - return "pt" == get_file_extension(path) - - def guard_requirements_installed(self) -> None: - """Ensure all requirements are installed.""" - check_module("torch") diff --git a/neural_insights/components/model/pytorch/pytorch_script/__init__.py b/neural_insights/components/model/pytorch/pytorch_script/__init__.py deleted file mode 100644 index 0e070ced844..00000000000 --- a/neural_insights/components/model/pytorch/pytorch_script/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""PyTorch related models.""" diff --git a/neural_insights/components/model/pytorch/pytorch_script/model.py b/neural_insights/components/model/pytorch/pytorch_script/model.py deleted file mode 100644 index 9718d0fa43b..00000000000 --- a/neural_insights/components/model/pytorch/pytorch_script/model.py +++ /dev/null @@ -1,54 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""PyTorch model class.""" -import re -from typing import List - -from neural_insights.components.model.model import Model -from neural_insights.utils.consts import Frameworks -from neural_insights.utils.utils import check_module, get_file_extension - - -class PyTorchScriptModel(Model): - """PyTorch Script Model class.""" - - def __init__(self, path: str) -> None: - """Initialize object.""" - super().__init__(path) - - @staticmethod - def _has_any_name_parts(nodes: set, name_parts: List[str]) -> bool: - """Check if there is at least one node for name_parts.""" - matching_names = [] - for node in nodes: - for partial_name in name_parts: - search = re.match(partial_name, node) - if search: - matching_names.append(node) - return bool(matching_names) - - @staticmethod - def get_framework_name() -> str: - """Get the name of framework.""" - return Frameworks.PT.value - - @staticmethod - def supports_path(path: str) -> bool: - """Check if given path is of supported model.""" - return "py" == get_file_extension(path) - - def guard_requirements_installed(self) -> None: - """Ensure all requirements are installed.""" - check_module("torch") diff --git a/neural_insights/components/model/repository.py b/neural_insights/components/model/repository.py deleted file mode 100644 index 2e5fa748bc7..00000000000 --- a/neural_insights/components/model/repository.py +++ /dev/null @@ -1,86 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Model repository.""" - -from typing import List, Type - -from neural_insights.components.model.model import Model -from neural_insights.components.model.onnxrt.model import OnnxrtModel -from neural_insights.components.model.pytorch.model import PyTorchModel -from neural_insights.components.model.pytorch.pytorch_script.model import PyTorchScriptModel -from neural_insights.components.model.tensorflow.frozen_pb import FrozenPbModel -from neural_insights.components.model.tensorflow.keras import KerasModel -from neural_insights.components.model.tensorflow.meta_graph import MetaGraphModel -from neural_insights.components.model.tensorflow.saved_model import SavedModelModel -from neural_insights.utils.exceptions import NotFoundException -from neural_insights.utils.logger import log - - -class ModelRepository: - """Model repository.""" - - def __init__(self) -> None: - """Initialize class.""" - self.model_types: List[Type[Model]] = [ - FrozenPbModel, - KerasModel, - MetaGraphModel, - OnnxrtModel, - SavedModelModel, - PyTorchScriptModel, - PyTorchModel, - ] - - def get_model(self, path: str) -> Model: - """Get Model for given path.""" - for model_type in self.model_types: - supports_path = model_type.supports_path(path) - log.debug(f"{model_type.__name__}: {supports_path}") - if model_type.supports_path(path): - return model_type(path) - - raise NotFoundException(f"Unable to find Model for path {path}") - - def get_frameworks(self) -> List[str]: - """Get list of supported frameworks.""" - unique_frameworks = {model.get_framework_name() for model in self.model_types} - return sorted(unique_frameworks) - - @staticmethod - def get_framework_from_path(model_path: str) -> str: - """Get framework name from model extension. - - :param model_path: Path to model. - """ - model_repository = ModelRepository() - try: - model = model_repository.get_model(model_path) - return model.get_framework_name() - except NotFoundException: - raise NotFoundException("Framework was not recognized.") - - @staticmethod - def get_supported_frameworks() -> List[str]: - """Get list of supported frameworks.""" - return ModelRepository().get_frameworks() - - @staticmethod - def is_model_path(path: str) -> bool: - """Check if provided path is for model.""" - try: - ModelRepository().get_model(path) - return True - except NotFoundException: - return False diff --git a/neural_insights/components/model/shape.py b/neural_insights/components/model/shape.py deleted file mode 100644 index 8c3cf546013..00000000000 --- a/neural_insights/components/model/shape.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Data shape class.""" -from typing import Any, Dict, List, Optional, Union - -from neural_insights.utils.json_serializer import JsonSerializer - - -class Shape(JsonSerializer): - """Data shape definition.""" - - def __init__(self, shape: Optional[str] = "", trusted: bool = False) -> None: - """Object construction.""" - super().__init__() - - self.shape = shape - self.trusted = trusted - - def serialize( - self, - serialization_type: str = "default", - ) -> Union[Dict[str, Any], List[Dict[str, Any]]]: - """Serialize Shape class to dict.""" - result = {} - for key, value in self.__dict__.items(): - if key in self._skip: - continue - result.update({key: value}) - return result diff --git a/neural_insights/components/model/tensorflow/__init__.py b/neural_insights/components/model/tensorflow/__init__.py deleted file mode 100644 index 61a68631837..00000000000 --- a/neural_insights/components/model/tensorflow/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Tensorflow related models.""" diff --git a/neural_insights/components/model/tensorflow/frozen_pb.py b/neural_insights/components/model/tensorflow/frozen_pb.py deleted file mode 100644 index 4bfcdc3abea..00000000000 --- a/neural_insights/components/model/tensorflow/frozen_pb.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Tensorflow frozen pb model.""" - -from neural_insights.components.model.model_type_getter import get_model_type -from neural_insights.components.model.tensorflow.model import TensorflowModel as TFModel - - -class FrozenPbModel(TFModel): - """Frozen pb model.""" - - @staticmethod - def supports_path(path: str) -> bool: - """Check if given path is of supported model.""" - return "frozen_pb" == get_model_type(path) - - @property - def supports_profiling(self) -> bool: - """Check if profiling is supported for the model.""" - return True diff --git a/neural_insights/components/model/tensorflow/keras.py b/neural_insights/components/model/tensorflow/keras.py deleted file mode 100644 index d5dbecabdb6..00000000000 --- a/neural_insights/components/model/tensorflow/keras.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Tensorflow keras model.""" - -from typing import Any, List, Optional - -from neural_insights.components.model.model_type_getter import get_model_type -from neural_insights.components.model.tensorflow.model import TensorflowModel as TFModel - - -class KerasModel(TFModel): - """Keras model.""" - - def get_input_nodes(self) -> Optional[List[Any]]: - """Get model input nodes.""" - return None - - def get_output_nodes(self) -> Optional[List[Any]]: - """Get model output nodes.""" - return None - - @staticmethod - def supports_path(path: str) -> bool: - """Check if given path is of supported model.""" - return "keras" == get_model_type(path) diff --git a/neural_insights/components/model/tensorflow/meta_graph.py b/neural_insights/components/model/tensorflow/meta_graph.py deleted file mode 100644 index d20ef3b2771..00000000000 --- a/neural_insights/components/model/tensorflow/meta_graph.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Tensorflow frozen pb model.""" - -from typing import Any, List, Optional - -from neural_insights.components.graph.graph import Graph -from neural_insights.components.model.model_type_getter import get_model_type -from neural_insights.components.model.tensorflow.model import TensorflowModel as TFModel - - -class MetaGraphModel(TFModel): - """MetaGraph model.""" - - def get_input_nodes(self) -> Optional[List[Any]]: - """Get model input nodes.""" - return [] - - def get_output_nodes(self) -> Optional[List[Any]]: - """Get model output nodes.""" - return [] - - def get_model_graph(self) -> Graph: - """Get model graph.""" - raise NotImplementedError("Reading graph for MetaGraph is not supported.") - - @staticmethod - def supports_path(path: str) -> bool: - """Check if given path is of supported model.""" - return "checkpoint" == get_model_type(path) diff --git a/neural_insights/components/model/tensorflow/model.py b/neural_insights/components/model/tensorflow/model.py deleted file mode 100644 index 663556bcdc3..00000000000 --- a/neural_insights/components/model/tensorflow/model.py +++ /dev/null @@ -1,125 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Abstract Tensorflow model class.""" -# pylint: disable=import-error -# pylint: disable=no-name-in-module -import os.path -from typing import Any, List, Optional - -from neural_compressor.experimental.common.model import Model as NCModel -from neural_compressor.model.model import TensorflowBaseModel -from neural_compressor.utils.logger import Logger -from neural_insights.components.graph.graph import Graph -from neural_insights.components.graph.reader.tensorflow_reader import TensorflowReader -from neural_insights.components.model.model import Model -from neural_insights.components.model.shape import Shape -from neural_insights.components.model.tensorflow.utils import get_input_shape -from neural_insights.utils.consts import Domains, Frameworks -from neural_insights.utils.logger import log -from neural_insights.utils.utils import check_module - - -class TensorflowModel(Model): - """Abstract TensorFlow Model class.""" - - def __init__(self, path: str) -> None: - """Initialize object.""" - super().__init__(path) - self._nc_model_instance: Optional[TensorflowBaseModel] = None - - def get_input_nodes(self) -> Optional[List[Any]]: - """Get model input nodes.""" - self.guard_requirements_installed() - - # pylint: disable=maybe-no-member - return self.nc_model_instance.input_node_names - - def get_output_nodes(self) -> Optional[List[Any]]: - """Get model output nodes.""" - self.guard_requirements_installed() - - # pylint: disable=maybe-no-member - return self.nc_model_instance.output_node_names + ["custom"] - - def get_model_graph(self) -> Graph: - """Get model Graph.""" - graph_reader = TensorflowReader(self) - return graph_reader.read() - - @property - def nc_model_instance(self) -> TensorflowBaseModel: - """Get Neural Compressor Model instance.""" - self._ensure_nc_model_instance() - return self._nc_model_instance - - def _ensure_nc_model_instance(self) -> None: - """Create Neural Compressor Model instance if needed.""" - if self._nc_model_instance is not None: - return - model_name = os.path.splitext(os.path.basename(self.path))[0] - Logger().get_logger().setLevel(log.level) - self._nc_model_instance = NCModel(self.path) - self._nc_model_instance.name = model_name - - @property - def input_shape(self) -> Shape: - """Try to detect data shape.""" - try: - domain = Domains(self.domain.domain) - default_shapes = { - Domains.IMAGE_RECOGNITION: 224, - Domains.OBJECT_DETECTION: 300, - } - default_shape = default_shapes.get(domain, None) - except ValueError: - log.debug(f'Could not detect "{self.domain.domain}" domain.') - default_shape = None - - if default_shape is None: - return Shape(trusted=True) - - input_shape = [default_shape, default_shape, 3] - is_trusted = False - try: - # pylint: disable=maybe-no-member - input_shape = get_input_shape(self.nc_model_instance.graph_def, default_shape) - is_trusted = True - except Exception: - log.debug(f"Could not get input shape from model. Using default shape: {input_shape}") - - return Shape(shape=", ".join(map(str, input_shape)), trusted=is_trusted) - - @property - def shape_elements_order(self) -> List[str]: - """Get order of input shape channels.""" - return ["height", "width", "channels"] - - @staticmethod - def get_framework_name() -> str: - """Get the name of framework.""" - return Frameworks.TF.value - - @property - def supports_pruning(self) -> bool: - """Check if pruning is supported for the model.""" - try: - self.nc_model_instance.get_all_weight_names() - return True - except AttributeError: - return False - - def guard_requirements_installed(self) -> None: - """Ensure all requirements are installed.""" - check_module("tensorflow") diff --git a/neural_insights/components/model/tensorflow/saved_model.py b/neural_insights/components/model/tensorflow/saved_model.py deleted file mode 100644 index 1e59200b5db..00000000000 --- a/neural_insights/components/model/tensorflow/saved_model.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Tensorflow saved_model model.""" - -from neural_insights.components.model.model_type_getter import get_model_type -from neural_insights.components.model.tensorflow.model import TensorflowModel as TFModel - - -class SavedModelModel(TFModel): - """Saved_model model.""" - - @staticmethod - def supports_path(path: str) -> bool: - """Check if given path is of supported model.""" - return "saved_model" == get_model_type(path) diff --git a/neural_insights/components/model/tensorflow/utils.py b/neural_insights/components/model/tensorflow/utils.py deleted file mode 100644 index c0cf391a4a6..00000000000 --- a/neural_insights/components/model/tensorflow/utils.py +++ /dev/null @@ -1,64 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""TensorFlow model utils.""" - -from typing import Any, List - - -def get_input_shape(graph_def: Any, fix_dynamic_shape: int) -> List[int]: - """Get input shape of passed graph.""" - try: - import tensorflow.compat.v1 as tf_v1 - except ImportError: - import tensorflow as tf_v1 - - graph = tf_v1.Graph() - with graph.as_default(): # pylint: disable=not-context-manager - tf_v1.import_graph_def(graph_def, name="") - - node_dict = {} - for node in graph.as_graph_def().node: # pylint: disable=no-member - if node.op == "Placeholder": - node_dict = {"type": tf_v1.DType(node.attr["dtype"].type).name} - - if node_dict["type"] != "bool": - # convert shape to list - node["shape"] = _convert_shape_to_list(node, fix_dynamic_shape, tf_v1) - else: # deal with bool dtype inputs, now assign bool dtype input False value - node_dict["shape"] = None - node_dict["value"] = False - - return node_dict["shape"] - - -def _convert_shape_to_list( - node: Any, - fix_dynamic_shape: int, - tf_module: Any, -) -> list: - """Convert tensorflow shape to list.""" - try: - _shape = list(tf_module.TensorShape(node.attr["shape"].shape)) - if tf_module.__version__ >= "2.0.0": - shape = [item if item is not None else fix_dynamic_shape for item in _shape] - else: - shape = [item.value if item.value is not None else fix_dynamic_shape for item in _shape] - # if shape dimension > 1, suppose first dimension is batch-size - if isinstance(shape, list) and len(shape) > 1: - return shape[1:] - return shape - except ValueError: - _shape = [fix_dynamic_shape, fix_dynamic_shape, 3] - return _shape diff --git a/neural_insights/components/workload_manager/__init__.py b/neural_insights/components/workload_manager/__init__.py deleted file mode 100644 index fdec04a8c0d..00000000000 --- a/neural_insights/components/workload_manager/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The workload_manager package contains code used for Neural Insights workloads management.""" diff --git a/neural_insights/components/workload_manager/quantization_workload.py b/neural_insights/components/workload_manager/quantization_workload.py deleted file mode 100644 index 63979d61a57..00000000000 --- a/neural_insights/components/workload_manager/quantization_workload.py +++ /dev/null @@ -1,84 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The quantization_workload module for Neural Insights quantization workloads.""" -from typing import Any, Dict, Optional - -from neural_insights.components.workload_manager.workload import Workload -from neural_insights.utils.json_serializer import JsonSerializer - - -class QuantizationWorkload(Workload): - """QuantizationWorkload class.""" - - def __init__(self, data: Optional[dict] = None): - """Initialize Quantization Workload.""" - super().__init__(data) - if data is None: - data = {} - self.accuracy_data = AccuracyData(data.get("accuracy_data", None)) - - def serialize(self, serialization_type: str = "default") -> Dict[str, Any]: - """Serialize Workload class.""" - serialized_workload = super().serialize(serialization_type) - serialized_workload.update({"accuracy_data": self.accuracy_data.serialize()}) - return serialized_workload - - -class AccuracyData(JsonSerializer): - """AccuracyData class.""" - - def __init__(self, data: Optional[dict] = None): - """Initialize Accuracy Data.""" - super().__init__() - if data is None: - data = {} - self._baseline_accuracy: Optional[float] = data.get("baseline_accuracy", None) - self._optimized_accuracy: Optional[float] = data.get("optimized_accuracy", None) - - @property - def baseline_accuracy(self) -> Optional[float]: - """Get baseline accuracy. - - Returns: baseline accuracy value - """ - return self._baseline_accuracy - - @property - def optimized_accuracy(self) -> Optional[float]: - """Get optimized accuracy. - - Returns: optimized accuracy value - """ - return self._optimized_accuracy - - @property - def ratio(self) -> Optional[float]: - """Get accuracy ratio. - - Returns: accuracy ratio if baseline and optimized accuracy are present - Otherwise returns None - """ - if self.optimized_accuracy in [None, 0] or self.baseline_accuracy in [None, 0]: - return None - - return (self.optimized_accuracy - self.baseline_accuracy) / self.baseline_accuracy - - def serialize(self, serialization_type: str = "default") -> Dict[str, Any]: - """Serialize AccuracyData class.""" - return { - "baseline_accuracy": self.baseline_accuracy, - "optimized_accuracy": self.optimized_accuracy, - "ratio": self.ratio, - } diff --git a/neural_insights/components/workload_manager/workload.py b/neural_insights/components/workload_manager/workload.py deleted file mode 100644 index a4a9f15732e..00000000000 --- a/neural_insights/components/workload_manager/workload.py +++ /dev/null @@ -1,87 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The workload module for Neural Insights workloads.""" - -import os -from datetime import datetime -from typing import Any, Dict, Optional -from uuid import uuid4 - -from neural_insights.utils.consts import Frameworks, WorkloadModes, WorkloadStatus -from neural_insights.utils.exceptions import InternalException -from neural_insights.utils.json_serializer import JsonSerializer -from neural_insights.utils.utils import get_framework_from_path - - -class Workload(JsonSerializer): - """Workload class.""" - - def __init__(self, data: Optional[dict] = None): - """Initialize Workload.""" - super().__init__() - if data is None: - data = {} - self.uuid = str(data.get("uuid", uuid4())) - self.creation_time: int = int(data.get("creation_time", datetime.now().timestamp())) - self.workload_location: str = data.get("workload_location", None) - - mode = data.get("mode") - self.workload_name = data.get("workload_name", mode) - if not isinstance(mode, WorkloadModes) and isinstance(mode, str): - mode = WorkloadModes(mode) - self.mode: WorkloadModes = mode - - status = data.get("status", WorkloadStatus.NEW) - if not isinstance(status, WorkloadStatus) and isinstance(status, str): - status = WorkloadStatus(status) - self.status: WorkloadStatus = status - - self._model_path: str = data.get("model_path", None) - - framework = data.get("framework", None) - if not isinstance(framework, Frameworks): - if framework is None and self.model_path is not None: - framework = get_framework_from_path(self.model_path) - if isinstance(framework, str): - framework = Frameworks(framework) - self.framework: Optional[Frameworks] = framework - - self.model_summary_file = data.get("model_summary_file", None) - - @property - def model_path(self) -> str: - """Get model_path.""" - return self._model_path - - @model_path.setter - def model_path(self, model_path: str) -> None: - if not os.path.exists(model_path): - raise InternalException("Could not locate model.") - self._model_path = model_path - self.framework = Frameworks(get_framework_from_path(self.model_path)) - - def serialize(self, serialization_type: str = "default") -> Dict[str, Any]: - """Serialize Workload class.""" - return { - "uuid": self.uuid, - "workload_name": self.workload_name, - "framework": self.framework.value, - "workload_location": self.workload_location, - "mode": self.mode.value, - "model_path": self.model_path, - "model_summary_file": self.model_summary_file, - "status": self.status.value, - "creation_time": self.creation_time, - } diff --git a/neural_insights/components/workload_manager/workload_manager.py b/neural_insights/components/workload_manager/workload_manager.py deleted file mode 100644 index 8f65f9523ce..00000000000 --- a/neural_insights/components/workload_manager/workload_manager.py +++ /dev/null @@ -1,171 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The workload_manager module contains code used for Neural Insights workloads management.""" - -import json -import os -import shutil -from os import PathLike -from typing import List, Optional - -from neural_insights.components.workload_manager.quantization_workload import AccuracyData, QuantizationWorkload -from neural_insights.components.workload_manager.workload import Workload -from neural_insights.utils.consts import WORKDIR_LOCATION, WorkloadModes, WorkloadStatus -from neural_insights.utils.exceptions import ClientErrorException, InternalException -from neural_insights.utils.json_serializer import JsonSerializer -from neural_insights.utils.logger import log -from neural_insights.utils.singleton import Singleton - - -class WorkloadManager(JsonSerializer, metaclass=Singleton): - """Workload Manager class.""" - - def __init__(self, workdir_location: Optional[PathLike] = None): - """Initialize WorkloadManager.""" - super().__init__() - if workdir_location is None: - log.debug("Using default workdir location.") - workdir_location = WORKDIR_LOCATION - self.config_path = os.path.join(workdir_location, "neural_insights", "config.json") - self._version: int = 1 - self._workloads: List[Workload] = [] - - self.load_workloads() - self.dump_config() - - def add_workload(self, workload: Workload) -> None: - """Add workload.""" - self._workloads.append(workload) - self.dump_config() - - def update_workload_status(self, workload_uuid: str, status: str) -> None: - """Update workload status.""" - try: - new_status = WorkloadStatus(status) - except ValueError: - raise ClientErrorException("Could not parse status.") - workload = self.get_workload(workload_uuid) - current_status = workload.status - self.validate_status_flow(current_status, new_status) - workload.status = new_status - self.dump_config() - - def update_workload_accuracy_data( - self, - workload_uuid: str, - baseline_accuracy: float, - optimized_accuracy: float, - ) -> None: - """Update workload status.""" - workload = self.get_workload(workload_uuid) - if not isinstance(workload, QuantizationWorkload): - raise ClientErrorException( - "Accuracy data is only available in quantization workloads.", - ) - - accuracy_data = AccuracyData( - { - "baseline_accuracy": baseline_accuracy, - "optimized_accuracy": optimized_accuracy, - }, - ) - workload.accuracy_data = accuracy_data - self.dump_config() - - @staticmethod - def validate_status_flow( - prev_status: WorkloadStatus, - new_status: WorkloadStatus, - ) -> None: - """Validate status flow.""" - status_indices = { - WorkloadStatus.NEW: 0, - WorkloadStatus.WIP: 1, - WorkloadStatus.SUCCESS: 2, - WorkloadStatus.FAILURE: 3, - } - status_connections = [(0, 1), (1, 2), (1, 3)] - - # Initialize adjacency matrix with zeros - adjacency_matrix = [[0 for _ in status_indices] for _ in status_indices] - for source, target in status_connections: - adjacency_matrix[source][target] = 1 - - prev_status_indice = status_indices[prev_status] - new_status_indice = status_indices[new_status] - if adjacency_matrix[prev_status_indice][new_status_indice] != 1: - raise ClientErrorException( - f"Changing status from {prev_status.value} to {new_status.value} is not allowed.", - ) - - def load_workloads(self) -> None: - """Read workloads from config file.""" - if not os.path.exists(self.config_path): - return - with open(self.config_path, "r") as config_file: - config_data = json.load(config_file) - config_version = int(config_data.get("version")) - if config_version != self._version: - raise InternalException( - f"Incompatible config version has been found. " - f"Expected version: {self._version}, found {config_version}.", - ) - workloads_config = config_data.get("workloads", []) - if not isinstance(workloads_config, list): - raise InternalException( - "Incompatible format of workloads. Workloads should be a list.", - ) - self._workloads = [] - for workload_config in workloads_config: - if workload_config.get("mode") == WorkloadModes.QUANTIZATION.value: - workload = QuantizationWorkload(workload_config) - else: - workload = Workload(workload_config) - self._workloads.append(workload) - - def dump_config(self) -> None: - """Dump workloads to config file.""" - serialized_workloads = [workload.serialize() for workload in self._workloads] - data = { - "version": self._version, - "workloads": serialized_workloads, - } - - os.makedirs(os.path.dirname(self.config_path), exist_ok=True) - with open(self.config_path, "w") as config_file: - json.dump(data, config_file) - - @property - def workloads(self) -> List[Workload]: - """Get workloads list.""" - self.load_workloads() - return self._workloads - - def get_workload(self, workload_uuid: str) -> Workload: - """Get workload from workloads list.""" - for workload in self.workloads: - if workload.uuid == workload_uuid: - return workload - raise ClientErrorException("Could not find workload with specified ID.") - - def remove_workload(self, workload_uuid: str) -> str: - """Remove workload from workloads list.""" - for index, workload in enumerate(self.workloads): - if workload.uuid == workload_uuid: - shutil.rmtree(workload.workload_location, ignore_errors=True) - del self._workloads[index] - self.dump_config() - return workload.uuid - raise ClientErrorException("Could not find workload with specified ID.") diff --git a/neural_insights/docs/source/imgs/accuracy_decrease.png b/neural_insights/docs/source/imgs/accuracy_decrease.png deleted file mode 100644 index a90b7191f4e..00000000000 Binary files a/neural_insights/docs/source/imgs/accuracy_decrease.png and /dev/null differ diff --git a/neural_insights/docs/source/imgs/activations_summary.png b/neural_insights/docs/source/imgs/activations_summary.png deleted file mode 100644 index a1e83cb0d0f..00000000000 Binary files a/neural_insights/docs/source/imgs/activations_summary.png and /dev/null differ diff --git a/neural_insights/docs/source/imgs/activations_summary_onnx.jpg b/neural_insights/docs/source/imgs/activations_summary_onnx.jpg deleted file mode 100644 index a27df84cec2..00000000000 Binary files a/neural_insights/docs/source/imgs/activations_summary_onnx.jpg and /dev/null differ diff --git a/neural_insights/docs/source/imgs/min-max.jpg b/neural_insights/docs/source/imgs/min-max.jpg deleted file mode 100644 index 7aeee50abd8..00000000000 Binary files a/neural_insights/docs/source/imgs/min-max.jpg and /dev/null differ diff --git a/neural_insights/docs/source/imgs/ops_weights.png b/neural_insights/docs/source/imgs/ops_weights.png deleted file mode 100644 index 661d216d0ef..00000000000 Binary files a/neural_insights/docs/source/imgs/ops_weights.png and /dev/null differ diff --git a/neural_insights/docs/source/imgs/tune_result.png b/neural_insights/docs/source/imgs/tune_result.png deleted file mode 100644 index bfa324bf738..00000000000 Binary files a/neural_insights/docs/source/imgs/tune_result.png and /dev/null differ diff --git a/neural_insights/docs/source/imgs/tune_result2.png b/neural_insights/docs/source/imgs/tune_result2.png deleted file mode 100644 index 6d274a31a4b..00000000000 Binary files a/neural_insights/docs/source/imgs/tune_result2.png and /dev/null differ diff --git a/neural_insights/docs/source/imgs/weights_histogram.png b/neural_insights/docs/source/imgs/weights_histogram.png deleted file mode 100644 index 23323058f7b..00000000000 Binary files a/neural_insights/docs/source/imgs/weights_histogram.png and /dev/null differ diff --git a/neural_insights/docs/source/imgs/weights_histograms.png b/neural_insights/docs/source/imgs/weights_histograms.png deleted file mode 100644 index ed127fdc0f4..00000000000 Binary files a/neural_insights/docs/source/imgs/weights_histograms.png and /dev/null differ diff --git a/neural_insights/docs/source/imgs/weights_summary_onnx.jpg b/neural_insights/docs/source/imgs/weights_summary_onnx.jpg deleted file mode 100644 index 18b74c3107b..00000000000 Binary files a/neural_insights/docs/source/imgs/weights_summary_onnx.jpg and /dev/null differ diff --git a/neural_insights/docs/source/onnx_accuracy_debug.md b/neural_insights/docs/source/onnx_accuracy_debug.md deleted file mode 100644 index 78ddece14d3..00000000000 --- a/neural_insights/docs/source/onnx_accuracy_debug.md +++ /dev/null @@ -1,127 +0,0 @@ -# Step by step example how to debug accuracy with Neural Insights -1. [Introduction](#introduction) -2. [Preparation](#preparation) -3. [Running the quantization](#running-the-quantization) -4. [Analyzing the result of quantization](#-analyzing-the-result-of-quantization) - -# Introduction -In this instruction accuracy issue will be debugged using Neural Insights. ONNX LayoutLMv3 model will be used as an example. It will be quantized and the results will be analyzed to find the cause of the accuracy loss. - -# Preparation -## Requirements -First you need to install Intel® Neural Compressor and other requirements. -```shell -pip install neural-compressor -pip install datasets transformers torch torchvision -pip install onnx onnxruntime onnxruntime-extensions -pip install accelerate seqeval tensorboard sentencepiece timm fvcore Pillow einops textdistance shapely protobuf setuptools optimum -``` - -## Model -Get the LayoutLMv3 model from Intel® Neural Compressor [LayoutLMv3 example](https://github.com/intel/neural-compressor/tree/master/examples/onnxrt/nlp/huggingface_model/token_classification/layoutlmv3/quantization/ptq_static). -```shell -optimum-cli export onnx --model HYPJUDY/layoutlmv3-base-finetuned-funsd layoutlmv3-base-finetuned-funsd-onnx/ --task=token-classification -``` - -# Running the quantization -Generate a quantized model. -```python -onnx_model = onnx.load(input_model) -calib_dataset = IncDataset(eval_dataset, onnx_model) -config = PostTrainingQuantConfig(approach="static", quant_format="QOperator") -q_model = quantization.fit( - onnx_model, config, calib_dataloader=DataLoader(framework="onnxruntime", dataset=calib_dataset) -) -``` - -Execute benchmark to get the F1 score of both FP32 and INT8 models and then compute the relative accuracy ratio. -The output results indicate that the quantized model's accuracy is noticeably poor. - -``` -fp32 f1 = 0.9049, int8 f1 = 0.2989, accuracy ratio = -66.9631% -``` - -# Analyzing the result of quantization -In this section, the diagnosis tool is used for debugging to achieve higher INT8 model accuracy. -We need to set `diagnosis` parameter to `True` as shown below. -```python -config = PostTrainingQuantConfig( - approach="static", quant_format="QOperator", quant_level=1, diagnosis=True -) # set 'diagnosis' to True -q_model = quantization.fit( - onnx_model, config, eval_func=eval_func, calib_dataloader=DataLoader(framework="onnxruntime", dataset=calib_dataset) -) -``` -The diagnosis tool will output `Activations summary` and `Weights summary` in terminal. - -For easy to check, here we reload them to .csv files as shown below. -```python -import glob -import pandas as pd - -pd.set_option("display.max_rows", None) -pd.set_option("display.max_columns", None) - -subfolders = glob.glob("./nc_workspace" + "/*/") -subfolders.sort(key=os.path.getmtime, reverse=True) -if subfolders: - activations_table = os.path.join(subfolders[0], "activations_table.csv") - weights_table = os.path.join(subfolders[0], "weights_table.csv") - - activations_table = pd.read_csv(activations_table) - weights_table = pd.read_csv(weights_table) - - print("Activations summary") - display(activations_table) - - print("\nWeights summary") - display(weights_table) -``` - -## Weights summary -These are the top 10 rows from weights summary table: - -![weights_summary_onnx](./imgs/weights_summary_onnx.jpg) - -## Activations summary -These are the top 10 rows from activations summary table: - -![activations_summary_onnx](./imgs/activations_summary_onnx.jpg) - -In the Activations summary table, there are some nodes showing dispersed activation data range. Therefore, we calculate the `Min-Max data range` for activations data and sort the results in descending order. - -```python -activations_table["Min-Max data range"] = activations_table["Activation max"] - activations_table["Activation min"] -sorted_data = activations_table.sort_values(by="Min-Max data range", ascending=False) -display(sorted_data) -``` - -The results should look like below: - -![min-max](./imgs/min-max.jpg) - -According to the results displayed above, it is evident that the nodes of type `/layoutlmv3/encoder/layer.\d+/output/Add` and `/layoutlmv3/encoder/layer.\d+/output/dense/MatMul` have significantly higher values for `Min-Max data range` compared to other node types. This indicates that they may have caused a loss of accuracy. Therefore, we can try to fallback these nodes. - -Refer to [diagnosis.md](https://github.com/intel/neural-compressor/blob/master/docs/source/diagnosis.md) for more tips for diagnosis. - -```python -from neural_compressor.utils.constant import FP32 - -config = PostTrainingQuantConfig( - approach="static", - quant_format="QOperator", - op_name_dict={ - "/layoutlmv3/encoder/layer.\d+/output/dense/MatMul": FP32, - "/layoutlmv3/encoder/layer.\d+/output/Add": FP32, - }, -) -q_model = quantization.fit( - onnx_model, config, calib_dataloader=DataLoader(framework="onnxruntime", dataset=calib_dataset) -) -q_model.save(output_model) -``` - -Execute benchmark on the new quantized model again and the accuracy ratio is improved to <1%. -``` -fp32 f1 = 0.9049, int8 f1 = 0.8981, accuracy ratio = -0.7502% -``` diff --git a/neural_insights/docs/source/pytorch_nlp_cli_mode.md b/neural_insights/docs/source/pytorch_nlp_cli_mode.md deleted file mode 100644 index 449a66ce431..00000000000 --- a/neural_insights/docs/source/pytorch_nlp_cli_mode.md +++ /dev/null @@ -1,63 +0,0 @@ -# Step by step example how to dump weights data for PyTorch model with Neural Insights -1. [Introduction](#introduction) -2. [Preparation](#preparation) -3. [Running the quantization](#running-the-quantization) - -# Introduction -In this instruction weight data will be dumped using Neural Insights. PyTorch GPT-J-6B model will be used as an example. - -# Preparation -## Source -First you need to install Intel® Neural Compressor. -```shell -# Install Neural Compressor -git clone https://github.com/intel/neural-compressor.git -cd neural-compressor -pip install -r requirements.txt -python setup.py install - -# Install Neural Insights -pip install -r neural_insights/requirements.txt -python setup.py install neural_insights -``` - -## Requirements -```shell -cd /examples/pytorch/nlp/huggingface_models/language-modeling/quantization/ptq_static/fx -pip install -r requirements.txt -``` - -# Running the quantization -Before applying quantization, modify some code in `run_clm.py` file to enable Neural Insights: -1. Set the argument `diagnosis` to be `True` in `PostTrainingQuantConfig` so that Neural Insights will dump weights of quantizable Ops in this model. - -```python -conf = PostTrainingQuantConfig( - accuracy_criterion=accuracy_criterion, - diagnosis=True, -) -``` -2. Quantize the model with following command: -```shell -python run_clm.py \ - --model_name_or_path EleutherAI/gpt-j-6B \ - --dataset_name wikitext\ - --dataset_config_name wikitext-2-raw-v1 \ - --do_train \ - --do_eval \ - --tune \ - --output_dir saved_results -``` - -Results would be dumped into `nc_workspace` directory in similar structure: -``` -├── history.snapshot -├── input_model.pt -├── inspect_saved -│ ├── fp32 -│ │ └── inspect_result.pkl -│ └── quan -│ └── inspect_result.pkl -├── model_summary.txt -└── weights_table.csv -``` diff --git a/neural_insights/docs/source/tf_accuracy_debug.md b/neural_insights/docs/source/tf_accuracy_debug.md deleted file mode 100644 index 8422aa57f11..00000000000 --- a/neural_insights/docs/source/tf_accuracy_debug.md +++ /dev/null @@ -1,112 +0,0 @@ -# Step by step example how to debug accuracy with Neural Insights -1. [Introduction](#introduction) -2. [Preparation](#preparation) -3. [Running the quantization](#running-the-quantization) -4. [Analyzing the result of quantization](#-analyzing-the-result-of-quantization) -5. [Analyzing weight histograms](#-analyzing-weight-histograms) - -# Introduction -In this instruction accuracy issue will be debugged using Neural Insights. TensorFlow Inception_v3 model will be used as an example. It will be quantized and the results will be analyzed to find the cause of the accuracy loss. - -# Preparation -## Source -First you need to install Intel® Neural Compressor. -```shell -# Install Neural Compressor -git clone https://github.com/intel/neural-compressor.git -cd neural-compressor -pip install -r requirements.txt -python setup.py install - -# Install Neural Insights -pip install -r neural_insights/requirements.txt -python setup.py install neural_insights -``` - -## Requirements -```shell -cd examples/tensorflow/image_recognition/tensorflow_models/inception_v3/quantization/ptq -pip install -r requirements.txt -``` - -## Model -Download pre-trained PB model file. -```shell -wget https://storage.googleapis.com/intel-optimized-tensorflow/models/v1_6/inceptionv3_fp32_pretrained_model.pb -``` - -## Prepare the dataset -Download dataset from ImageNet and process the data to TensorFlow Record format. -```shell -cd examples/tensorflow/image_recognition/tensorflow_models/ -bash prepare_dataset.sh --output_dir=./inception_v3/quantization/ptq/data --raw_dir=/PATH/TO/img_raw/val/ --subset=validation -bash prepare_dataset.sh --output_dir=./inception_v3/quantization/ptq/data --raw_dir=/PATH/TO/img_raw/train/ --subset=train -``` - -# Running the quantization -Before applying quantization, modify some code to enable Neural Insights: -1. Set the argument `diagnosis` to be `True` in `PostTrainingQuantConfig` so that Neural Insights will dump weights and activations of quantizable Ops in this model. -2. Delete the `op_name_dict` argument because that’s the answer of our investigation. -```python -conf = PostTrainingQuantConfig(calibration_sampling_size=[50, 100], diagnosis=True) -``` -3. Quantize the model with following command: -```shell -bash run_tuning.sh --input_model=/PATH/TO/inceptionv3_fp32_pretrained_model.pb --output_model=./nc_inception_v3.pb --dataset_location=/path/to/ImageNet/ -``` - -The accuracy of this model will decrease a lot if all Ops are quantized to int8 as default strategy: - -![accuracy_decrease](./imgs/accuracy_decrease.png) - -# Analyzing the result of quantization -Then, if you run quantization, you will find the following table: - -![activations_summary](./imgs/activations_summary.png) - -The MSE (Mean Square Error) of the Ops’ activation are listed from high to low, there are also min-max values. -Usually, MSE can be referred as one of a typical indexes leading to accuracy loss. - -![ops_weights](./imgs/ops_weights.png) - -There are also relevant information about Ops’ weights. -Often Op with highest MSE will cause the highest accuracy loss, but it is not always the case. - -Experiment with disabling the quantization of some of the Ops with top 5 highest MSE in both tables is not satisfactory, as results show in this example: - -![tune_result](./imgs/tune_result.png) - -Then weights histograms can be analyzed to find the reason of the accuracy loss. - -# Analyzing weight histograms -## Open Neural Insights -```shell -neural_insights -``` - -Then you will get a webpage address with Neural insights GUI mode. You can find there histograms of weights and activations. -``` -Neural Insights Server started. -Open address [...] -``` - -The weights of Ops are usually distributed in one spike like the following graph: - -![weights_histograms](./imgs/weights_histograms.png) - -When you click on the Op in the Op list, you can get weight and activation histograms at the bottom of the page. -One of the weights histograms looks different than the examples above. - -![weights_histogram](./imgs/weights_histogram.png) - -As is shown in the chart, the distribution of weights often concentrates in a small range of min-max values, when the accuracy loss of an Op is tolerable. But in this Op the min-max values of weights are significantly high (range is bigger than [-20, 20]) because of some outliers. The values near zero point, which are the majority, will be mapped to a very small range in int8, leading to a huge accuracy loss. Besides, since the min-max values vary in different channels, the accuracy will decrease without using channel-wise quantization. - -Therefore, you can disable this Op: -```python -op_name_dict = {"v0/cg/conv0/conv2d/Conv2D": {"activation": {"dtype": ["fp32"]}}} -conf = PostTrainingQuantConfig(calibration_sampling_size=[50, 100], op_name_dict=op_name_dict) -``` - -After running quantization again, you can see that accuracy result has increased. The Op that caused accuracy loss was found. - -![tune_result2](./imgs/tune_result2.png) diff --git a/neural_insights/gui/README.md b/neural_insights/gui/README.md deleted file mode 100644 index 58beeaccd87..00000000000 --- a/neural_insights/gui/README.md +++ /dev/null @@ -1,70 +0,0 @@ -# Getting Started with Create React App - -This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). - -## Available Scripts - -In the project directory, you can run: - -### `npm start` - -Runs the app in the development mode.\ -Open [http://localhost:3000](http://localhost:3000) to view it in your browser. - -The page will reload when you make changes.\ -You may also see any lint errors in the console. - -### `npm test` - -Launches the test runner in the interactive watch mode.\ -See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. - -### `npm run build` - -Builds the app for production to the `build` folder.\ -It correctly bundles React in production mode and optimizes the build for the best performance. - -The build is minified and the filenames include the hashes.\ -Your app is ready to be deployed! - -See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. - -### `npm run eject` - -**Note: this is a one-way operation. Once you `eject`, you can't go back!** - -If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. - -Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own. - -You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it. - -## Learn More - -You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). - -To learn React, check out the [React documentation](https://reactjs.org/). - -### Code Splitting - -This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting) - -### Analyzing the Bundle Size - -This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size) - -### Making a Progressive Web App - -This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app) - -### Advanced Configuration - -This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration) - -### Deployment - -This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment) - -### `npm run build` fails to minify - -This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify) diff --git a/neural_insights/gui/generate-react-cli.json b/neural_insights/gui/generate-react-cli.json deleted file mode 100644 index 24ce1132711..00000000000 --- a/neural_insights/gui/generate-react-cli.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "usesTypeScript": false, - "usesCssModule": false, - "cssPreprocessor": "scss", - "testLibrary": "None", - "component": { - "default": { - "path": "src/components", - "withStyle": true, - "withTest": false, - "withStory": false, - "withLazy": false - } - } -} \ No newline at end of file diff --git a/neural_insights/gui/package-lock.json b/neural_insights/gui/package-lock.json deleted file mode 100644 index ec4b91b3cb3..00000000000 --- a/neural_insights/gui/package-lock.json +++ /dev/null @@ -1,22255 +0,0 @@ -{ - "name": "app", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "app", - "version": "0.1.0", - "dependencies": { - "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "^13.4.0", - "@testing-library/user-event": "^13.5.0", - "axios": "^1.6.0", - "bootstrap": "^5.3.0", - "css-select": "^5.1.0", - "cytoscape": "^3.25.0", - "cytoscape-elk": "^2.2.0", - "cytoscape-node-html-label": "^1.2.2", - "moment": "^2.29.4", - "plotly.js": "^2.24.3", - "react": "^18.2.0", - "react-bootstrap": "^2.8.0", - "react-cytoscapejs": "^2.0.0", - "react-dom": "^18.2.0", - "react-plotly.js": "^2.6.0", - "react-scripts": "^5.0.1", - "sass": "^1.63.6", - "socket.io": "^4.7.1", - "socket.io-client": "^4.7.1", - "web-vitals": "^2.1.4", - "web-worker": "^1.2.0" - }, - "devDependencies": { - "@svgr/webpack": "8.0.1" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@adobe/css-tools": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.2.tgz", - "integrity": "sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==" - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", - "dependencies": { - "@babel/highlight": "^7.22.13", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", - "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/eslint-parser": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz", - "integrity": "sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==", - "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", - "dependencies": { - "@babel/types": "^7.23.0", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", - "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz", - "integrity": "sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", - "dependencies": { - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", - "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", - "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", - "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.2.tgz", - "integrity": "sha512-eR0gJQc830fJVGz37oKLvt9W9uUIQSAovUl0e9sJ3YeO09dlcoBVYD3CLrjCj4qHdXmfiyTyFt8yeQYSN5fxLg==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.20", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/plugin-syntax-decorators": "^7.22.10" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz", - "integrity": "sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz", - "integrity": "sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", - "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", - "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", - "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", - "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz", - "integrity": "sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", - "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", - "dependencies": { - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-remap-async-to-generator": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", - "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", - "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", - "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", - "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", - "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.9", - "@babel/helper-split-export-declaration": "^7.22.6", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", - "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/template": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", - "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", - "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", - "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", - "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", - "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", - "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz", - "integrity": "sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-flow": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", - "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", - "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", - "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", - "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", - "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", - "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", - "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", - "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", - "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", - "dependencies": { - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", - "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", - "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", - "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", - "dependencies": { - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", - "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", - "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", - "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", - "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", - "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", - "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-replace-supers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", - "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", - "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", - "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", - "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", - "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.11", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", - "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz", - "integrity": "sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz", - "integrity": "sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", - "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", - "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz", - "integrity": "sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", - "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", - "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz", - "integrity": "sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==", - "dependencies": { - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", - "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", - "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", - "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", - "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", - "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz", - "integrity": "sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-typescript": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", - "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", - "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", - "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", - "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.2.tgz", - "integrity": "sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==", - "dependencies": { - "@babel/compat-data": "^7.23.2", - "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.22.5", - "@babel/plugin-syntax-import-attributes": "^7.22.5", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.22.5", - "@babel/plugin-transform-async-generator-functions": "^7.23.2", - "@babel/plugin-transform-async-to-generator": "^7.22.5", - "@babel/plugin-transform-block-scoped-functions": "^7.22.5", - "@babel/plugin-transform-block-scoping": "^7.23.0", - "@babel/plugin-transform-class-properties": "^7.22.5", - "@babel/plugin-transform-class-static-block": "^7.22.11", - "@babel/plugin-transform-classes": "^7.22.15", - "@babel/plugin-transform-computed-properties": "^7.22.5", - "@babel/plugin-transform-destructuring": "^7.23.0", - "@babel/plugin-transform-dotall-regex": "^7.22.5", - "@babel/plugin-transform-duplicate-keys": "^7.22.5", - "@babel/plugin-transform-dynamic-import": "^7.22.11", - "@babel/plugin-transform-exponentiation-operator": "^7.22.5", - "@babel/plugin-transform-export-namespace-from": "^7.22.11", - "@babel/plugin-transform-for-of": "^7.22.15", - "@babel/plugin-transform-function-name": "^7.22.5", - "@babel/plugin-transform-json-strings": "^7.22.11", - "@babel/plugin-transform-literals": "^7.22.5", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", - "@babel/plugin-transform-member-expression-literals": "^7.22.5", - "@babel/plugin-transform-modules-amd": "^7.23.0", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-modules-systemjs": "^7.23.0", - "@babel/plugin-transform-modules-umd": "^7.22.5", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.22.5", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", - "@babel/plugin-transform-numeric-separator": "^7.22.11", - "@babel/plugin-transform-object-rest-spread": "^7.22.15", - "@babel/plugin-transform-object-super": "^7.22.5", - "@babel/plugin-transform-optional-catch-binding": "^7.22.11", - "@babel/plugin-transform-optional-chaining": "^7.23.0", - "@babel/plugin-transform-parameters": "^7.22.15", - "@babel/plugin-transform-private-methods": "^7.22.5", - "@babel/plugin-transform-private-property-in-object": "^7.22.11", - "@babel/plugin-transform-property-literals": "^7.22.5", - "@babel/plugin-transform-regenerator": "^7.22.10", - "@babel/plugin-transform-reserved-words": "^7.22.5", - "@babel/plugin-transform-shorthand-properties": "^7.22.5", - "@babel/plugin-transform-spread": "^7.22.5", - "@babel/plugin-transform-sticky-regex": "^7.22.5", - "@babel/plugin-transform-template-literals": "^7.22.5", - "@babel/plugin-transform-typeof-symbol": "^7.22.5", - "@babel/plugin-transform-unicode-escapes": "^7.22.10", - "@babel/plugin-transform-unicode-property-regex": "^7.22.5", - "@babel/plugin-transform-unicode-regex": "^7.22.5", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "@babel/types": "^7.23.0", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", - "core-js-compat": "^3.31.0", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-react": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.15.tgz", - "integrity": "sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-transform-react-display-name": "^7.22.5", - "@babel/plugin-transform-react-jsx": "^7.22.15", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.2.tgz", - "integrity": "sha512-u4UJc1XsS1GhIGteM8rnGiIvf9rJpiVgMEeCnwlLA7WJPC+jcXWJAGxYmeqs5hOZD8BbAfnV5ezBOxQbb4OUxA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/helper-validator-option": "^7.22.15", - "@babel/plugin-syntax-jsx": "^7.22.5", - "@babel/plugin-transform-modules-commonjs": "^7.23.0", - "@babel/plugin-transform-typescript": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" - }, - "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" - }, - "node_modules/@choojs/findup": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", - "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", - "dependencies": { - "commander": "^2.15.1" - }, - "bin": { - "findup": "bin/findup.js" - } - }, - "node_modules/@csstools/normalize.css": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", - "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==" - }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", - "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", - "dependencies": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-color-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", - "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", - "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", - "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-unset-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/selector-specificity": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", - "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss-selector-parser": "^6.0.10" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", - "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", - "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/console/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/console/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/console/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/console/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/console/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/console/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/console/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", - "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/reporters": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^27.5.1", - "jest-config": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-resolve-dependencies": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "jest-watcher": "^27.5.1", - "micromatch": "^4.0.4", - "rimraf": "^3.0.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/core/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/core/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/core/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/core/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/core/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/core/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/core/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/core/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/environment": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", - "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", - "dependencies": { - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/environment/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/environment/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/environment/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/environment/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/environment/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/environment/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/environment/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/environment/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", - "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", - "dependencies": { - "@jest/types": "^27.5.1", - "@sinonjs/fake-timers": "^8.0.1", - "@types/node": "*", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/fake-timers/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/fake-timers/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/fake-timers/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/fake-timers/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/fake-timers/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/fake-timers/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/fake-timers/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/fake-timers/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/fake-timers/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/fake-timers/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/globals": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", - "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/types": "^27.5.1", - "expect": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/globals/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/globals/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/globals/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/globals/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/globals/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/globals/node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/globals/node_modules/expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/globals/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/globals/node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/globals/node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/globals/node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/globals/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/globals/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", - "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.2", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-haste-map": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "slash": "^3.0.0", - "source-map": "^0.6.0", - "string-length": "^4.0.1", - "terminal-link": "^2.0.0", - "v8-to-istanbul": "^8.1.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/reporters/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/reporters/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/reporters/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/reporters/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/reporters/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", - "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", - "dependencies": { - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9", - "source-map": "^0.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/source-map/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/test-result": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", - "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/test-result/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/test-result/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/test-result/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/test-result/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/test-result/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/test-result/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/test-result/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/test-result/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", - "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", - "dependencies": { - "@jest/test-result": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-runtime": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", - "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", - "dependencies": { - "@babel/core": "^7.1.0", - "@jest/types": "^27.5.1", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^1.4.0", - "fast-json-stable-stringify": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-util": "^27.5.1", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "source-map": "^0.6.1", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@jest/transform/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/transform/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/@jest/transform/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/transform/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/@jest/transform/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@jest/transform/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/types/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@jest/types/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/types/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" - }, - "node_modules/@mapbox/geojson-rewind": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", - "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", - "dependencies": { - "get-stream": "^6.0.1", - "minimist": "^1.2.6" - }, - "bin": { - "geojson-rewind": "geojson-rewind" - } - }, - "node_modules/@mapbox/geojson-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz", - "integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw==" - }, - "node_modules/@mapbox/jsonlint-lines-primitives": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", - "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@mapbox/mapbox-gl-supported": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz", - "integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==", - "peerDependencies": { - "mapbox-gl": ">=0.32.1 <2.0.0" - } - }, - "node_modules/@mapbox/point-geometry": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", - "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" - }, - "node_modules/@mapbox/tiny-sdf": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz", - "integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw==" - }, - "node_modules/@mapbox/unitbezier": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", - "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==" - }, - "node_modules/@mapbox/vector-tile": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz", - "integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==", - "dependencies": { - "@mapbox/point-geometry": "~0.1.0" - } - }, - "node_modules/@mapbox/whoots-js": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz", - "integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dependencies": { - "eslint-scope": "5.1.1" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@plotly/d3": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@plotly/d3/-/d3-3.8.1.tgz", - "integrity": "sha512-x49ThEu1FRA00kTso4Jdfyf2byaCPLBGmLjAYQz5OzaPyLUhHesX3/Nfv2OHEhynhdy2UB39DLXq6thYe2L2kg==" - }, - "node_modules/@plotly/d3-sankey": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@plotly/d3-sankey/-/d3-sankey-0.7.2.tgz", - "integrity": "sha512-2jdVos1N3mMp3QW0k2q1ph7Gd6j5PY1YihBrwpkFnKqO+cqtZq3AdEYUeSGXMeLsBDQYiqTVcihYfk8vr5tqhw==", - "dependencies": { - "d3-array": "1", - "d3-collection": "1", - "d3-shape": "^1.2.0" - } - }, - "node_modules/@plotly/d3-sankey-circular": { - "version": "0.33.1", - "resolved": "https://registry.npmjs.org/@plotly/d3-sankey-circular/-/d3-sankey-circular-0.33.1.tgz", - "integrity": "sha512-FgBV1HEvCr3DV7RHhDsPXyryknucxtfnLwPtCKKxdolKyTFYoLX/ibEfX39iFYIL7DYbVeRtP43dbFcrHNE+KQ==", - "dependencies": { - "d3-array": "^1.2.1", - "d3-collection": "^1.0.4", - "d3-shape": "^1.2.0", - "elementary-circuits-directed-graph": "^1.0.4" - } - }, - "node_modules/@plotly/point-cluster": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/@plotly/point-cluster/-/point-cluster-3.1.9.tgz", - "integrity": "sha512-MwaI6g9scKf68Orpr1pHZ597pYx9uP8UEFXLPbsCmuw3a84obwz6pnMXGc90VhgDNeNiLEdlmuK7CPo+5PIxXw==", - "dependencies": { - "array-bounds": "^1.0.1", - "binary-search-bounds": "^2.0.4", - "clamp": "^1.0.1", - "defined": "^1.0.0", - "dtype": "^2.0.0", - "flatten-vertex-data": "^1.0.2", - "is-obj": "^1.0.1", - "math-log2": "^1.0.1", - "parse-rect": "^1.2.0", - "pick-by-alias": "^1.2.0" - } - }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", - "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==", - "dependencies": { - "ansi-html-community": "^0.0.8", - "common-path-prefix": "^3.0.0", - "core-js-pure": "^3.23.3", - "error-stack-parser": "^2.0.6", - "find-up": "^5.0.0", - "html-entities": "^2.1.0", - "loader-utils": "^2.0.4", - "schema-utils": "^3.0.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">= 10.13" - }, - "peerDependencies": { - "@types/webpack": "4.x || 5.x", - "react-refresh": ">=0.10.0 <1.0.0", - "sockjs-client": "^1.4.0", - "type-fest": ">=0.17.0 <5.0.0", - "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x", - "webpack-hot-middleware": "2.x", - "webpack-plugin-serve": "0.x || 1.x" - }, - "peerDependenciesMeta": { - "@types/webpack": { - "optional": true - }, - "sockjs-client": { - "optional": true - }, - "type-fest": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - }, - "webpack-hot-middleware": { - "optional": true - }, - "webpack-plugin-serve": { - "optional": true - } - } - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/@react-aria/ssr": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.8.0.tgz", - "integrity": "sha512-Y54xs483rglN5DxbwfCPHxnkvZ+gZ0LbSYmR72LyWPGft8hN/lrl1VRS1EW2SMjnkEWlj+Km2mwvA3kEHDUA0A==", - "dependencies": { - "@swc/helpers": "^0.5.0" - }, - "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0" - } - }, - "node_modules/@restart/hooks": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.11.tgz", - "integrity": "sha512-Ft/ncTULZN6ldGHiF/k5qt72O8JyRMOeg0tApvCni8LkoiEahO+z3TNxfXIVGy890YtWVDvJAl662dVJSJXvMw==", - "dependencies": { - "dequal": "^2.0.3" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@restart/ui": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.6.6.tgz", - "integrity": "sha512-eC3puKuWE1SRYbojWHXnvCNHGgf3uzHCb6JOhnF4OXPibOIPEkR1sqDSkL643ydigxwh+ruCa1CmYHlzk7ikKA==", - "dependencies": { - "@babel/runtime": "^7.21.0", - "@popperjs/core": "^2.11.6", - "@react-aria/ssr": "^3.5.0", - "@restart/hooks": "^0.4.9", - "@types/warning": "^3.0.0", - "dequal": "^2.0.3", - "dom-helpers": "^5.2.0", - "uncontrollable": "^8.0.1", - "warning": "^4.0.3" - }, - "peerDependencies": { - "react": ">=16.14.0", - "react-dom": ">=16.14.0" - } - }, - "node_modules/@restart/ui/node_modules/uncontrollable": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.4.tgz", - "integrity": "sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==", - "peerDependencies": { - "react": ">=16.14.0" - } - }, - "node_modules/@rollup/plugin-babel": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", - "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", - "dependencies": { - "@babel/helper-module-imports": "^7.10.4", - "@rollup/pluginutils": "^3.1.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0" - }, - "peerDependenciesMeta": { - "@types/babel__core": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", - "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "@types/resolve": "1.17.1", - "builtin-modules": "^3.1.0", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@rollup/plugin-replace": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", - "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", - "dependencies": { - "@rollup/pluginutils": "^3.1.0", - "magic-string": "^0.25.7" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0" - } - }, - "node_modules/@rollup/pluginutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", - "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", - "dependencies": { - "@types/estree": "0.0.39", - "estree-walker": "^1.0.1", - "picomatch": "^2.2.2" - }, - "engines": { - "node": ">= 8.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0" - } - }, - "node_modules/@rollup/pluginutils/node_modules/@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.5.1.tgz", - "integrity": "sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==" - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" - }, - "node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" - }, - "node_modules/@surma/rollup-plugin-off-main-thread": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", - "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", - "dependencies": { - "ejs": "^3.1.6", - "json5": "^2.2.0", - "magic-string": "^0.25.0", - "string.prototype.matchall": "^4.0.6" - } - }, - "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", - "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", - "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", - "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", - "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", - "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.0.0.tgz", - "integrity": "sha512-UKrY3860AQICgH7g+6h2zkoxeVEPLYwX/uAjmqo4PIq2FIHppwhIqZstIyTz0ZtlwreKR41O3W3BzsBBiJV2Aw==", - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", - "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/babel-preset": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.0.0.tgz", - "integrity": "sha512-KLcjiZychInVrhs86OvcYPLTFu9L5XV2vj0XAaE1HwE3J3jLmIzRY8ttdeAg/iFyp8nhavJpafpDZTt+1LIpkQ==", - "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", - "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", - "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", - "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", - "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", - "@svgr/babel-plugin-transform-react-native-svg": "8.0.0", - "@svgr/babel-plugin-transform-svg-component": "8.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@svgr/core": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.0.0.tgz", - "integrity": "sha512-aJKtc+Pie/rFYsVH/unSkDaZGvEeylNv/s2cP+ta9/rYWxRVvoV/S4Qw65Kmrtah4CBK5PM6ISH9qUH7IJQCng==", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.0.0", - "camelcase": "^6.2.0", - "cosmiconfig": "^8.1.3", - "snake-case": "^3.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", - "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", - "dependencies": { - "@babel/types": "^7.21.3", - "entities": "^4.4.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@svgr/plugin-jsx": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.0.1.tgz", - "integrity": "sha512-bfCFb+4ZsM3UuKP2t7KmDwn6YV8qVn9HIQJmau6xeQb/iV65Rpi7NBNBWA2hcCd4GKoCqG8hpaaDk5FDR0eH+g==", - "dependencies": { - "@babel/core": "^7.21.3", - "@svgr/babel-preset": "8.0.0", - "@svgr/hast-util-to-babel-ast": "8.0.0", - "svg-parser": "^2.0.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/plugin-svgo": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.0.1.tgz", - "integrity": "sha512-29OJ1QmJgnohQHDAgAuY2h21xWD6TZiXji+hnx+W635RiXTAlHTbjrZDktfqzkN0bOeQEtNe+xgq73/XeWFfSg==", - "dependencies": { - "cosmiconfig": "^8.1.3", - "deepmerge": "^4.3.1", - "svgo": "^3.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - }, - "peerDependencies": { - "@svgr/core": "*" - } - }, - "node_modules/@svgr/webpack": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.0.1.tgz", - "integrity": "sha512-zSoeKcbCmfMXjA11uDuCJb+1LWNb3vy6Qw/VHj0Nfcl3UuqwuoZWknHsBIhCWvi4wU9vPui3aq054qjVyZqY4A==", - "dependencies": { - "@babel/core": "^7.21.3", - "@babel/plugin-transform-react-constant-elements": "^7.21.3", - "@babel/preset-env": "^7.20.2", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.21.0", - "@svgr/core": "8.0.0", - "@svgr/plugin-jsx": "8.0.1", - "@svgr/plugin-svgo": "8.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/gregberge" - } - }, - "node_modules/@swc/helpers": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.3.tgz", - "integrity": "sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@testing-library/dom": { - "version": "9.3.3", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz", - "integrity": "sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw==", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@testing-library/dom/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@testing-library/dom/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@testing-library/dom/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "peer": true - }, - "node_modules/@testing-library/dom/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/dom/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/jest-dom": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.17.0.tgz", - "integrity": "sha512-ynmNeT7asXyH3aSVv4vvX4Rb+0qjOhdNHnO/3vuZNqPmhDpV/+rCSGwQ7bLcmU2cJ4dvoheIO85LQj0IbJHEtg==", - "dependencies": { - "@adobe/css-tools": "^4.0.1", - "@babel/runtime": "^7.9.2", - "@types/testing-library__jest-dom": "^5.9.1", - "aria-query": "^5.0.0", - "chalk": "^3.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.5.6", - "lodash": "^4.17.15", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=8", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/chalk": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", - "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@testing-library/jest-dom/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/react": { - "version": "13.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", - "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "@testing-library/dom": "^8.5.0", - "@types/react-dom": "^18.0.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, - "node_modules/@testing-library/react/node_modules/@testing-library/dom": { - "version": "8.20.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", - "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@testing-library/react/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@testing-library/react/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@testing-library/react/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@testing-library/react/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/@testing-library/react/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/react/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@testing-library/user-event": { - "version": "13.5.0", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-13.5.0.tgz", - "integrity": "sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@turf/area": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/area/-/area-6.5.0.tgz", - "integrity": "sha512-xCZdiuojokLbQ+29qR6qoMD89hv+JAgWjLrwSEWL+3JV8IXKeNFl6XkEJz9HGkVpnXvQKJoRz4/liT+8ZZ5Jyg==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/bbox": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-6.5.0.tgz", - "integrity": "sha512-RBbLaao5hXTYyyg577iuMtDB8ehxMlUqHEJiMs8jT1GHkFhr6sYre3lmLsPeYEi/ZKj5TP5tt7fkzNdJ4GIVyw==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/centroid": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-6.5.0.tgz", - "integrity": "sha512-MwE1oq5E3isewPprEClbfU5pXljIK/GUOMbn22UM3IFPDJX0KeoyLNwghszkdmFp/qMGL/M13MMWvU+GNLXP/A==", - "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/helpers": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.5.0.tgz", - "integrity": "sha512-VbI1dV5bLFzohYYdgqwikdMVpe7pJ9X3E+dlr425wa2/sMJqYDhTO++ec38/pcPvPE6oD9WEEeU3Xu3gza+VPw==", - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@turf/meta": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.5.0.tgz", - "integrity": "sha512-RrArvtsV0vdsCBegoBtOalgdSOfkBrTJ07VkpiCnq/491W67hnMWmDu7e6Ztw0C3WldRYTXkg3SumfdzZxLBHA==", - "dependencies": { - "@turf/helpers": "^6.5.0" - }, - "funding": { - "url": "https://opencollective.com/turf" - } - }, - "node_modules/@types/aria-query": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.2.tgz", - "integrity": "sha512-PHKZuMN+K5qgKIWhBodXzQslTo5P+K/6LqeKXS6O/4liIDdZqaX5RXrCK++LAw+y/nptN48YmUMFiQHRSWYwtQ==" - }, - "node_modules/@types/babel__core": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", - "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.5", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz", - "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz", - "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", - "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.3.tgz", - "integrity": "sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/bonjour": { - "version": "3.5.11", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.11.tgz", - "integrity": "sha512-isGhjmBtLIxdHBDl2xGwUzEM8AOyOvWsADWq7rqirdi/ZQoHnLWErHvsThcEzTX8juDRiZtzp2Qkv5bgNh6mAg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.36", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", - "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz", - "integrity": "sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw==", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } - }, - "node_modules/@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" - }, - "node_modules/@types/cors": { - "version": "2.8.14", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.14.tgz", - "integrity": "sha512-RXHUvNWYICtbP6s18PnOCaqToK8y14DnLd75c6HfyKf228dxy7pHNOQkxPtvXKp/hINFMDjbYzsj63nnpPMSRQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/eslint": { - "version": "8.44.4", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.4.tgz", - "integrity": "sha512-lOzjyfY/D9QR4hY9oblZ76B90MYTB3RrQ4z2vBIJKj9ROCRqdkYl2gSUx1x1a4IWPjKJZLL4Aw1Zfay7eMnmnA==", - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.5", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.5.tgz", - "integrity": "sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA==", - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.2.tgz", - "integrity": "sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==" - }, - "node_modules/@types/express": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.19.tgz", - "integrity": "sha512-UtOfBtzN9OvpZPPbnnYunfjM7XCI4jyk1NvnFhTVz5krYAnW4o5DCoIekvms+8ApqhB4+9wSge1kBijdfTSmfg==", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.17.37", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz", - "integrity": "sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.7.tgz", - "integrity": "sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" - }, - "node_modules/@types/http-errors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.2.tgz", - "integrity": "sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.12", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.12.tgz", - "integrity": "sha512-kQtujO08dVtQ2wXAuSFfk9ASy3sug4+ogFR8Kd8UgP8PEuc1/G/8yjYRmp//PcDNJEUKOza/MrQu15bouEUCiw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ==", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "29.5.5", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.5.tgz", - "integrity": "sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==", - "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" - } - }, - "node_modules/@types/jest/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@types/jest/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@types/jest/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" - }, - "node_modules/@types/mime": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.3.tgz", - "integrity": "sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==" - }, - "node_modules/@types/node": { - "version": "20.8.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz", - "integrity": "sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==", - "dependencies": { - "undici-types": "~5.25.1" - } - }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" - }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" - }, - "node_modules/@types/prop-types": { - "version": "15.7.8", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.8.tgz", - "integrity": "sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==" - }, - "node_modules/@types/qs": { - "version": "6.9.8", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", - "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==" - }, - "node_modules/@types/range-parser": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.5.tgz", - "integrity": "sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==" - }, - "node_modules/@types/react": { - "version": "18.2.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.28.tgz", - "integrity": "sha512-ad4aa/RaaJS3hyGz0BGegdnSRXQBkd1CCYDCdNjBPg90UUpLgo+WlJqb9fMYUxtehmzF3PJaTWqRZjko6BRzBg==", - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.13", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.13.tgz", - "integrity": "sha512-eJIUv7rPP+EC45uNYp/ThhSpE16k22VJUknt5OLoH9tbXoi8bMhwLf5xRuWMywamNbWzhrSmU7IBJfPup1+3fw==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.7.tgz", - "integrity": "sha512-ICCyBl5mvyqYp8Qeq9B5G/fyBSRC0zx3XM3sCC6KkcMsNeAHqXBKkmat4GqdJET5jtYUpZXrxI5flve5qhi2Eg==", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/resolve": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", - "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" - }, - "node_modules/@types/scheduler": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.4.tgz", - "integrity": "sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==" - }, - "node_modules/@types/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==" - }, - "node_modules/@types/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.2.tgz", - "integrity": "sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.2.tgz", - "integrity": "sha512-asaEIoc6J+DbBKXtO7p2shWUpKacZOoMBEGBgPG91P8xhO53ohzHWGCs4ScZo5pQMf5ukQzVT9fhX1WzpHihig==", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.3.tgz", - "integrity": "sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==", - "dependencies": { - "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" - } - }, - "node_modules/@types/sockjs": { - "version": "0.3.34", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.34.tgz", - "integrity": "sha512-R+n7qBFnm/6jinlteC9DBL5dGiDGjWAvjo4viUanpnc/dG1y7uDoacXPIQ/PQEg1fI912SMHIa014ZjRpvDw4g==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" - }, - "node_modules/@types/testing-library__jest-dom": { - "version": "5.14.9", - "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.9.tgz", - "integrity": "sha512-FSYhIjFlfOpGSRyVoMBMuS3ws5ehFQODymf3vlI7U1K8c7PHwWwFY7VREfmsuzHSOnoKs/9/Y983ayOs7eRzqw==", - "dependencies": { - "@types/jest": "*" - } - }, - "node_modules/@types/trusted-types": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.4.tgz", - "integrity": "sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ==" - }, - "node_modules/@types/warning": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.1.tgz", - "integrity": "sha512-ywJmriP+nvjBKNBEMaNZgj2irZHoxcKeYcyMLbqhYKbDVn8yCIULy2Ol/tvIb37O3IBeZj3RU4tXqQTtGwoAMg==" - }, - "node_modules/@types/ws": { - "version": "8.5.7", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.7.tgz", - "integrity": "sha512-6UrLjiDUvn40CMrAubXuIVtj2PEfKDffJS7ychvnPU44j+KVeXmdHHTgqcM/dxLUTHxlXHiFM8Skmb8ozGdTnQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/yargs": { - "version": "17.0.28", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.28.tgz", - "integrity": "sha512-N3e3fkS86hNhtk6BEnc0rj3zcehaxx8QWhCROJkqpl5Zaoi7nAic3jH8q94jVD3zu5LGk+PUB6KAiDmimYOEQw==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", - "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", - "dependencies": { - "@typescript-eslint/utils": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" - }, - "node_modules/abab": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", - "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" - }, - "node_modules/abs-svg-path": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/abs-svg-path/-/abs-svg-path-0.1.1.tgz", - "integrity": "sha512-d8XPSGjfyzlXC3Xx891DJRyZfqk5JU0BJrDQcsWomFIV1/BIzPW5HDH5iDdWpqWaav0YVIEzT1RHTwWr0FFshA==" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-globals": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", - "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", - "dependencies": { - "acorn": "^7.1.1", - "acorn-walk": "^7.1.1" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/adjust-sourcemap-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", - "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", - "dependencies": { - "loader-utils": "^2.0.0", - "regex-parser": "^2.2.11" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/almost-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/almost-equal/-/almost-equal-1.1.0.tgz", - "integrity": "sha512-0V/PkoculFl5+0Lp47JoxUcO0xSxhIBvm+BxHdD/OgXNmdRpRHCFnKVuUoWyS9EzQP+otSGv0m9Lb4yVkQBn2A==" - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "engines": [ - "node >= 0.8.0" - ], - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dependencies": { - "deep-equal": "^2.0.5" - } - }, - "node_modules/array-bounds": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-bounds/-/array-bounds-1.0.1.tgz", - "integrity": "sha512-8wdW3ZGk6UjMPJx/glyEt0sLzzwAE1bhToPsO1W2pbpR2gULyxe3BjSiuJFheP50T/GgODVPz2fuMUmIywt8cQ==" - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" - }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-normalize": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/array-normalize/-/array-normalize-1.1.4.tgz", - "integrity": "sha512-fCp0wKFLjvSPmCn4F5Tiw4M3lpMZoHlCjfcs7nNzuj3vqQQ1/a8cgB9DXcpDSn18c+coLnaW7rqfcYCvKbyJXg==", - "dependencies": { - "array-bounds": "^1.0.0" - } - }, - "node_modules/array-range": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-range/-/array-range-1.0.1.tgz", - "integrity": "sha512-shdaI1zT3CVNL2hnx9c0JMc0ZogGaxDs5e85akgHWKYa0yVbIyp06Ind3dVkTj/uuFrzaHBOyqFzo+VV6aXgtA==" - }, - "node_modules/array-rearrange": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/array-rearrange/-/array-rearrange-2.2.2.tgz", - "integrity": "sha512-UfobP5N12Qm4Qu4fwLDIi2v6+wZsSf6snYSxAMeKhrh37YGnNWZPRmVEKc/2wfms53TLQnzfpG8wCx2Y/6NG1w==" - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" - }, - "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" - }, - "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dependencies": { - "has-symbols": "^1.0.3" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz", - "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/axios": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.0.tgz", - "integrity": "sha512-EZ1DYihju9pwVB+jg67ogm+Tmqc6JmhamRN6I4Zt8DfZu5lbcQGw3ozH9lFejSJgs/ibaef3A9PMXPLeefFGJg==", - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/babel-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", - "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", - "dependencies": { - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-jest/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/babel-jest/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/babel-jest/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/babel-jest/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/babel-jest/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-jest/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", - "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" - }, - "engines": { - "node": ">= 8.9" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" - } - }, - "node_modules/babel-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", - "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.0.0", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/babel-plugin-named-asset-import": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", - "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", - "peerDependencies": { - "@babel/core": "^7.1.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz", - "integrity": "sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==", - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.3", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.5.tgz", - "integrity": "sha512-Q6CdATeAvbScWPNLB8lzSO7fgUVBkQt6zLgNlfyeCr/EQaEQR+bWiBYYPYAFyE528BMjRhL+1QBMOI4jc/c5TA==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3", - "core-js-compat": "^3.32.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz", - "integrity": "sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==", - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.3" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-transform-react-remove-prop-types": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", - "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", - "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", - "dependencies": { - "babel-plugin-jest-hoist": "^27.5.1", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-react-app": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", - "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/plugin-proposal-class-properties": "^7.16.0", - "@babel/plugin-proposal-decorators": "^7.16.4", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", - "@babel/plugin-proposal-numeric-separator": "^7.16.0", - "@babel/plugin-proposal-optional-chaining": "^7.16.0", - "@babel/plugin-proposal-private-methods": "^7.16.0", - "@babel/plugin-transform-flow-strip-types": "^7.16.0", - "@babel/plugin-transform-react-display-name": "^7.16.0", - "@babel/plugin-transform-runtime": "^7.16.4", - "@babel/preset-env": "^7.16.4", - "@babel/preset-react": "^7.16.0", - "@babel/preset-typescript": "^7.16.0", - "@babel/runtime": "^7.16.3", - "babel-plugin-macros": "^3.1.0", - "babel-plugin-transform-react-remove-prop-types": "^0.4.24" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" - }, - "node_modules/bfj": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.1.0.tgz", - "integrity": "sha512-I6MMLkn+anzNdCUp9hMRyui1HaNEUCco50lxbvNS4+EyXg8lN3nJ48PjPWtbH8UVS9CuMoaKE9U2V3l29DaRQw==", - "dependencies": { - "bluebird": "^3.7.2", - "check-types": "^11.2.3", - "hoopy": "^0.1.4", - "jsonpath": "^1.1.1", - "tryer": "^1.0.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/binary-search-bounds": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/binary-search-bounds/-/binary-search-bounds-2.0.5.tgz", - "integrity": "sha512-H0ea4Fd3lS1+sTEB2TgcLoK21lLhwEJzlQv3IN47pJS976Gx4zoWe0ak3q+uYh60ppQxg9F16Ri4tS1sfD4+jA==" - }, - "node_modules/bit-twiddle": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bit-twiddle/-/bit-twiddle-1.0.2.tgz", - "integrity": "sha512-B9UhK0DKFZhoTFcfvAzhqsjStvGJp9vYWf3+6SNTtdSQnvIgfkHbgHrg/e4+TH71N2GDu8tpmCVoyfrL1d7ntA==" - }, - "node_modules/bitmap-sdf": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/bitmap-sdf/-/bitmap-sdf-1.0.4.tgz", - "integrity": "sha512-1G3U4n5JE6RAiALMxu0p1XmeZkTeCwGKykzsLTCqVzfSDaN6S7fKnkIkfejogz+iwqBWc0UYAIKnKHNN7pSfDg==" - }, - "node_modules/bl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", - "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", - "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "node_modules/bootstrap": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.2.tgz", - "integrity": "sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "peerDependencies": { - "@popperjs/core": "^2.11.8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-process-hrtime": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", - "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" - }, - "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001549", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001549.tgz", - "integrity": "sha512-qRp48dPYSCYaP+KurZLhDYdVE+yEyht/3NlmcJgVQ2VMGt6JL36ndQ/7rgspdZsJuxDPFIo/OzBT2+GmIJ53BA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/canvas-fit": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/canvas-fit/-/canvas-fit-1.5.0.tgz", - "integrity": "sha512-onIcjRpz69/Hx5bB5HGbYKUF2uC6QT6Gp+pfpGm3A7mPfcluSLV5v4Zu+oflDUwLdUw0rLIBhUbi0v8hM4FJQQ==", - "dependencies": { - "element-size": "^1.1.1" - } - }, - "node_modules/case-sensitive-paths-webpack-plugin": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", - "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/check-types": { - "version": "11.2.3", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.3.tgz", - "integrity": "sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==" - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", - "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" - }, - "node_modules/clamp": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/clamp/-/clamp-1.0.1.tgz", - "integrity": "sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA==" - }, - "node_modules/classnames": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" - }, - "node_modules/clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" - }, - "node_modules/color-alpha": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/color-alpha/-/color-alpha-1.0.4.tgz", - "integrity": "sha512-lr8/t5NPozTSqli+duAN+x+no/2WaKTeWvxhHGN+aXT6AJ8vPlzLa7UriyjWak0pSC2jHol9JgjBYnnHsGha9A==", - "dependencies": { - "color-parse": "^1.3.8" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-id": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/color-id/-/color-id-1.1.0.tgz", - "integrity": "sha512-2iRtAn6dC/6/G7bBIo0uupVrIne1NsQJvJxZOBCzQOfk7jRq97feaDZ3RdzuHakRXXnHGNwglto3pqtRx1sX0g==", - "dependencies": { - "clamp": "^1.0.1" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/color-normalize": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/color-normalize/-/color-normalize-1.5.0.tgz", - "integrity": "sha512-rUT/HDXMr6RFffrR53oX3HGWkDOP9goSAQGBkUaAYKjOE2JxozccdGyufageWDlInRAjm/jYPrf/Y38oa+7obw==", - "dependencies": { - "clamp": "^1.0.1", - "color-rgba": "^2.1.1", - "dtype": "^2.0.0" - } - }, - "node_modules/color-parse": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/color-parse/-/color-parse-1.3.8.tgz", - "integrity": "sha512-1Y79qFv0n1xair3lNMTNeoFvmc3nirMVBij24zbs1f13+7fPpQClMg5b4AuKXLt3szj7BRlHMCXHplkce6XlmA==", - "dependencies": { - "color-name": "^1.0.0", - "defined": "^1.0.0", - "is-plain-obj": "^1.1.0" - } - }, - "node_modules/color-rgba": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/color-rgba/-/color-rgba-2.1.1.tgz", - "integrity": "sha512-VaX97wsqrMwLSOR6H7rU1Doa2zyVdmShabKrPEIFywLlHoibgD3QW9Dw6fSqM4+H/LfjprDNAUUW31qEQcGzNw==", - "dependencies": { - "clamp": "^1.0.1", - "color-parse": "^1.3.8", - "color-space": "^1.14.6" - } - }, - "node_modules/color-space": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/color-space/-/color-space-1.16.0.tgz", - "integrity": "sha512-A6WMiFzunQ8KEPFmj02OnnoUnqhmSaHaZ/0LVFcPTdlvm8+3aMJ5x1HRHy3bDHPkovkf4sS0f4wsVvwk71fKkg==", - "dependencies": { - "hsluv": "^0.0.3", - "mumath": "^3.3.4" - } - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/core-js": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.0.tgz", - "integrity": "sha512-HoZr92+ZjFEKar5HS6MC776gYslNOKHt75mEBKWKnPeFDpZ6nH5OeF3S6HFT1mUAUZKrzkez05VboaX8myjSuw==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-compat": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.33.0.tgz", - "integrity": "sha512-0w4LcLXsVEuNkIqwjjf9rjCoPhK8uqA4tMRh4Ge26vfLtUutshn+aRJU21I9LCJlh2QQHfisNToLjw1XEJLTWw==", - "dependencies": { - "browserslist": "^4.22.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.0.tgz", - "integrity": "sha512-FKSIDtJnds/YFIEaZ4HszRX7hkxGpNKM7FC9aJ9WLJbSd3lD4vOltFuVIBLR8asSx9frkTSqL0dw90SKQxgKrg==", - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cosmiconfig": { - "version": "8.3.6", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", - "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", - "dependencies": { - "import-fresh": "^3.3.0", - "js-yaml": "^4.1.0", - "parse-json": "^5.2.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/country-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/country-regex/-/country-regex-1.1.0.tgz", - "integrity": "sha512-iSPlClZP8vX7MC3/u6s3lrDuoQyhQukh5LyABJ3hvfzbQ3Yyayd4fp04zjLnfi267B/B2FkumcWWgrbban7sSA==" - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-blank-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-declaration-sorter": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", - "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-font": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-font/-/css-font-1.2.0.tgz", - "integrity": "sha512-V4U4Wps4dPDACJ4WpgofJ2RT5Yqwe1lEH6wlOOaIxMi0gTjdIijsc5FmxQlZ7ZZyKQkkutqqvULOp07l9c7ssA==", - "dependencies": { - "css-font-size-keywords": "^1.0.0", - "css-font-stretch-keywords": "^1.0.1", - "css-font-style-keywords": "^1.0.1", - "css-font-weight-keywords": "^1.0.0", - "css-global-keywords": "^1.0.1", - "css-system-font-keywords": "^1.0.0", - "pick-by-alias": "^1.2.0", - "string-split-by": "^1.0.0", - "unquote": "^1.1.0" - } - }, - "node_modules/css-font-size-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz", - "integrity": "sha512-Q+svMDbMlelgCfH/RVDKtTDaf5021O486ZThQPIpahnIjUkMUslC+WuOQSWTgGSrNCH08Y7tYNEmmy0hkfMI8Q==" - }, - "node_modules/css-font-stretch-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz", - "integrity": "sha512-KmugPO2BNqoyp9zmBIUGwt58UQSfyk1X5DbOlkb2pckDXFSAfjsD5wenb88fNrD6fvS+vu90a/tsPpb9vb0SLg==" - }, - "node_modules/css-font-style-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz", - "integrity": "sha512-0Fn0aTpcDktnR1RzaBYorIxQily85M2KXRpzmxQPgh8pxUN9Fcn00I8u9I3grNr1QXVgCl9T5Imx0ZwKU973Vg==" - }, - "node_modules/css-font-weight-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz", - "integrity": "sha512-5So8/NH+oDD+EzsnF4iaG4ZFHQ3vaViePkL1ZbZ5iC/KrsCY+WHq/lvOgrtmuOQ9pBBZ1ADGpaf+A4lj1Z9eYA==" - }, - "node_modules/css-global-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/css-global-keywords/-/css-global-keywords-1.0.1.tgz", - "integrity": "sha512-X1xgQhkZ9n94WDwntqst5D/FKkmiU0GlJSFZSV3kLvyJ1WC5VeyoXDOuleUD+SIuH9C7W05is++0Woh0CGfKjQ==" - }, - "node_modules/css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-has-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-loader": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", - "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.21", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/css-loader/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-loader/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-loader/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/css-minimizer-webpack-plugin": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", - "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", - "dependencies": { - "cssnano": "^5.0.6", - "jest-worker": "^27.0.2", - "postcss": "^8.3.5", - "schema-utils": "^4.0.0", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@parcel/css": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - } - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "bin": { - "css-prefers-color-scheme": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-system-font-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz", - "integrity": "sha512-1umTtVd/fXS25ftfjB71eASCrYhilmEsvDEI6wG/QplnmlfmVM5HkZ/ZX46DT5K3eblFPgLUHt5BRCb0YXkSFA==" - }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" - }, - "node_modules/csscolorparser": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz", - "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==" - }, - "node_modules/cssdb": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.8.0.tgz", - "integrity": "sha512-SkeezZOQr5AHt9MgJgSFNyiuJwg1p8AwoVln6JwaQJsyxduRW9QJ+HP/gAQzbsz8SIqINtYvpJKjxTRI67zxLg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - } - ] - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", - "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", - "dependencies": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-preset-default": { - "version": "5.2.14", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", - "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", - "dependencies": { - "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.1", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.4", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.2", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "dependencies": { - "css-tree": "~2.2.0" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" - }, - "node_modules/cssom": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", - "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" - }, - "node_modules/cssstyle": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", - "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", - "dependencies": { - "cssom": "~0.3.6" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cssstyle/node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" - }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" - }, - "node_modules/cytoscape": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.26.0.tgz", - "integrity": "sha512-IV+crL+KBcrCnVVUCZW+zRRRFUZQcrtdOPXki+o4CFUWLdAEYvuZLcBSJC9EBK++suamERKzeY7roq2hdovV3w==", - "dependencies": { - "heap": "^0.2.6", - "lodash": "^4.17.21" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/cytoscape-elk": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cytoscape-elk/-/cytoscape-elk-2.2.0.tgz", - "integrity": "sha512-EqXBVRcWeah/oBOifAmne0ImmIKntBVEQh2XCJXY++BgCufehZglRclrJ1DWm5Qm/NDBO/wEDijjgd50xJXw0A==", - "dependencies": { - "elkjs": "^0.8.1" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-node-html-label": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cytoscape-node-html-label/-/cytoscape-node-html-label-1.2.2.tgz", - "integrity": "sha512-oUVwrlsIlaJJ8QrQFSMdv3uXVXPg6tMH/Tfofr8JuZIovqI4fPqBi6sQgCMcVpS6k9Td0TTjowBsNRw32CESWg==", - "peerDependencies": { - "@types/cytoscape": "^3.1.0", - "cytoscape": "^3.0.0" - }, - "peerDependenciesMeta": { - "@types/cytoscape": { - "optional": true - } - } - }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "node_modules/d3-array": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz", - "integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==" - }, - "node_modules/d3-collection": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz", - "integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==" - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.6.tgz", - "integrity": "sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA==" - }, - "node_modules/d3-force": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.2.1.tgz", - "integrity": "sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg==", - "dependencies": { - "d3-collection": "1", - "d3-dispatch": "1", - "d3-quadtree": "1", - "d3-timer": "1" - } - }, - "node_modules/d3-format": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.5.tgz", - "integrity": "sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ==" - }, - "node_modules/d3-geo": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.12.1.tgz", - "integrity": "sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg==", - "dependencies": { - "d3-array": "1" - } - }, - "node_modules/d3-geo-projection": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-2.9.0.tgz", - "integrity": "sha512-ZULvK/zBn87of5rWAfFMc9mJOipeSo57O+BBitsKIXmU4rTVAnX1kSsJkE0R+TxY8pGNoM1nbyRRE7GYHhdOEQ==", - "dependencies": { - "commander": "2", - "d3-array": "1", - "d3-geo": "^1.12.0", - "resolve": "^1.1.10" - }, - "bin": { - "geo2svg": "bin/geo2svg", - "geograticule": "bin/geograticule", - "geoproject": "bin/geoproject", - "geoquantize": "bin/geoquantize", - "geostitch": "bin/geostitch" - } - }, - "node_modules/d3-hierarchy": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz", - "integrity": "sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ==" - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" - }, - "node_modules/d3-quadtree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.7.tgz", - "integrity": "sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA==" - }, - "node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/d3-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz", - "integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==" - }, - "node_modules/d3-time-format": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.3.0.tgz", - "integrity": "sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ==", - "dependencies": { - "d3-time": "1" - } - }, - "node_modules/d3-timer": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.10.tgz", - "integrity": "sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw==" - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" - }, - "node_modules/data-urls": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", - "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", - "dependencies": { - "abab": "^2.0.3", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", - "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" - }, - "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" - }, - "node_modules/deep-equal": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", - "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.1", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.0", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-gateway": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", - "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "engines": { - "node": ">=8" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/defined": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", - "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-kerning": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-kerning/-/detect-kerning-2.1.2.tgz", - "integrity": "sha512-I3JIbrnKPAntNLl1I6TpSQQdQ4AutYzv/sKMFKbepawV/hlH0GmYKhUoOEMd4xqaUHT+Bm0f4127lh5qs1m1tw==" - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" - }, - "node_modules/detect-port-alt": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", - "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", - "dependencies": { - "address": "^1.0.1", - "debug": "^2.6.0" - }, - "bin": { - "detect": "bin/detect-port", - "detect-port": "bin/detect-port" - }, - "engines": { - "node": ">= 4.2.1" - } - }, - "node_modules/detect-port-alt/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/detect-port-alt/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" - }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" - }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domexception": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", - "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", - "dependencies": { - "webidl-conversions": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/domexception/node_modules/webidl-conversions": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", - "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", - "engines": { - "node": ">=10" - } - }, - "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" - }, - "node_modules/draw-svg-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/draw-svg-path/-/draw-svg-path-1.0.0.tgz", - "integrity": "sha512-P8j3IHxcgRMcY6sDzr0QvJDLzBnJJqpTG33UZ2Pvp8rw0apCHhJCWqYprqrXjrgHnJ6tuhP1iTJSAodPDHxwkg==", - "dependencies": { - "abs-svg-path": "~0.1.1", - "normalize-svg-path": "~0.1.0" - } - }, - "node_modules/dtype": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dtype/-/dtype-2.0.0.tgz", - "integrity": "sha512-s2YVcLKdFGS0hpFqJaTwscsyt0E8nNFdmo73Ocd81xNPj4URI4rj6D60A+vFMIw7BXWlb4yRkEwfBqcZzPGiZg==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/dup": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dup/-/dup-1.0.0.tgz", - "integrity": "sha512-Bz5jxMMC0wgp23Zm15ip1x8IhYRqJvF3nFC0UInJUDkN1z4uNPk9jTnfCUJXbOGiQ1JbXLQsiV41Fb+HXcj5BA==" - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/earcut": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", - "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.556", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.556.tgz", - "integrity": "sha512-6RPN0hHfzDU8D56E72YkDvnLw5Cj2NMXZGg3UkgyoHxjVhG99KZpsKgBWMmTy0Ei89xwan+rbRsVB9yzATmYzQ==" - }, - "node_modules/element-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/element-size/-/element-size-1.1.1.tgz", - "integrity": "sha512-eaN+GMOq/Q+BIWy0ybsgpcYImjGIdNLyjLFJU4XsLHXYQao5jCNb36GyN6C2qwmDDYSfIBmKpPpr4VnBdLCsPQ==" - }, - "node_modules/elementary-circuits-directed-graph": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/elementary-circuits-directed-graph/-/elementary-circuits-directed-graph-1.3.1.tgz", - "integrity": "sha512-ZEiB5qkn2adYmpXGnJKkxT8uJHlW/mxmBpmeqawEHzPxh9HkLD4/1mFYX5l0On+f6rcPIt8/EWlRU2Vo3fX6dQ==", - "dependencies": { - "strongly-connected-components": "^1.0.1" - } - }, - "node_modules/elkjs": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz", - "integrity": "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==" - }, - "node_modules/emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/engine.io": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.3.tgz", - "integrity": "sha512-IML/R4eG/pUS5w7OfcDE0jKrljWS9nwnEfsxWCIJF5eO6AHo6+Hlv+lQbdlAYsiJPHzUthLm1RUjnBzWOs45cw==", - "dependencies": { - "@types/cookie": "^0.4.1", - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.11.0" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/engine.io-client": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.2.tgz", - "integrity": "sha512-CQZqbrpEYnrpGqC07a9dJDz4gePZUgTPMU3NKJPSeQOyw27Tst4Pl3FemKoFGAlHzgZmKjoRmiJvbWfhCXUlIg==", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.11.0", - "xmlhttprequest-ssl": "~2.0.0" - } - }, - "node_modules/engine.io-client/node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", - "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io/node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "node_modules/es-abstract": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", - "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.1", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", - "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" - } - }, - "node_modules/es-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", - "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==" - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es5-ext": { - "version": "0.10.63", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.63.tgz", - "integrity": "sha512-hUCZd2Byj/mNKjfP9jXrdVZ62B8KuA/VoK7X8nUh5qT+AxDmcbvZz041oDVZdbIN1qW6XY9VDNwzkvKnZvK2TQ==", - "hasInstallScript": true, - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "esniff": "^2.0.1", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-react-app": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", - "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", - "dependencies": { - "@babel/core": "^7.16.0", - "@babel/eslint-parser": "^7.16.3", - "@rushstack/eslint-patch": "^1.1.0", - "@typescript-eslint/eslint-plugin": "^5.5.0", - "@typescript-eslint/parser": "^5.5.0", - "babel-preset-react-app": "^10.0.1", - "confusing-browser-globals": "^1.0.11", - "eslint-plugin-flowtype": "^8.0.3", - "eslint-plugin-import": "^2.25.3", - "eslint-plugin-jest": "^25.3.0", - "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-react": "^7.27.1", - "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-testing-library": "^5.0.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-flowtype": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", - "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", - "dependencies": { - "lodash": "^4.17.21", - "string-natural-compare": "^3.0.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@babel/plugin-syntax-flow": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.9", - "eslint": "^8.1.0" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.28.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", - "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.findlastindex": "^1.2.2", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.8.0", - "has": "^1.0.3", - "is-core-module": "^2.13.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.6", - "object.groupby": "^1.0.0", - "object.values": "^1.1.6", - "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-jest": { - "version": "25.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", - "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", - "dependencies": { - "@typescript-eslint/experimental-utils": "^5.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", - "dependencies": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-testing-library": { - "version": "5.11.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz", - "integrity": "sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==", - "dependencies": { - "@typescript-eslint/utils": "^5.58.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0", - "npm": ">=6" - }, - "peerDependencies": { - "eslint": "^7.5.0 || ^8.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-webpack-plugin": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", - "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", - "dependencies": { - "@types/eslint": "^7.29.0 || ^8.4.1", - "jest-worker": "^28.0.2", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", - "webpack": "^5.0.0" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", - "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/eslint-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/esniff": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", - "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "event-emitter": "^0.3.5", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esniff/node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree/node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", - "dependencies": { - "@jest/expect-utils": "^29.7.0", - "jest-get-type": "^29.6.3", - "jest-matcher-utils": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/express/node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "dependencies": { - "type": "^2.7.2" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" - }, - "node_modules/falafel": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz", - "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==", - "dependencies": { - "acorn": "^7.1.1", - "isarray": "^2.0.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-isnumeric": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/fast-isnumeric/-/fast-isnumeric-1.1.4.tgz", - "integrity": "sha512-1mM8qOr2LYz8zGaUdmiqRDiuue00Dxjgcb1NQR7TnhLVh6sQyngP9xvLo7Sl7LZpP/sk5eb+bcyWXw530NTBZw==", - "dependencies": { - "is-string-blank": "^1.0.1" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-loader": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", - "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", - "dependencies": { - "loader-utils": "^2.0.0", - "schema-utils": "^3.0.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/filesize": { - "version": "8.0.7", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", - "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==" - }, - "node_modules/flatten-vertex-data": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz", - "integrity": "sha512-BvCBFK2NZqerFTdMDgqfHBwxYWnxeCkwONsw6PvBMcUXqo8U/KDWwmXhqx1x2kLIg7DqIsJfOaJFOmlua3Lxuw==", - "dependencies": { - "dtype": "^2.0.0" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/font-atlas": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/font-atlas/-/font-atlas-2.1.0.tgz", - "integrity": "sha512-kP3AmvX+HJpW4w3d+PiPR2X6E1yvsBXt2yhuCw+yReO9F1WYhvZwx3c95DGZGwg9xYzDGrgJYa885xmVA+28Cg==", - "dependencies": { - "css-font": "^1.0.0" - } - }, - "node_modules/font-measure": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/font-measure/-/font-measure-1.2.2.tgz", - "integrity": "sha512-mRLEpdrWzKe9hbfaF3Qpr06TAjquuBVP5cHy4b3hyeNdjc9i0PO6HniGsX5vjL5OWv7+Bd++NiooNpT/s8BvIA==", - "dependencies": { - "css-font": "^1.2.0" - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", - "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", - "dependencies": { - "@babel/code-frame": "^7.8.3", - "@types/json-schema": "^7.0.5", - "chalk": "^4.1.0", - "chokidar": "^3.4.2", - "cosmiconfig": "^6.0.0", - "deepmerge": "^4.2.2", - "fs-extra": "^9.0.0", - "glob": "^7.1.6", - "memfs": "^3.1.2", - "minimatch": "^3.0.4", - "schema-utils": "2.7.0", - "semver": "^7.3.2", - "tapable": "^1.0.0" - }, - "engines": { - "node": ">=10", - "yarn": ">=1.0.0" - }, - "peerDependencies": { - "eslint": ">= 6", - "typescript": ">= 2.7", - "vue-template-compiler": "*", - "webpack": ">= 4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - }, - "vue-template-compiler": { - "optional": true - } - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", - "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.7.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", - "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", - "dependencies": { - "@types/json-schema": "^7.0.4", - "ajv": "^6.12.2", - "ajv-keywords": "^3.4.1" - }, - "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/fork-ts-checker-webpack-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/geojson-vt": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz", - "integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg==" - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-canvas-context": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-canvas-context/-/get-canvas-context-1.0.2.tgz", - "integrity": "sha512-LnpfLf/TNzr9zVOGiIY6aKCz8EKuXmlYNV7CM2pUjBa/B+c2I15tS7KLySep75+FuerJdmArvJLcsAXWEy2H0A==" - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-own-enumerable-property-symbols": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", - "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gl-mat4": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gl-mat4/-/gl-mat4-1.2.0.tgz", - "integrity": "sha512-sT5C0pwB1/e9G9AvAoLsoaJtbMGjfd/jfxo8jMCKqYYEnjZuFvqV5rehqar0538EmssjdDeiEWnKyBSTw7quoA==" - }, - "node_modules/gl-matrix": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz", - "integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==" - }, - "node_modules/gl-text": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/gl-text/-/gl-text-1.3.1.tgz", - "integrity": "sha512-/f5gcEMiZd+UTBJLTl3D+CkCB/0UFGTx3nflH8ZmyWcLkZhsZ1+Xx5YYkw2rgWAzgPeE35xCqBuHSoMKQVsR+w==", - "dependencies": { - "bit-twiddle": "^1.0.2", - "color-normalize": "^1.5.0", - "css-font": "^1.2.0", - "detect-kerning": "^2.1.2", - "es6-weak-map": "^2.0.3", - "flatten-vertex-data": "^1.0.2", - "font-atlas": "^2.1.0", - "font-measure": "^1.2.2", - "gl-util": "^3.1.2", - "is-plain-obj": "^1.1.0", - "object-assign": "^4.1.1", - "parse-rect": "^1.2.0", - "parse-unit": "^1.0.1", - "pick-by-alias": "^1.2.0", - "regl": "^2.0.0", - "to-px": "^1.0.1", - "typedarray-pool": "^1.1.0" - } - }, - "node_modules/gl-util": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/gl-util/-/gl-util-3.1.3.tgz", - "integrity": "sha512-dvRTggw5MSkJnCbh74jZzSoTOGnVYK+Bt+Ckqm39CVcl6+zSsxqWk4lr5NKhkqXHL6qvZAU9h17ZF8mIskY9mA==", - "dependencies": { - "is-browser": "^2.0.1", - "is-firefox": "^1.0.3", - "is-plain-obj": "^1.1.0", - "number-is-integer": "^1.0.1", - "object-assign": "^4.1.0", - "pick-by-alias": "^1.2.0", - "weak-map": "^1.0.5" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glsl-inject-defines": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/glsl-inject-defines/-/glsl-inject-defines-1.0.3.tgz", - "integrity": "sha512-W49jIhuDtF6w+7wCMcClk27a2hq8znvHtlGnrYkSWEr8tHe9eA2dcnohlcAmxLYBSpSSdzOkRdyPTrx9fw49+A==", - "dependencies": { - "glsl-token-inject-block": "^1.0.0", - "glsl-token-string": "^1.0.1", - "glsl-tokenizer": "^2.0.2" - } - }, - "node_modules/glsl-resolve": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/glsl-resolve/-/glsl-resolve-0.0.1.tgz", - "integrity": "sha512-xxFNsfnhZTK9NBhzJjSBGX6IOqYpvBHxxmo+4vapiljyGNCY0Bekzn0firQkQrazK59c1hYxMDxYS8MDlhw4gA==", - "dependencies": { - "resolve": "^0.6.1", - "xtend": "^2.1.2" - } - }, - "node_modules/glsl-resolve/node_modules/resolve": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", - "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==" - }, - "node_modules/glsl-resolve/node_modules/xtend": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", - "integrity": "sha512-SLt5uylT+4aoXxXuwtQp5ZnMMzhDb1Xkg4pEqc00WUJCQifPfV9Ub1VrNhp9kXkrjZD2I2Hl8WnjP37jzZLPZw==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/glsl-token-assignments": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/glsl-token-assignments/-/glsl-token-assignments-2.0.2.tgz", - "integrity": "sha512-OwXrxixCyHzzA0U2g4btSNAyB2Dx8XrztY5aVUCjRSh4/D0WoJn8Qdps7Xub3sz6zE73W3szLrmWtQ7QMpeHEQ==" - }, - "node_modules/glsl-token-defines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glsl-token-defines/-/glsl-token-defines-1.0.0.tgz", - "integrity": "sha512-Vb5QMVeLjmOwvvOJuPNg3vnRlffscq2/qvIuTpMzuO/7s5kT+63iL6Dfo2FYLWbzuiycWpbC0/KV0biqFwHxaQ==", - "dependencies": { - "glsl-tokenizer": "^2.0.0" - } - }, - "node_modules/glsl-token-depth": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/glsl-token-depth/-/glsl-token-depth-1.1.2.tgz", - "integrity": "sha512-eQnIBLc7vFf8axF9aoi/xW37LSWd2hCQr/3sZui8aBJnksq9C7zMeUYHVJWMhFzXrBU7fgIqni4EhXVW4/krpg==" - }, - "node_modules/glsl-token-descope": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glsl-token-descope/-/glsl-token-descope-1.0.2.tgz", - "integrity": "sha512-kS2PTWkvi/YOeicVjXGgX5j7+8N7e56srNDEHDTVZ1dcESmbmpmgrnpjPcjxJjMxh56mSXYoFdZqb90gXkGjQw==", - "dependencies": { - "glsl-token-assignments": "^2.0.0", - "glsl-token-depth": "^1.1.0", - "glsl-token-properties": "^1.0.0", - "glsl-token-scope": "^1.1.0" - } - }, - "node_modules/glsl-token-inject-block": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/glsl-token-inject-block/-/glsl-token-inject-block-1.1.0.tgz", - "integrity": "sha512-q/m+ukdUBuHCOtLhSr0uFb/qYQr4/oKrPSdIK2C4TD+qLaJvqM9wfXIF/OOBjuSA3pUoYHurVRNao6LTVVUPWA==" - }, - "node_modules/glsl-token-properties": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/glsl-token-properties/-/glsl-token-properties-1.0.1.tgz", - "integrity": "sha512-dSeW1cOIzbuUoYH0y+nxzwK9S9O3wsjttkq5ij9ZGw0OS41BirKJzzH48VLm8qLg+au6b0sINxGC0IrGwtQUcA==" - }, - "node_modules/glsl-token-scope": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/glsl-token-scope/-/glsl-token-scope-1.1.2.tgz", - "integrity": "sha512-YKyOMk1B/tz9BwYUdfDoHvMIYTGtVv2vbDSLh94PT4+f87z21FVdou1KNKgF+nECBTo0fJ20dpm0B1vZB1Q03A==" - }, - "node_modules/glsl-token-string": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/glsl-token-string/-/glsl-token-string-1.0.1.tgz", - "integrity": "sha512-1mtQ47Uxd47wrovl+T6RshKGkRRCYWhnELmkEcUAPALWGTFe2XZpH3r45XAwL2B6v+l0KNsCnoaZCSnhzKEksg==" - }, - "node_modules/glsl-token-whitespace-trim": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/glsl-token-whitespace-trim/-/glsl-token-whitespace-trim-1.0.0.tgz", - "integrity": "sha512-ZJtsPut/aDaUdLUNtmBYhaCmhIjpKNg7IgZSfX5wFReMc2vnj8zok+gB/3Quqs0TsBSX/fGnqUUYZDqyuc2xLQ==" - }, - "node_modules/glsl-tokenizer": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/glsl-tokenizer/-/glsl-tokenizer-2.1.5.tgz", - "integrity": "sha512-XSZEJ/i4dmz3Pmbnpsy3cKh7cotvFlBiZnDOwnj/05EwNp2XrhQ4XKJxT7/pDt4kp4YcpRSKz8eTV7S+mwV6MA==", - "dependencies": { - "through2": "^0.6.3" - } - }, - "node_modules/glsl-tokenizer/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/glsl-tokenizer/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/glsl-tokenizer/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, - "node_modules/glsl-tokenizer/node_modules/through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==", - "dependencies": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - }, - "node_modules/glslify": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glslify/-/glslify-7.1.1.tgz", - "integrity": "sha512-bud98CJ6kGZcP9Yxcsi7Iz647wuDz3oN+IZsjCRi5X1PI7t/xPKeL0mOwXJjo+CRZMqvq0CkSJiywCcY7kVYog==", - "dependencies": { - "bl": "^2.2.1", - "concat-stream": "^1.5.2", - "duplexify": "^3.4.5", - "falafel": "^2.1.0", - "from2": "^2.3.0", - "glsl-resolve": "0.0.1", - "glsl-token-whitespace-trim": "^1.0.0", - "glslify-bundle": "^5.0.0", - "glslify-deps": "^1.2.5", - "minimist": "^1.2.5", - "resolve": "^1.1.5", - "stack-trace": "0.0.9", - "static-eval": "^2.0.5", - "through2": "^2.0.1", - "xtend": "^4.0.0" - }, - "bin": { - "glslify": "bin.js" - } - }, - "node_modules/glslify-bundle": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/glslify-bundle/-/glslify-bundle-5.1.1.tgz", - "integrity": "sha512-plaAOQPv62M1r3OsWf2UbjN0hUYAB7Aph5bfH58VxJZJhloRNbxOL9tl/7H71K7OLJoSJ2ZqWOKk3ttQ6wy24A==", - "dependencies": { - "glsl-inject-defines": "^1.0.1", - "glsl-token-defines": "^1.0.0", - "glsl-token-depth": "^1.1.1", - "glsl-token-descope": "^1.0.2", - "glsl-token-scope": "^1.1.1", - "glsl-token-string": "^1.0.1", - "glsl-token-whitespace-trim": "^1.0.0", - "glsl-tokenizer": "^2.0.2", - "murmurhash-js": "^1.0.0", - "shallow-copy": "0.0.1" - } - }, - "node_modules/glslify-deps": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/glslify-deps/-/glslify-deps-1.3.2.tgz", - "integrity": "sha512-7S7IkHWygJRjcawveXQjRXLO2FTjijPDYC7QfZyAQanY+yGLCFHYnPtsGT9bdyHiwPTw/5a1m1M9hamT2aBpag==", - "dependencies": { - "@choojs/findup": "^0.2.0", - "events": "^3.2.0", - "glsl-resolve": "0.0.1", - "glsl-tokenizer": "^2.0.0", - "graceful-fs": "^4.1.2", - "inherits": "^2.0.1", - "map-limit": "0.0.1", - "resolve": "^1.0.0" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" - }, - "node_modules/grid-index": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz", - "integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA==" - }, - "node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/handle-thing": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" - }, - "node_modules/harmony-reflect": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", - "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" - }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-hover": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-hover/-/has-hover-1.0.1.tgz", - "integrity": "sha512-0G6w7LnlcpyDzpeGUTuT0CEw05+QlMuGVk1IHNAlHrGJITGodjZu3x8BNDUMfKJSZXNB2ZAclqc1bvrd+uUpfg==", - "dependencies": { - "is-browser": "^2.0.1" - } - }, - "node_modules/has-passive-events": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-passive-events/-/has-passive-events-1.0.0.tgz", - "integrity": "sha512-2vSj6IeIsgvsRMyeQ0JaCX5Q3lX4zMn5HpoVc7MEhQ6pv8Iq9rsXjsp+E5ZwaT7T0xhMT0KmU8gtt1EFVdbJiw==", - "dependencies": { - "is-browser": "^2.0.1" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/heap": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", - "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==" - }, - "node_modules/hoopy": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", - "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/hpack.js": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", - "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dependencies": { - "inherits": "^2.0.1", - "obuf": "^1.0.0", - "readable-stream": "^2.0.1", - "wbuf": "^1.1.0" - } - }, - "node_modules/hsluv": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/hsluv/-/hsluv-0.0.3.tgz", - "integrity": "sha512-08iL2VyCRbkQKBySkSh6m8zMUa3sADAxGVWs3Z1aPcUkTJeK0ETG4Fc27tEmQBGUAXZjIsXOZqBvacuVNSC/fQ==" - }, - "node_modules/html-encoding-sniffer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", - "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", - "dependencies": { - "whatwg-encoding": "^1.0.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" - }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-minifier-terser/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz", - "integrity": "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "webpack": "^5.20.0" - } - }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/htmlparser2/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/htmlparser2/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/htmlparser2/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/http-deceiver": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" - }, - "node_modules/http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dependencies": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dependencies": { - "@types/http-proxy": "^1.17.8", - "http-proxy": "^1.18.1", - "is-glob": "^4.0.1", - "is-plain-obj": "^3.0.0", - "micromatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "@types/express": "^4.17.13" - }, - "peerDependenciesMeta": { - "@types/express": { - "optional": true - } - } - }, - "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" - }, - "node_modules/identity-obj-proxy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", - "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", - "dependencies": { - "harmony-reflect": "^1.4.6" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-browser/-/is-browser-2.1.0.tgz", - "integrity": "sha512-F5rTJxDQ2sW81fcfOR1GnCXT6sVJC104fCyfj+mjpwNEwaPYSn5fte5jiHmBg3DHsIoL/l8Kvw5VN5SsTRcRFQ==" - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-firefox": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-firefox/-/is-firefox-1.0.3.tgz", - "integrity": "sha512-6Q9ITjvWIm0Xdqv+5U12wgOKEM2KoBw4Y926m0OFkvlCxnbG94HKAsVz8w3fWcfAS5YA2fJORXX1dLrkprCCxA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-iexplorer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-iexplorer/-/is-iexplorer-1.0.0.tgz", - "integrity": "sha512-YeLzceuwg3K6O0MLM3UyUUjKAlyULetwryFp1mHy1I5PfArK0AEqlfa+MR4gkJjcbuJXoDJCvXbyqZVf5CR2Sg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-mobile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-4.0.0.tgz", - "integrity": "sha512-mlcHZA84t1qLSuWkt2v0I2l61PYdyQDt4aG1mLIXF5FDMm4+haBCxCPYSr/uwqQNRk1MiTizn0ypEuRAOLRAew==" - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", - "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-root": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", - "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string-blank": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-string-blank/-/is-string-blank-1.0.1.tgz", - "integrity": "sha512-9H+ZBCVs3L9OYqv8nuUAzpcT9OTgMD1yAWrG7ihlnibdkbtB850heAmYWxHuXc4CHy4lKeK69tN+ny1K7gBIrw==" - }, - "node_modules/is-svg-path": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-svg-path/-/is-svg-path-1.0.2.tgz", - "integrity": "sha512-Lj4vePmqpPR1ZnRctHv8ltSh1OrSxHkhUkd7wi+VQdcdP15/KvQFyk7LhNuM7ZW0EVbJz8kZLVmL9quLrfq4Kg==" - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dependencies": { - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jake/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jake/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jake/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jake/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jake/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jake/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", - "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", - "dependencies": { - "@jest/core": "^27.5.1", - "import-local": "^3.0.2", - "jest-cli": "^27.5.1" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", - "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", - "dependencies": { - "@jest/types": "^27.5.1", - "execa": "^5.0.0", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-changed-files/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-changed-files/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-changed-files/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-changed-files/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-changed-files/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-changed-files/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-changed-files/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-changed-files/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-circus": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", - "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "dedent": "^0.7.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-circus/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-circus/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-circus/node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-circus/node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-circus/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", - "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", - "dependencies": { - "@jest/core": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "import-local": "^3.0.2", - "jest-config": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "prompts": "^2.0.1", - "yargs": "^16.2.0" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-cli/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-cli/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-cli/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-cli/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-cli/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-cli/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-cli/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", - "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", - "dependencies": { - "@babel/core": "^7.8.0", - "@jest/test-sequencer": "^27.5.1", - "@jest/types": "^27.5.1", - "babel-jest": "^27.5.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "deepmerge": "^4.2.2", - "glob": "^7.1.1", - "graceful-fs": "^4.2.9", - "jest-circus": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-jasmine2": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runner": "^27.5.1", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "micromatch": "^4.0.4", - "parse-json": "^5.2.0", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "peerDependencies": { - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-config/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-config/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-config/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-config/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-config/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-config/node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-config/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-config/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-diff/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-diff/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-diff/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-diff/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/jest-diff/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-docblock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", - "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", - "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-each/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-each/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-each/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-each/node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-each/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-environment-jsdom": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", - "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1", - "jsdom": "^16.6.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-environment-jsdom/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-environment-jsdom/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-environment-jsdom/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-environment-jsdom/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-environment-jsdom/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-jsdom/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-environment-node": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", - "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "jest-mock": "^27.5.1", - "jest-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-environment-node/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-environment-node/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-environment-node/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-environment-node/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-environment-node/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-environment-node/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", - "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/graceful-fs": "^4.1.2", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^27.5.1", - "jest-serializer": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.4", - "walker": "^1.0.7" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-haste-map/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-haste-map/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-haste-map/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-haste-map/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-haste-map/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-haste-map/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-haste-map/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-haste-map/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-haste-map/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-jasmine2": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", - "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "co": "^4.6.0", - "expect": "^27.5.1", - "is-generator-fn": "^2.0.0", - "jest-each": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "pretty-format": "^27.5.1", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-jasmine2/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-jasmine2/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-jasmine2/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-jasmine2/node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-jasmine2/node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-jasmine2/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-leak-detector": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", - "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", - "dependencies": { - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-leak-detector/node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", - "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^29.7.0", - "jest-get-type": "^29.6.3", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-matcher-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-matcher-utils/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-matcher-utils/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/jest-matcher-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-message-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-message-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/jest-message-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-mock": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", - "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-mock/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-mock/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-mock/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-mock/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-mock/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-mock/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-mock/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-mock/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", - "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", - "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", - "dependencies": { - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-pnp-resolver": "^1.2.2", - "jest-util": "^27.5.1", - "jest-validate": "^27.5.1", - "resolve": "^1.20.0", - "resolve.exports": "^1.1.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", - "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-snapshot": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve-dependencies/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve-dependencies/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-resolve-dependencies/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-resolve-dependencies/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-resolve-dependencies/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-resolve-dependencies/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-resolve-dependencies/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve-dependencies/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-resolve/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-resolve/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-resolve/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-resolve/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-resolve/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", - "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", - "dependencies": { - "@jest/console": "^27.5.1", - "@jest/environment": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "emittery": "^0.8.1", - "graceful-fs": "^4.2.9", - "jest-docblock": "^27.5.1", - "jest-environment-jsdom": "^27.5.1", - "jest-environment-node": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-leak-detector": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-runtime": "^27.5.1", - "jest-util": "^27.5.1", - "jest-worker": "^27.5.1", - "source-map-support": "^0.5.6", - "throat": "^6.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runner/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runner/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-runner/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runner/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-runner/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runner/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runner/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runner/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", - "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", - "dependencies": { - "@jest/environment": "^27.5.1", - "@jest/fake-timers": "^27.5.1", - "@jest/globals": "^27.5.1", - "@jest/source-map": "^27.5.1", - "@jest/test-result": "^27.5.1", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "chalk": "^4.0.0", - "cjs-module-lexer": "^1.0.0", - "collect-v8-coverage": "^1.0.0", - "execa": "^5.0.0", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-mock": "^27.5.1", - "jest-regex-util": "^27.5.1", - "jest-resolve": "^27.5.1", - "jest-snapshot": "^27.5.1", - "jest-util": "^27.5.1", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-runtime/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runtime/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-runtime/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-runtime/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-runtime/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-serializer": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", - "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", - "dependencies": { - "@types/node": "*", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", - "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", - "dependencies": { - "@babel/core": "^7.7.2", - "@babel/generator": "^7.7.2", - "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", - "@babel/types": "^7.0.0", - "@jest/transform": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/babel__traverse": "^7.0.4", - "@types/prettier": "^2.1.5", - "babel-preset-current-node-syntax": "^1.0.0", - "chalk": "^4.0.0", - "expect": "^27.5.1", - "graceful-fs": "^4.2.9", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-haste-map": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1", - "jest-util": "^27.5.1", - "natural-compare": "^1.4.0", - "pretty-format": "^27.5.1", - "semver": "^7.3.2" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-snapshot/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-snapshot/node_modules/diff-sequences": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", - "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/expect": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", - "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", - "dependencies": { - "@jest/types": "^27.5.1", - "jest-get-type": "^27.5.1", - "jest-matcher-utils": "^27.5.1", - "jest-message-util": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/jest-diff": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", - "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-matcher-utils": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", - "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^27.5.1", - "jest-get-type": "^27.5.1", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-message-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", - "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.5.1", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^27.5.1", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-snapshot/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-snapshot/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-util/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-util/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-util/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", - "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", - "dependencies": { - "@jest/types": "^27.5.1", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^27.5.1", - "leven": "^3.1.0", - "pretty-format": "^27.5.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-validate/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-validate/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-validate/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-validate/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-validate/node_modules/jest-get-type": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", - "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-validate/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", - "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", - "dependencies": { - "ansi-escapes": "^4.3.1", - "chalk": "^4.0.0", - "jest-regex-util": "^28.0.0", - "jest-watcher": "^28.0.0", - "slash": "^4.0.0", - "string-length": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "jest": "^27.0.0 || ^28.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@jest/console": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", - "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3", - "slash": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@jest/schemas": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", - "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", - "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", - "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", - "dependencies": { - "@jest/console": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@jest/types": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", - "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/@sinclair/typebox": { - "version": "0.24.51", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" - }, - "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-watch-typeahead/node_modules/emittery": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", - "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", - "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", - "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-util": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", - "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-watcher": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", - "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", - "dependencies": { - "@jest/test-result": "^28.1.3", - "@jest/types": "^28.1.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "emittery": "^0.10.2", - "jest-util": "^28.1.3", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watch-typeahead/node_modules/pretty-format": { - "version": "28.1.3", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", - "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/jest-watch-typeahead/node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" - }, - "node_modules/jest-watch-typeahead/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/string-length": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", - "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", - "dependencies": { - "char-regex": "^2.0.0", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", - "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/jest-watch-typeahead/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", - "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", - "dependencies": { - "@jest/test-result": "^27.5.1", - "@jest/types": "^27.5.1", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "jest-util": "^27.5.1", - "string-length": "^4.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-watcher/node_modules/@jest/types": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", - "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^16.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-watcher/node_modules/@types/yargs": { - "version": "16.0.6", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.6.tgz", - "integrity": "sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/jest-watcher/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/jest-watcher/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-watcher/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/jest-watcher/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-watcher/node_modules/jest-util": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", - "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", - "dependencies": { - "@jest/types": "^27.5.1", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/jest-watcher/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", - "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdom": { - "version": "16.7.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", - "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", - "dependencies": { - "abab": "^2.0.5", - "acorn": "^8.2.4", - "acorn-globals": "^6.0.0", - "cssom": "^0.4.4", - "cssstyle": "^2.3.0", - "data-urls": "^2.0.0", - "decimal.js": "^10.2.1", - "domexception": "^2.0.1", - "escodegen": "^2.0.0", - "form-data": "^3.0.0", - "html-encoding-sniffer": "^2.0.1", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-potential-custom-element-name": "^1.0.1", - "nwsapi": "^2.2.0", - "parse5": "6.0.1", - "saxes": "^5.0.1", - "symbol-tree": "^3.2.4", - "tough-cookie": "^4.0.0", - "w3c-hr-time": "^1.0.2", - "w3c-xmlserializer": "^2.0.0", - "webidl-conversions": "^6.1.0", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.3.0", - "whatwg-url": "^8.5.0", - "ws": "^7.4.6", - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/jsdom/node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonpath": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/jsonpath/-/jsonpath-1.1.1.tgz", - "integrity": "sha512-l6Cg7jRpixfbgoWgkrl77dgEj8RPvND0wMH6TwQmi9Qs4TFfS9u5cUFnbeKTwj5ga5Y3BTGGNI28k117LJ009w==", - "dependencies": { - "esprima": "1.2.2", - "static-eval": "2.0.2", - "underscore": "1.12.1" - } - }, - "node_modules/jsonpath/node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/jsonpath/node_modules/escodegen/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/jsonpath/node_modules/esprima": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.2.2.tgz", - "integrity": "sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/jsonpath/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/jsonpath/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/jsonpath/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/jsonpath/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/jsonpath/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jsonpath/node_modules/static-eval": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.2.tgz", - "integrity": "sha512-N/D219Hcr2bPjLxPiV+TQE++Tsmrady7TqAJugLy7Xk1EumfDWS/f5dtBbkRCGE7wKKXuYockQoj8Rm2/pVKyg==", - "dependencies": { - "escodegen": "^1.8.1" - } - }, - "node_modules/jsonpath/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/jsonpointer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", - "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/kdbush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz", - "integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew==" - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" - }, - "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", - "dependencies": { - "language-subtag-registry": "~0.3.2" - } - }, - "node_modules/launch-editor": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", - "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dependencies": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^2.1.2" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", - "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", - "dependencies": { - "sourcemap-codec": "^1.4.8" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/map-limit": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/map-limit/-/map-limit-0.0.1.tgz", - "integrity": "sha512-pJpcfLPnIF/Sk3taPW21G/RQsEEirGaFpCW3oXRwH9dnFHPHNGjNyvh++rdmC2fNqEaTw2MhYJraoJWAHx8kEg==", - "dependencies": { - "once": "~1.3.0" - } - }, - "node_modules/map-limit/node_modules/once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/mapbox-gl": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/mapbox-gl/-/mapbox-gl-1.10.1.tgz", - "integrity": "sha512-0aHt+lFUpYfvh0kMIqXqNXqoYMuhuAsMlw87TbhWrw78Tx2zfuPI0Lx31/YPUgJ+Ire0tzQ4JnuBL7acDNXmMg==", - "dependencies": { - "@mapbox/geojson-rewind": "^0.5.0", - "@mapbox/geojson-types": "^1.0.2", - "@mapbox/jsonlint-lines-primitives": "^2.0.2", - "@mapbox/mapbox-gl-supported": "^1.5.0", - "@mapbox/point-geometry": "^0.1.0", - "@mapbox/tiny-sdf": "^1.1.1", - "@mapbox/unitbezier": "^0.0.0", - "@mapbox/vector-tile": "^1.3.1", - "@mapbox/whoots-js": "^3.1.0", - "csscolorparser": "~1.0.3", - "earcut": "^2.2.2", - "geojson-vt": "^3.2.1", - "gl-matrix": "^3.2.1", - "grid-index": "^1.1.0", - "minimist": "^1.2.5", - "murmurhash-js": "^1.0.0", - "pbf": "^3.2.1", - "potpack": "^1.0.1", - "quickselect": "^2.0.0", - "rw": "^1.3.3", - "supercluster": "^7.0.0", - "tinyqueue": "^2.0.3", - "vt-pbf": "^3.1.1" - }, - "engines": { - "node": ">=6.4.0" - } - }, - "node_modules/math-log2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-log2/-/math-log2-1.0.1.tgz", - "integrity": "sha512-9W0yGtkaMAkf74XGYVy4Dqw3YUMnTNB2eeiw9aQbUl4A3KmuCEHTt2DgAB07ENzOYAjsYSAYufkAq0Zd+jU7zA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/mini-css-extract-plugin": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", - "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", - "dependencies": { - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "engines": { - "node": "*" - } - }, - "node_modules/mouse-change": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/mouse-change/-/mouse-change-1.4.0.tgz", - "integrity": "sha512-vpN0s+zLL2ykyyUDh+fayu9Xkor5v/zRD9jhSqjRS1cJTGS0+oakVZzNm5n19JvvEj0you+MXlYTpNxUDQUjkQ==", - "dependencies": { - "mouse-event": "^1.0.0" - } - }, - "node_modules/mouse-event": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/mouse-event/-/mouse-event-1.0.5.tgz", - "integrity": "sha512-ItUxtL2IkeSKSp9cyaX2JLUuKk2uMoxBg4bbOWVd29+CskYJR9BGsUqtXenNzKbnDshvupjUewDIYVrOB6NmGw==" - }, - "node_modules/mouse-event-offset": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mouse-event-offset/-/mouse-event-offset-3.0.2.tgz", - "integrity": "sha512-s9sqOs5B1Ykox3Xo8b3Ss2IQju4UwlW6LSR+Q5FXWpprJ5fzMLefIIItr3PH8RwzfGy6gxs/4GAmiNuZScE25w==" - }, - "node_modules/mouse-wheel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mouse-wheel/-/mouse-wheel-1.2.0.tgz", - "integrity": "sha512-+OfYBiUOCTWcTECES49neZwL5AoGkXE+lFjIvzwNCnYRlso+EnfvovcBxGoyQ0yQt806eSPjS675K0EwWknXmw==", - "dependencies": { - "right-now": "^1.0.0", - "signum": "^1.0.0", - "to-px": "^1.0.1" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, - "node_modules/mumath": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/mumath/-/mumath-3.3.4.tgz", - "integrity": "sha512-VAFIOG6rsxoc7q/IaY3jdjmrsuX9f15KlRLYTHmixASBZkZEKC1IFqE2BC5CdhXmK6WLM1Re33z//AGmeRI6FA==", - "deprecated": "Redundant dependency in your project.", - "dependencies": { - "almost-equal": "^1.1.0" - } - }, - "node_modules/murmurhash-js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz", - "integrity": "sha512-TvmkNhkv8yct0SVBSy+o8wYzXjE4Zz3PCesbfs8HiCXXdcTuocApFv11UWlNFWKYsP2okqrhb7JNlSm9InBhIw==" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/native-promise-only": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", - "integrity": "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" - }, - "node_modules/needle": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", - "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", - "dependencies": { - "debug": "^3.2.6", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - }, - "bin": { - "needle": "bin/needle" - }, - "engines": { - "node": ">= 4.4.x" - } - }, - "node_modules/needle/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" - }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-svg-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz", - "integrity": "sha512-1/kmYej2iedi5+ROxkRESL/pI02pkg0OBnaR4hJkSIX6+ORzepwbuUXfrdZaPjysTsJInj0Rj5NuX027+dMBvA==" - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/number-is-integer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-integer/-/number-is-integer-1.0.1.tgz", - "integrity": "sha512-Dq3iuiFBkrbmuQjGFFF3zckXNCQoSD37/SdSbgcBailUx6knDvDwb5CympBgcoWHy36sfS12u74MHYkXyHq6bg==", - "dependencies": { - "is-finite": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.0.tgz", - "integrity": "sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", - "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obuf": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", - "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dependencies": { - "@types/retry": "0.12.0", - "retry": "^0.13.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parenthesis": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/parenthesis/-/parenthesis-3.1.8.tgz", - "integrity": "sha512-KF/U8tk54BgQewkJPvB4s/US3VQY68BRDpH638+7O/n58TpnwiwnOtGIOsT2/i+M78s61BBpeC83STB88d8sqw==" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-rect": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parse-rect/-/parse-rect-1.2.0.tgz", - "integrity": "sha512-4QZ6KYbnE6RTwg9E0HpLchUM9EZt6DnDxajFZZDSV4p/12ZJEvPO702DZpGvRYEPo00yKDys7jASi+/w7aO8LA==", - "dependencies": { - "pick-by-alias": "^1.2.0" - } - }, - "node_modules/parse-svg-path": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/parse-svg-path/-/parse-svg-path-0.1.2.tgz", - "integrity": "sha512-JyPSBnkTJ0AI8GGJLfMXvKq42cj5c006fnLz6fXy6zfoVjJizi8BNTpu8on8ziI1cKy9d9DGNuY17Ce7wuejpQ==" - }, - "node_modules/parse-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-unit/-/parse-unit-1.0.1.tgz", - "integrity": "sha512-hrqldJHokR3Qj88EIlV/kAyAi/G5R2+R56TBANxNMy0uPlYcttx0jnMW6Yx5KsKPSbC3KddM/7qQm3+0wEXKxg==" - }, - "node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/pbf": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz", - "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", - "dependencies": { - "ieee754": "^1.1.12", - "resolve-protobuf-schema": "^2.1.0" - }, - "bin": { - "pbf": "bin/pbf" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "node_modules/pick-by-alias": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pick-by-alias/-/pick-by-alias-1.2.0.tgz", - "integrity": "sha512-ESj2+eBxhGrcA1azgHs7lARG5+5iLakc/6nlfbpjcLl00HuuUOIuORhYXN4D1HfvMSKuVtFQjAlnwi1JHEeDIw==" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-up/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-up/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/plotly.js": { - "version": "2.26.2", - "resolved": "https://registry.npmjs.org/plotly.js/-/plotly.js-2.26.2.tgz", - "integrity": "sha512-HJv4n1I1SFTmY1+kzkLzrRyqqWVJ6r0JekvPKP0XtxITr8jugMJNJBFiErlKiPvSz8hcDEMwys5QIdFsK57KYw==", - "dependencies": { - "@plotly/d3": "3.8.1", - "@plotly/d3-sankey": "0.7.2", - "@plotly/d3-sankey-circular": "0.33.1", - "@turf/area": "^6.4.0", - "@turf/bbox": "^6.4.0", - "@turf/centroid": "^6.0.2", - "canvas-fit": "^1.5.0", - "color-alpha": "1.0.4", - "color-normalize": "1.5.0", - "color-parse": "1.3.8", - "color-rgba": "2.1.1", - "country-regex": "^1.1.0", - "d3-force": "^1.2.1", - "d3-format": "^1.4.5", - "d3-geo": "^1.12.1", - "d3-geo-projection": "^2.9.0", - "d3-hierarchy": "^1.1.9", - "d3-interpolate": "^3.0.1", - "d3-time": "^1.1.0", - "d3-time-format": "^2.2.3", - "fast-isnumeric": "^1.1.4", - "gl-mat4": "^1.2.0", - "gl-text": "^1.3.1", - "glslify": "^7.1.1", - "has-hover": "^1.0.1", - "has-passive-events": "^1.0.0", - "is-mobile": "^4.0.0", - "mapbox-gl": "1.10.1", - "mouse-change": "^1.4.0", - "mouse-event-offset": "^3.0.2", - "mouse-wheel": "^1.2.0", - "native-promise-only": "^0.8.1", - "parse-svg-path": "^0.1.2", - "point-in-polygon": "^1.1.0", - "polybooljs": "^1.2.0", - "probe-image-size": "^7.2.3", - "regl": "npm:@plotly/regl@^2.1.2", - "regl-error2d": "^2.0.12", - "regl-line2d": "^3.1.2", - "regl-scatter2d": "^3.2.9", - "regl-splom": "^1.0.14", - "strongly-connected-components": "^1.0.1", - "superscript-text": "^1.0.0", - "svg-path-sdf": "^1.1.3", - "tinycolor2": "^1.4.2", - "to-px": "1.0.1", - "topojson-client": "^3.1.0", - "webgl-context": "^2.2.0", - "world-calendars": "^1.0.3" - } - }, - "node_modules/point-in-polygon": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/point-in-polygon/-/point-in-polygon-1.1.0.tgz", - "integrity": "sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==" - }, - "node_modules/polybooljs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/polybooljs/-/polybooljs-1.2.0.tgz", - "integrity": "sha512-mKjR5nolISvF+q2BtC1fi/llpxBPTQ3wLWN8+ldzdw2Hocpc8C72ZqnamCM4Z6z+68GVVjkeM01WJegQmZ8MEQ==" - }, - "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-browser-comments": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", - "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "browserslist": ">=4", - "postcss": ">=8" - } - }, - "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", - "dependencies": { - "postcss-selector-parser": "^6.0.9", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "postcss": "^8.2.2" - } - }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=7.6.0" - }, - "peerDependencies": { - "postcss": "^8.4.6" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-color-hex-alpha": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-rebeccapurple": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-colormin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", - "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "colord": "^2.9.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-custom-media": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/postcss-custom-properties": { - "version": "12.1.11", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", - "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-custom-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/postcss-dir-pseudo-class": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-double-position-gradients": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-flexbugs-fixes": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", - "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", - "peerDependencies": { - "postcss": "^8.1.4" - } - }, - "node_modules/postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-gap-properties": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-image-set-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-lab-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - }, - "engines": { - "node": ">= 14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/yaml": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", - "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/postcss-loader": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", - "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", - "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.5" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" - } - }, - "node_modules/postcss-loader/node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postcss-loader/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postcss-loader/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/postcss-loader/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-merge-rules": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", - "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", - "dependencies": { - "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", - "dependencies": { - "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-nesting": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", - "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", - "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-normalize": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", - "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", - "dependencies": { - "@csstools/normalize.css": "*", - "postcss-browser-comments": "^4", - "sanitize.css": "*" - }, - "engines": { - "node": ">= 12" - }, - "peerDependencies": { - "browserslist": ">= 4", - "postcss": ">= 8" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", - "dependencies": { - "normalize-url": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-opacity-percentage": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", - "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", - "dependencies": { - "cssnano-utils": "^3.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-overflow-shorthand": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "peerDependencies": { - "postcss": "^8" - } - }, - "node_modules/postcss-place": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-preset-env": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", - "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", - "dependencies": { - "@csstools/postcss-cascade-layers": "^1.1.1", - "@csstools/postcss-color-function": "^1.1.1", - "@csstools/postcss-font-format-keywords": "^1.0.1", - "@csstools/postcss-hwb-function": "^1.0.2", - "@csstools/postcss-ic-unit": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^2.0.7", - "@csstools/postcss-nested-calc": "^1.0.0", - "@csstools/postcss-normalize-display-values": "^1.0.1", - "@csstools/postcss-oklab-function": "^1.1.1", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "@csstools/postcss-stepped-value-functions": "^1.0.1", - "@csstools/postcss-text-decoration-shorthand": "^1.0.0", - "@csstools/postcss-trigonometric-functions": "^1.0.2", - "@csstools/postcss-unset-value": "^1.0.2", - "autoprefixer": "^10.4.13", - "browserslist": "^4.21.4", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^7.1.0", - "postcss-attribute-case-insensitive": "^5.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.4", - "postcss-color-hex-alpha": "^8.0.4", - "postcss-color-rebeccapurple": "^7.1.1", - "postcss-custom-media": "^8.0.2", - "postcss-custom-properties": "^12.1.10", - "postcss-custom-selectors": "^6.0.3", - "postcss-dir-pseudo-class": "^6.0.5", - "postcss-double-position-gradients": "^3.1.2", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.5", - "postcss-image-set-function": "^4.0.7", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.2.1", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.2.0", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.4", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.5", - "postcss-pseudo-class-any-link": "^7.1.6", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", - "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", - "dependencies": { - "browserslist": "^4.21.4", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "peerDependencies": { - "postcss": "^8.0.3" - } - }, - "node_modules/postcss-selector-not": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/postcss-svgo/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/postcss-svgo/node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/postcss-svgo/node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dependencies": { - "css-tree": "^1.1.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/postcss-svgo/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/postcss-svgo/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/postcss-svgo/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/postcss-svgo/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/postcss-svgo/node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" - }, - "node_modules/postcss-svgo/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss-svgo/node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", - "dependencies": { - "postcss-selector-parser": "^6.0.5" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/potpack": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", - "integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ==" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/probe-image-size": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-7.2.3.tgz", - "integrity": "sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==", - "dependencies": { - "lodash.merge": "^4.6.2", - "needle": "^2.5.2", - "stream-parser": "~0.3.1" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types-extra": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", - "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", - "dependencies": { - "react-is": "^16.3.2", - "warning": "^4.0.0" - }, - "peerDependencies": { - "react": ">=0.14.0" - } - }, - "node_modules/prop-types-extra/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/protocol-buffers-schema": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", - "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quickselect": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz", - "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==" - }, - "node_modules/raf": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", - "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", - "dependencies": { - "performance-now": "^2.1.0" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-app-polyfill": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", - "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", - "dependencies": { - "core-js": "^3.19.2", - "object-assign": "^4.1.1", - "promise": "^8.1.0", - "raf": "^3.4.1", - "regenerator-runtime": "^0.13.9", - "whatwg-fetch": "^3.6.2" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/react-app-polyfill/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/react-bootstrap": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.9.0.tgz", - "integrity": "sha512-dGh6fGjqR9MBzPOp2KbXJznt1Zy6SWepXYUdxMT18Zu/wJ73HCU8JNZe9dfzjmVssZYsJH9N3HHE4wAtQvNz7g==", - "dependencies": { - "@babel/runtime": "^7.22.5", - "@restart/hooks": "^0.4.9", - "@restart/ui": "^1.6.6", - "@types/react-transition-group": "^4.4.6", - "classnames": "^2.3.2", - "dom-helpers": "^5.2.1", - "invariant": "^2.2.4", - "prop-types": "^15.8.1", - "prop-types-extra": "^1.1.0", - "react-transition-group": "^4.4.5", - "uncontrollable": "^7.2.1", - "warning": "^4.0.3" - }, - "peerDependencies": { - "@types/react": ">=16.14.8", - "react": ">=16.14.0", - "react-dom": ">=16.14.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-cytoscapejs": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-cytoscapejs/-/react-cytoscapejs-2.0.0.tgz", - "integrity": "sha512-t3SSl1DQy7+JQjN+8QHi1anEJlM3i3aAeydHTsJwmjo/isyKK7Rs7oCvU6kZsB9NwZidzZQR21Vm2PcBLG/Tjg==", - "dependencies": { - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "cytoscape": "^3.2.19", - "react": ">=15.0.0" - } - }, - "node_modules/react-dev-utils": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", - "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", - "dependencies": { - "@babel/code-frame": "^7.16.0", - "address": "^1.1.2", - "browserslist": "^4.18.1", - "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", - "detect-port-alt": "^1.1.6", - "escape-string-regexp": "^4.0.0", - "filesize": "^8.0.6", - "find-up": "^5.0.0", - "fork-ts-checker-webpack-plugin": "^6.5.0", - "global-modules": "^2.0.0", - "globby": "^11.0.4", - "gzip-size": "^6.0.0", - "immer": "^9.0.7", - "is-root": "^2.1.0", - "loader-utils": "^3.2.0", - "open": "^8.4.0", - "pkg-up": "^3.1.0", - "prompts": "^2.4.2", - "react-error-overlay": "^6.0.11", - "recursive-readdir": "^2.2.2", - "shell-quote": "^1.7.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/react-dev-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/react-dev-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/react-dev-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/react-dev-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/react-dev-utils/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/react-dev-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/react-dev-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-error-overlay": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", - "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" - }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" - }, - "node_modules/react-plotly.js": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/react-plotly.js/-/react-plotly.js-2.6.0.tgz", - "integrity": "sha512-g93xcyhAVCSt9kV1svqG1clAEdL6k3U+jjuSzfTV7owaSU9Go6Ph8bl25J+jKfKvIGAEYpe4qj++WHJuc9IaeA==", - "dependencies": { - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "plotly.js": ">1.34.0", - "react": ">0.13.0" - } - }, - "node_modules/react-refresh": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", - "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-scripts": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", - "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", - "dependencies": { - "@babel/core": "^7.16.0", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", - "@svgr/webpack": "^5.5.0", - "babel-jest": "^27.4.2", - "babel-loader": "^8.2.3", - "babel-plugin-named-asset-import": "^0.3.8", - "babel-preset-react-app": "^10.0.1", - "bfj": "^7.0.2", - "browserslist": "^4.18.1", - "camelcase": "^6.2.1", - "case-sensitive-paths-webpack-plugin": "^2.4.0", - "css-loader": "^6.5.1", - "css-minimizer-webpack-plugin": "^3.2.0", - "dotenv": "^10.0.0", - "dotenv-expand": "^5.1.0", - "eslint": "^8.3.0", - "eslint-config-react-app": "^7.0.1", - "eslint-webpack-plugin": "^3.1.1", - "file-loader": "^6.2.0", - "fs-extra": "^10.0.0", - "html-webpack-plugin": "^5.5.0", - "identity-obj-proxy": "^3.0.0", - "jest": "^27.4.3", - "jest-resolve": "^27.4.2", - "jest-watch-typeahead": "^1.0.0", - "mini-css-extract-plugin": "^2.4.5", - "postcss": "^8.4.4", - "postcss-flexbugs-fixes": "^5.0.2", - "postcss-loader": "^6.2.1", - "postcss-normalize": "^10.0.1", - "postcss-preset-env": "^7.0.1", - "prompts": "^2.4.2", - "react-app-polyfill": "^3.0.0", - "react-dev-utils": "^12.0.1", - "react-refresh": "^0.11.0", - "resolve": "^1.20.0", - "resolve-url-loader": "5.0.0", - "sass-loader": "^12.3.0", - "semver": "^7.3.5", - "source-map-loader": "^3.0.0", - "style-loader": "^3.3.1", - "tailwindcss": "^3.0.2", - "terser-webpack-plugin": "^5.2.5", - "webpack": "^5.64.4", - "webpack-dev-server": "^4.6.0", - "webpack-manifest-plugin": "^4.0.2", - "workbox-webpack-plugin": "^6.4.1" - }, - "bin": { - "react-scripts": "bin/react-scripts.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - }, - "peerDependencies": { - "react": ">= 16", - "typescript": "^3.2.1 || ^4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/react-scripts/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/react-scripts/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/react-scripts/node_modules/resolve-url-loader": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", - "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", - "dependencies": { - "adjust-sourcemap-loader": "^4.0.0", - "convert-source-map": "^1.7.0", - "loader-utils": "^2.0.0", - "postcss": "^8.2.14", - "source-map": "0.6.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/react-scripts/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/react-scripts/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-scripts/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "dependencies": { - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regex-parser": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", - "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/regl": { - "name": "@plotly/regl", - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@plotly/regl/-/regl-2.1.2.tgz", - "integrity": "sha512-Mdk+vUACbQvjd0m/1JJjOOafmkp/EpmHjISsopEz5Av44CBq7rPC05HHNbYGKVyNUF2zmEoBS/TT0pd0SPFFyw==" - }, - "node_modules/regl-error2d": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/regl-error2d/-/regl-error2d-2.0.12.tgz", - "integrity": "sha512-r7BUprZoPO9AbyqM5qlJesrSRkl+hZnVKWKsVp7YhOl/3RIpi4UDGASGJY0puQ96u5fBYw/OlqV24IGcgJ0McA==", - "dependencies": { - "array-bounds": "^1.0.1", - "color-normalize": "^1.5.0", - "flatten-vertex-data": "^1.0.2", - "object-assign": "^4.1.1", - "pick-by-alias": "^1.2.0", - "to-float32": "^1.1.0", - "update-diff": "^1.1.0" - } - }, - "node_modules/regl-line2d": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/regl-line2d/-/regl-line2d-3.1.2.tgz", - "integrity": "sha512-nmT7WWS/WxmXAQMkgaMKWXaVmwJ65KCrjbqHGOUjjqQi6shfT96YbBOvelXwO9hG7/hjvbzjtQ2UO0L3e7YaXQ==", - "dependencies": { - "array-bounds": "^1.0.1", - "array-find-index": "^1.0.2", - "array-normalize": "^1.1.4", - "color-normalize": "^1.5.0", - "earcut": "^2.1.5", - "es6-weak-map": "^2.0.3", - "flatten-vertex-data": "^1.0.2", - "glslify": "^7.0.0", - "object-assign": "^4.1.1", - "parse-rect": "^1.2.0", - "pick-by-alias": "^1.2.0", - "to-float32": "^1.1.0" - } - }, - "node_modules/regl-scatter2d": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/regl-scatter2d/-/regl-scatter2d-3.2.9.tgz", - "integrity": "sha512-PNrXs+xaCClKpiB2b3HZ2j3qXQXhC5kcTh/Nfgx9rLO0EpEhab0BSQDqAsbdbpdf+pSHSJvbgitB7ulbGeQ+Fg==", - "dependencies": { - "@plotly/point-cluster": "^3.1.9", - "array-range": "^1.0.1", - "array-rearrange": "^2.2.2", - "clamp": "^1.0.1", - "color-id": "^1.1.0", - "color-normalize": "^1.5.0", - "color-rgba": "^2.1.1", - "flatten-vertex-data": "^1.0.2", - "glslify": "^7.0.0", - "is-iexplorer": "^1.0.0", - "object-assign": "^4.1.1", - "parse-rect": "^1.2.0", - "pick-by-alias": "^1.2.0", - "to-float32": "^1.1.0", - "update-diff": "^1.1.0" - } - }, - "node_modules/regl-splom": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/regl-splom/-/regl-splom-1.0.14.tgz", - "integrity": "sha512-OiLqjmPRYbd7kDlHC6/zDf6L8lxgDC65BhC8JirhP4ykrK4x22ZyS+BnY8EUinXKDeMgmpRwCvUmk7BK4Nweuw==", - "dependencies": { - "array-bounds": "^1.0.1", - "array-range": "^1.0.1", - "color-alpha": "^1.0.4", - "flatten-vertex-data": "^1.0.2", - "parse-rect": "^1.2.0", - "pick-by-alias": "^1.2.0", - "raf": "^3.4.1", - "regl-scatter2d": "^3.2.3" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/renderkid/node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/renderkid/node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/renderkid/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-protobuf-schema": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", - "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", - "dependencies": { - "protocol-buffers-schema": "^3.3.1" - } - }, - "node_modules/resolve-url-loader/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "extraneous": true - }, - "node_modules/resolve-url-loader/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "extraneous": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve.exports": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", - "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/retry": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/right-now": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/right-now/-/right-now-1.0.0.tgz", - "integrity": "sha512-DA8+YS+sMIVpbsuKgy+Z67L9Lxb1p05mNxRpDPNksPDEFir4vmBlUtuN9jkTGn9YMMdlBuK7XQgFiz6ws+yhSg==" - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-terser": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", - "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", - "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", - "dependencies": { - "@babel/code-frame": "^7.10.4", - "jest-worker": "^26.2.1", - "serialize-javascript": "^4.0.0", - "terser": "^5.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup-plugin-terser/node_modules/jest-worker": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", - "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", - "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/rollup-plugin-terser/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" - }, - "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sanitize.css": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", - "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" - }, - "node_modules/sass": { - "version": "1.69.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.3.tgz", - "integrity": "sha512-X99+a2iGdXkdWn1akFPs0ZmelUzyAQfvqYc2P/MPTrJRuIRoTffGzT9W9nFqG00S+c8hXzVmgxhUuHFdrwxkhQ==", - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-loader": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", - "dependencies": { - "klona": "^2.0.4", - "neo-async": "^2.6.2" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "fibers": { - "optional": true - }, - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - } - } - }, - "node_modules/sax": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", - "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" - }, - "node_modules/saxes": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", - "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/select-hose": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" - }, - "node_modules/selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", - "dependencies": { - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dependencies": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/serve-index/node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shallow-copy": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz", - "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/signum": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/signum/-/signum-1.0.0.tgz", - "integrity": "sha512-yodFGwcyt59XRh7w5W3jPcIQb3Bwi21suEfT7MAWnBX3iCdklJpgDgvGT9o04UonglZN5SNMfJFkHIR/jO8GHw==" - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/socket.io": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.2.tgz", - "integrity": "sha512-bvKVS29/I5fl2FGLNHuXlQaUH/BlzX1IN6S+NKLNZpBsPZIDH+90eQmCs2Railn4YUiww4SzUedJ6+uzwFnKLw==", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.3.2", - "engine.io": "~6.5.2", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", - "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", - "dependencies": { - "ws": "~8.11.0" - } - }, - "node_modules/socket.io-adapter/node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/socket.io-client": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz", - "integrity": "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.2", - "engine.io-client": "~6.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/sockjs": { - "version": "0.3.24", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", - "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dependencies": { - "faye-websocket": "^0.11.3", - "uuid": "^8.3.2", - "websocket-driver": "^0.7.4" - } - }, - "node_modules/source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" - }, - "node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-loader": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", - "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", - "dependencies": { - "abab": "^2.0.5", - "iconv-lite": "^0.6.3", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/source-map-loader/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-support/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sourcemap-codec": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "deprecated": "Please use @jridgewell/sourcemap-codec instead" - }, - "node_modules/spdy": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", - "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dependencies": { - "debug": "^4.1.0", - "handle-thing": "^2.0.0", - "http-deceiver": "^1.2.7", - "select-hose": "^2.0.0", - "spdy-transport": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/spdy-transport": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", - "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dependencies": { - "debug": "^4.1.0", - "detect-node": "^2.0.4", - "hpack.js": "^2.1.6", - "obuf": "^1.1.2", - "readable-stream": "^3.0.6", - "wbuf": "^1.7.3" - } - }, - "node_modules/spdy-transport/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" - }, - "node_modules/stack-trace": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", - "integrity": "sha512-vjUc6sfgtgY0dxCdnc40mK6Oftjo9+2K8H/NG81TMhgL392FtiPA9tn9RLyTxXmTLPJPjF3VyzFp6bsWFLisMQ==", - "engines": { - "node": "*" - } - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" - }, - "node_modules/static-eval": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz", - "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==", - "dependencies": { - "escodegen": "^1.11.1" - } - }, - "node_modules/static-eval/node_modules/escodegen": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", - "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^4.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=4.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/static-eval/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/static-eval/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-eval/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-eval/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/static-eval/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-eval/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/stream-parser": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz", - "integrity": "sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==", - "dependencies": { - "debug": "2" - } - }, - "node_modules/stream-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/stream-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-natural-compare": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", - "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" - }, - "node_modules/string-split-by": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string-split-by/-/string-split-by-1.0.0.tgz", - "integrity": "sha512-KaJKY+hfpzNyet/emP81PJA9hTVSfxNLS9SFTWxdCnnW1/zOOwiV248+EfoX7IQFcBaOp4G5YE6xTJMF+pLg6A==", - "dependencies": { - "parenthesis": "^3.1.5" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/stringify-object": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", - "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", - "dependencies": { - "get-own-enumerable-property-symbols": "^3.0.0", - "is-obj": "^1.0.1", - "is-regexp": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", - "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strongly-connected-components": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strongly-connected-components/-/strongly-connected-components-1.0.1.tgz", - "integrity": "sha512-i0TFx4wPcO0FwX+4RkLJi1MxmcTv90jNZgxMu9XRnMXMeFUY1VJlIoXpZunPUvUUqbCT1pg5PEkFqqpcaElNaA==" - }, - "node_modules/style-loader": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", - "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.0.0" - } - }, - "node_modules/stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", - "dependencies": { - "browserslist": "^4.21.4", - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" - }, - "peerDependencies": { - "postcss": "^8.2.15" - } - }, - "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/supercluster": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz", - "integrity": "sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==", - "dependencies": { - "kdbush": "^3.0.0" - } - }, - "node_modules/superscript-text": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/superscript-text/-/superscript-text-1.0.0.tgz", - "integrity": "sha512-gwu8l5MtRZ6koO0icVTlmN5pm7Dhh1+Xpe9O4x6ObMAsW+3jPbW14d1DsBq1F4wiI+WOFjXF35pslgec/G8yCQ==" - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-arc-to-cubic-bezier": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz", - "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==" - }, - "node_modules/svg-parser": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" - }, - "node_modules/svg-path-bounds": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/svg-path-bounds/-/svg-path-bounds-1.0.2.tgz", - "integrity": "sha512-H4/uAgLWrppIC0kHsb2/dWUYSmb4GE5UqH06uqWBcg6LBjX2fu0A8+JrO2/FJPZiSsNOKZAhyFFgsLTdYUvSqQ==", - "dependencies": { - "abs-svg-path": "^0.1.1", - "is-svg-path": "^1.0.1", - "normalize-svg-path": "^1.0.0", - "parse-svg-path": "^0.1.2" - } - }, - "node_modules/svg-path-bounds/node_modules/normalize-svg-path": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/normalize-svg-path/-/normalize-svg-path-1.1.0.tgz", - "integrity": "sha512-r9KHKG2UUeB5LoTouwDzBy2VxXlHsiM6fyLQvnJa0S5hrhzqElH/CH7TUGhT1fVvIYBIKf3OpY4YJ4CK+iaqHg==", - "dependencies": { - "svg-arc-to-cubic-bezier": "^3.0.0" - } - }, - "node_modules/svg-path-sdf": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz", - "integrity": "sha512-vJJjVq/R5lSr2KLfVXVAStktfcfa1pNFjFOgyJnzZFXlO/fDZ5DmM8FpnSKKzLPfEYTVeXuVBTHF296TpxuJVg==", - "dependencies": { - "bitmap-sdf": "^1.0.0", - "draw-svg-path": "^1.0.0", - "is-svg-path": "^1.0.1", - "parse-svg-path": "^0.1.2", - "svg-path-bounds": "^1.0.1" - } - }, - "node_modules/svgo": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz", - "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.2.1", - "csso": "^5.0.5", - "picocolors": "^1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" - } - }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" - }, - "node_modules/tailwindcss": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", - "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.2.12", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.18.2", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/tempy": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", - "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", - "dependencies": { - "is-stream": "^2.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^0.16.0", - "unique-string": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", - "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terminal-link": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", - "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", - "dependencies": { - "ansi-escapes": "^4.2.1", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/terser": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz", - "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser/node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/throat": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", - "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==" - }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" - }, - "node_modules/tinycolor2": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" - }, - "node_modules/tinyqueue": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", - "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==" - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, - "node_modules/to-float32": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/to-float32/-/to-float32-1.1.0.tgz", - "integrity": "sha512-keDnAusn/vc+R3iEiSDw8TOF7gPiTLdK1ArvWtYbJQiVfmRg6i/CAvbKq3uIS0vWroAC7ZecN3DjQKw3aSklUg==" - }, - "node_modules/to-px": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-px/-/to-px-1.0.1.tgz", - "integrity": "sha512-2y3LjBeIZYL19e5gczp14/uRWFDtDUErJPVN3VU9a7SJO+RjGRtYR47aMN2bZgGlxvW4ZcEz2ddUPVHXcMfuXw==", - "dependencies": { - "parse-unit": "^1.0.1" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/topojson-client": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", - "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", - "dependencies": { - "commander": "2" - }, - "bin": { - "topo2geo": "bin/topo2geo", - "topomerge": "bin/topomerge", - "topoquantize": "bin/topoquantize" - } - }, - "node_modules/tough-cookie": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", - "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", - "dependencies": { - "psl": "^1.1.33", - "punycode": "^2.1.1", - "universalify": "^0.2.0", - "url-parse": "^1.5.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie/node_modules/universalify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", - "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/tr46": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", - "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", - "dependencies": { - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tryer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", - "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" - }, - "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" - }, - "node_modules/typedarray-pool": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/typedarray-pool/-/typedarray-pool-1.2.0.tgz", - "integrity": "sha512-YTSQbzX43yvtpfRtIDAYygoYtgT+Rpjuxy9iOpczrjpXLgGoyG7aS5USJXV2d3nn8uHTeb9rXDvzS27zUg5KYQ==", - "dependencies": { - "bit-twiddle": "^1.0.0", - "dup": "^1.0.0" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/uncontrollable": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", - "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", - "dependencies": { - "@babel/runtime": "^7.6.3", - "@types/react": ">=16.9.11", - "invariant": "^2.2.4", - "react-lifecycles-compat": "^3.0.4" - }, - "peerDependencies": { - "react": ">=15.0.0" - } - }, - "node_modules/underscore": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz", - "integrity": "sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==" - }, - "node_modules/undici-types": { - "version": "5.25.3", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", - "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==" - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unquote": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", - "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/update-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-diff/-/update-diff-1.1.0.tgz", - "integrity": "sha512-rCiBPiHxZwT4+sBhEbChzpO5hYHjm91kScWgdHf4Qeafs6Ba7MBl+d9GlGv72bcTZQO0sLmtQS1pHSWoCLtN/A==" - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-to-istanbul": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", - "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0", - "source-map": "^0.7.3" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vt-pbf": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz", - "integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==", - "dependencies": { - "@mapbox/point-geometry": "0.1.0", - "@mapbox/vector-tile": "^1.3.1", - "pbf": "^3.2.1" - } - }, - "node_modules/w3c-hr-time": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", - "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", - "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", - "dependencies": { - "browser-process-hrtime": "^1.0.0" - } - }, - "node_modules/w3c-xmlserializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", - "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", - "dependencies": { - "xml-name-validator": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/wbuf": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", - "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dependencies": { - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/weak-map": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.8.tgz", - "integrity": "sha512-lNR9aAefbGPpHO7AEnY0hCFjz1eTkWCXYvkTRrTHs9qv8zJp+SkVYpzfLIFXQQiG3tVvbNFQgVg2bQS8YGgxyw==" - }, - "node_modules/web-vitals": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-2.1.4.tgz", - "integrity": "sha512-sVWcwhU5mX6crfI5Vd2dC4qchyTqxV8URinzt25XqVh+bHEPGH4C3NPrNionCP7Obx59wrYEbNlw4Z8sjALzZg==" - }, - "node_modules/web-worker": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", - "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" - }, - "node_modules/webgl-context": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/webgl-context/-/webgl-context-2.2.0.tgz", - "integrity": "sha512-q/fGIivtqTT7PEoF07axFIlHNk/XCPaYpq64btnepopSWvKNFkoORlQYgqDigBIuGA1ExnFd/GnSUnBNEPQY7Q==", - "dependencies": { - "get-canvas-context": "^1.0.1" - } - }, - "node_modules/webidl-conversions": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", - "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", - "engines": { - "node": ">=10.4" - } - }, - "node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", - "dependencies": { - "colorette": "^2.0.10", - "memfs": "^3.4.3", - "mime-types": "^2.1.31", - "range-parser": "^1.2.1", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server": { - "version": "4.15.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", - "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", - "dependencies": { - "@types/bonjour": "^3.5.9", - "@types/connect-history-api-fallback": "^1.3.5", - "@types/express": "^4.17.13", - "@types/serve-index": "^1.9.1", - "@types/serve-static": "^1.13.10", - "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.0.11", - "chokidar": "^3.5.3", - "colorette": "^2.0.10", - "compression": "^1.7.4", - "connect-history-api-fallback": "^2.0.0", - "default-gateway": "^6.0.3", - "express": "^4.17.3", - "graceful-fs": "^4.2.6", - "html-entities": "^2.3.2", - "http-proxy-middleware": "^2.0.3", - "ipaddr.js": "^2.0.1", - "launch-editor": "^2.6.0", - "open": "^8.0.9", - "p-retry": "^4.5.0", - "rimraf": "^3.0.2", - "schema-utils": "^4.0.0", - "selfsigned": "^2.1.1", - "serve-index": "^1.9.1", - "sockjs": "^0.3.24", - "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.13.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^4.37.0 || ^5.0.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-manifest-plugin": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", - "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", - "dependencies": { - "tapable": "^2.0.0", - "webpack-sources": "^2.2.0" - }, - "engines": { - "node": ">=12.22.0" - }, - "peerDependencies": { - "webpack": "^4.44.2 || ^5.47.0" - } - }, - "node_modules/webpack-manifest-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", - "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", - "dependencies": { - "source-list-map": "^2.0.1", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/webpack/node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/whatwg-encoding": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", - "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", - "dependencies": { - "iconv-lite": "0.4.24" - } - }, - "node_modules/whatwg-fetch": { - "version": "3.6.19", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", - "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==" - }, - "node_modules/whatwg-mimetype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", - "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" - }, - "node_modules/whatwg-url": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", - "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", - "dependencies": { - "lodash": "^4.7.0", - "tr46": "^2.1.0", - "webidl-conversions": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "name": "@aashutoshrathi/word-wrap", - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/workbox-background-sync": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", - "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", - "dependencies": { - "idb": "^7.0.1", - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-broadcast-update": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", - "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-build": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", - "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", - "dependencies": { - "@apideck/better-ajv-errors": "^0.3.1", - "@babel/core": "^7.11.1", - "@babel/preset-env": "^7.11.0", - "@babel/runtime": "^7.11.2", - "@rollup/plugin-babel": "^5.2.0", - "@rollup/plugin-node-resolve": "^11.2.1", - "@rollup/plugin-replace": "^2.4.1", - "@surma/rollup-plugin-off-main-thread": "^2.2.3", - "ajv": "^8.6.0", - "common-tags": "^1.8.0", - "fast-json-stable-stringify": "^2.1.0", - "fs-extra": "^9.0.1", - "glob": "^7.1.6", - "lodash": "^4.17.20", - "pretty-bytes": "^5.3.0", - "rollup": "^2.43.1", - "rollup-plugin-terser": "^7.0.0", - "source-map": "^0.8.0-beta.0", - "stringify-object": "^3.3.0", - "strip-comments": "^2.0.1", - "tempy": "^0.6.0", - "upath": "^1.2.0", - "workbox-background-sync": "6.6.0", - "workbox-broadcast-update": "6.6.0", - "workbox-cacheable-response": "6.6.0", - "workbox-core": "6.6.0", - "workbox-expiration": "6.6.0", - "workbox-google-analytics": "6.6.0", - "workbox-navigation-preload": "6.6.0", - "workbox-precaching": "6.6.0", - "workbox-range-requests": "6.6.0", - "workbox-recipes": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0", - "workbox-streams": "6.6.0", - "workbox-sw": "6.6.0", - "workbox-window": "6.6.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", - "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", - "dependencies": { - "json-schema": "^0.4.0", - "jsonpointer": "^5.0.0", - "leven": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "ajv": ">=8" - } - }, - "node_modules/workbox-build/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/workbox-build/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/workbox-build/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/workbox-build/node_modules/source-map": { - "version": "0.8.0-beta.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", - "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", - "dependencies": { - "whatwg-url": "^7.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/workbox-build/node_modules/tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/workbox-build/node_modules/webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" - }, - "node_modules/workbox-build/node_modules/whatwg-url": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", - "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", - "dependencies": { - "lodash.sortby": "^4.7.0", - "tr46": "^1.0.1", - "webidl-conversions": "^4.0.2" - } - }, - "node_modules/workbox-cacheable-response": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", - "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", - "deprecated": "workbox-background-sync@6.6.0", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-core": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", - "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==" - }, - "node_modules/workbox-expiration": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", - "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", - "dependencies": { - "idb": "^7.0.1", - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-google-analytics": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", - "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", - "dependencies": { - "workbox-background-sync": "6.6.0", - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" - } - }, - "node_modules/workbox-navigation-preload": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", - "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-precaching": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", - "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", - "dependencies": { - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" - } - }, - "node_modules/workbox-range-requests": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", - "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-recipes": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", - "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", - "dependencies": { - "workbox-cacheable-response": "6.6.0", - "workbox-core": "6.6.0", - "workbox-expiration": "6.6.0", - "workbox-precaching": "6.6.0", - "workbox-routing": "6.6.0", - "workbox-strategies": "6.6.0" - } - }, - "node_modules/workbox-routing": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", - "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-strategies": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", - "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", - "dependencies": { - "workbox-core": "6.6.0" - } - }, - "node_modules/workbox-streams": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", - "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", - "dependencies": { - "workbox-core": "6.6.0", - "workbox-routing": "6.6.0" - } - }, - "node_modules/workbox-sw": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", - "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==" - }, - "node_modules/workbox-webpack-plugin": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", - "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", - "dependencies": { - "fast-json-stable-stringify": "^2.1.0", - "pretty-bytes": "^5.4.1", - "upath": "^1.2.0", - "webpack-sources": "^1.4.3", - "workbox-build": "6.6.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "webpack": "^4.4.0 || ^5.9.0" - } - }, - "node_modules/workbox-webpack-plugin/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dependencies": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "node_modules/workbox-window": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", - "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", - "dependencies": { - "@types/trusted-types": "^2.0.2", - "workbox-core": "6.6.0" - } - }, - "node_modules/world-calendars": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/world-calendars/-/world-calendars-1.0.3.tgz", - "integrity": "sha512-sAjLZkBnsbHkHWVhrsCU5Sa/EVuf9QqgvrN8zyJ2L/F9FR9Oc6CvVK0674+PGAtmmmYQMH98tCUSO4QLQv3/TQ==", - "dependencies": { - "object-assign": "^4.1.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml-name-validator": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", - "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" - }, - "node_modules/xmlhttprequest-ssl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", - "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/neural_insights/gui/package.json b/neural_insights/gui/package.json deleted file mode 100644 index 5374ea56188..00000000000 --- a/neural_insights/gui/package.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "name": "app", - "version": "0.1.0", - "private": true, - "dependencies": { - "@testing-library/jest-dom": "^5.16.5", - "@testing-library/react": "^13.4.0", - "@testing-library/user-event": "^13.5.0", - "axios": "^1.6.0", - "bootstrap": "^5.3.0", - "css-select": "^5.1.0", - "cytoscape": "^3.25.0", - "cytoscape-elk": "^2.2.0", - "cytoscape-node-html-label": "^1.2.2", - "moment": "^2.29.4", - "plotly.js": "^2.24.3", - "react": "^18.2.0", - "react-bootstrap": "^2.8.0", - "react-cytoscapejs": "^2.0.0", - "react-dom": "^18.2.0", - "react-plotly.js": "^2.6.0", - "react-scripts": "^5.0.1", - "sass": "^1.63.6", - "socket.io": "^4.7.1", - "socket.io-client": "^4.7.1", - "web-vitals": "^2.1.4", - "web-worker": "^1.2.0" - }, - "devDependencies": { - "@svgr/webpack": "8.0.1" - }, - "overrides": { - "@svgr/webpack": "$@svgr/webpack", - "word-wrap": "npm:@aashutoshrathi/word-wrap@1.2.6" - }, - "scripts": { - "start": "react-scripts start", - "build": "BUILD_PATH='./../web/app' react-scripts build", - "test": "react-scripts test", - "eject": "react-scripts eject" - }, - "eslintConfig": { - "extends": [ - "react-app", - "react-app/jest" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - } -} \ No newline at end of file diff --git a/neural_insights/gui/public/favicon.ico b/neural_insights/gui/public/favicon.ico deleted file mode 100644 index 39f348e6a77..00000000000 Binary files a/neural_insights/gui/public/favicon.ico and /dev/null differ diff --git a/neural_insights/gui/public/icons/057a-trash-solid-red.svg b/neural_insights/gui/public/icons/057a-trash-solid-red.svg deleted file mode 100644 index 389c37091bd..00000000000 --- a/neural_insights/gui/public/icons/057a-trash-solid-red.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - diff --git a/neural_insights/gui/public/icons/057a-trash-solid.svg b/neural_insights/gui/public/icons/057a-trash-solid.svg deleted file mode 100644 index 623f93c34b7..00000000000 --- a/neural_insights/gui/public/icons/057a-trash-solid.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - diff --git a/neural_insights/gui/public/icons/146b-copy-outlined-gray.svg b/neural_insights/gui/public/icons/146b-copy-outlined-gray.svg deleted file mode 100644 index 2194c1ab27e..00000000000 --- a/neural_insights/gui/public/icons/146b-copy-outlined-gray.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - diff --git a/neural_insights/gui/public/icons/146b-copy-outlined.svg b/neural_insights/gui/public/icons/146b-copy-outlined.svg deleted file mode 100644 index 9a6262f2284..00000000000 --- a/neural_insights/gui/public/icons/146b-copy-outlined.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - diff --git a/neural_insights/gui/public/index.html b/neural_insights/gui/public/index.html deleted file mode 100644 index eba49cd08a1..00000000000 --- a/neural_insights/gui/public/index.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - Neural Insights - - - - -
- - - - \ No newline at end of file diff --git a/neural_insights/gui/src/App.js b/neural_insights/gui/src/App.js deleted file mode 100644 index 3522c9c5fc5..00000000000 --- a/neural_insights/gui/src/App.js +++ /dev/null @@ -1,33 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -import './App.scss'; -import Diagnosis from './components/Diagnosis/Diagnosis'; -import axios from 'axios'; - -export const api = axios.create({ - baseURL: `/` -}); - -function App() { - document.body.style = 'background: #ececec;'; - localStorage.setItem('token', window.location.search.replace('?token=', '')); - return ( -
- -
- ); -} - -export default App; diff --git a/neural_insights/gui/src/App.scss b/neural_insights/gui/src/App.scss deleted file mode 100644 index 32b0d37967a..00000000000 --- a/neural_insights/gui/src/App.scss +++ /dev/null @@ -1,137 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -@import './variables.scss'; - -table.rounded { - margin: auto; - border-collapse: collapse; - - tr.header { - text-align: center; - font-weight: bold; - } - - th.header { - background: $accent-yellow; - color: black; - vertical-align: middle; - } - - td.header { - background: $accent-yellow; - padding: 10px; - color: black; - text-align: center; - border-bottom: 1px solid #fafafa; - border-radius: 0px; - } - - tr:nth-child(even) { - background-color: rgba(182, 182, 182, 0.13); - } - - tr:nth-child(odd) { - background-color: rgba(231, 231, 231, 0.13); - } - - tr.cell, - td.cell { - padding: 5px; - border-bottom: none; - } - - tr:last-child { - - td:last-child { - border-radius: 0 0 0.5rem 0; - } - - td:first-child { - border-radius: 0 0 0 0.5rem; - } - - td:only-child { - border-radius: 0 0 0.5rem 0.5rem; - } - } - - tr:first-child { - - th:first-child { - border-radius: 0.5rem 0 0 0; - } - - th:last-child { - border-radius: 0 0.5rem 0 0; - } - - td:first-child { - border-radius: 0.5rem 0 0 0; - } - - td:last-child { - border-radius: 0 0.5rem 0 0; - } - - td:only-child { - border-radius: 0.5rem 0.5rem 0 0; - } - } - - tr:only-child { - td:only-child { - border-radius: 0.5rem 0.5rem 0.5rem 0.5rem; - } - } - - tr.active { - background-color: #ffe07ab6 !important; - color: black; - } -} - -.right { - text-align: right; -} - -.center { - text-align: center; -} - -.btn-primary { - background-color: $accent-yellow !important; - color: black !important; - border: 2px solid $accent-yellow !important; -} - -.btn-primary:hover, -.btn-primary:focus { - color: black !important; - border: 2px solid black !important; -} - -.btn-secondary { - background-color: white !important; - color: black !important; - border-color: $accent-yellow !important; - margin-bottom: 4px; - width: 100%; -} - -.btn-secondary:hover { - background-color: $lighter-yellow !important; - color: black !important; - border-color: $accent-yellow !important; -} \ No newline at end of file diff --git a/neural_insights/gui/src/App.test.js b/neural_insights/gui/src/App.test.js deleted file mode 100644 index 6739eb20554..00000000000 --- a/neural_insights/gui/src/App.test.js +++ /dev/null @@ -1,22 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -import { render, screen } from '@testing-library/react'; -import App from './App'; - -test('renders learn react link', () => { - render(); - const linkElement = screen.getByText(/learn react/i); - expect(linkElement).toBeInTheDocument(); -}); diff --git a/neural_insights/gui/src/assets/fonts/IntelClear_Bd.ttf b/neural_insights/gui/src/assets/fonts/IntelClear_Bd.ttf deleted file mode 100644 index 5058d15085c..00000000000 Binary files a/neural_insights/gui/src/assets/fonts/IntelClear_Bd.ttf and /dev/null differ diff --git a/neural_insights/gui/src/assets/fonts/IntelClear_Lt.ttf b/neural_insights/gui/src/assets/fonts/IntelClear_Lt.ttf deleted file mode 100644 index 151b54c7b7b..00000000000 Binary files a/neural_insights/gui/src/assets/fonts/IntelClear_Lt.ttf and /dev/null differ diff --git a/neural_insights/gui/src/assets/fonts/IntelClear_Rg.ttf b/neural_insights/gui/src/assets/fonts/IntelClear_Rg.ttf deleted file mode 100644 index 0a2d0be299f..00000000000 Binary files a/neural_insights/gui/src/assets/fonts/IntelClear_Rg.ttf and /dev/null differ diff --git a/neural_insights/gui/src/assets/fonts/intelone-display-bold.ttf b/neural_insights/gui/src/assets/fonts/intelone-display-bold.ttf deleted file mode 100644 index 072a9dc8880..00000000000 Binary files a/neural_insights/gui/src/assets/fonts/intelone-display-bold.ttf and /dev/null differ diff --git a/neural_insights/gui/src/assets/fonts/intelone-display-light.ttf b/neural_insights/gui/src/assets/fonts/intelone-display-light.ttf deleted file mode 100644 index d23ed421816..00000000000 Binary files a/neural_insights/gui/src/assets/fonts/intelone-display-light.ttf and /dev/null differ diff --git a/neural_insights/gui/src/assets/fonts/intelone-display-regular.ttf b/neural_insights/gui/src/assets/fonts/intelone-display-regular.ttf deleted file mode 100644 index a70bb54e9d0..00000000000 Binary files a/neural_insights/gui/src/assets/fonts/intelone-display-regular.ttf and /dev/null differ diff --git a/neural_insights/gui/src/assets/fonts/intelone-mono-font-family-regular.ttf b/neural_insights/gui/src/assets/fonts/intelone-mono-font-family-regular.ttf deleted file mode 100644 index 271117969d3..00000000000 Binary files a/neural_insights/gui/src/assets/fonts/intelone-mono-font-family-regular.ttf and /dev/null differ diff --git a/neural_insights/gui/src/components/Diagnosis/Diagnosis.js b/neural_insights/gui/src/components/Diagnosis/Diagnosis.js deleted file mode 100644 index d788ca426e2..00000000000 --- a/neural_insights/gui/src/components/Diagnosis/Diagnosis.js +++ /dev/null @@ -1,234 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -import React, { useState } from 'react'; -import './Diagnosis.scss'; -import Graph from './../Graph/Graph'; -import OpDetails from './../OpDetails/OpDetails'; -import OpList from './../OpList/OpList'; -import Histogram from './../Histogram/Histogram'; -import Workloads from './../Workloads/Workloads'; -import WorkloadDetails from './../WorkloadDetails/WorkloadDetails'; -import ModelSummary from './../ModelSummary/ModelSummary'; -import Profiling from './../Profiling/Profiling'; -import Warning from './../Warning/Warning'; -import Form from 'react-bootstrap/Form'; -import InputGroup from 'react-bootstrap/InputGroup'; -import Button from 'react-bootstrap/esm/Button'; -import Spinner from 'react-bootstrap/Spinner'; - -function Diagnosis() { - const [selectedNode, setSelectedNode] = useState(null); - const [selectedWorkload, setSelectedWorkload] = useState(null); - const [selectedOp, setSelectedOp] = useState(null); - const [selectedPattern, setSelectedPattern] = useState([]); - const [histogramType, setHistogramType] = useState(null); - const [warningText, setWarningText] = useState(''); - - return ( -
- -
-
-
- -
- - {selectedWorkload?.mode === 'quantization' && - - } -
- {selectedWorkload?.mode === 'benchmark' && -
- -
- } - {selectedWorkload?.mode === 'quantization' && -
- {selectedWorkload.framework !== 'PyTorch' && - - } - {selectedWorkload.framework === 'PyTorch' && - - } -
- } - {selectedWorkload?.mode === 'quantization' && -
- - -
- } -
- {selectedWorkload?.mode === 'quantization' && selectedOp && -
-
- -
-
- {histogramType && } -
-
- } -
- ) -}; - -function NodeProperties({ selectedNode }) { - if (selectedNode) { - const propertyList = Object.entries(selectedNode.properties).map(([key, value]) => { - return ( - - {key} - {getLabel(value)} - - ) - }); - - const attributeList = selectedNode.attributes?.map(attribute => { - return ( - - {attribute.name} - {attribute.attribute_type} - {attribute.attribute_type !== "float32" && - {attribute.value?.toString()} - } - {attribute.attribute_type === "float32" && - {attribute.value.toExponential(2)} - } - - ) - }); - - return ( -
-

Node details

- - - - - - {propertyList} - - {attributeList && } - - {attributeList} - -
Properties
Attributes
-
- ); - } else { - return; - } -} - -class NodeSearch extends React.Component { - render() { - return ( -
-

Node search

- - - - -
- ) - } -} - -function AccuracyResults({ selectedWorkload }) { - return ( -
- {selectedWorkload.status === 'wip' && -

Quantization is in progress. -

- -
-

- } - {selectedWorkload.status !== 'wip' && - !selectedWorkload.accuracy_data.ratio && - - - - - - - - - -
Accuracy
results
-
N/A
-
FP32
-
-
N/A
-
INT8
-
-
N/A
-
Ratio
-
- } - {selectedWorkload.status !== 'wip' && - selectedWorkload.accuracy_data.ratio && - - - - - - - - - -
Accuracy
results
-
{(selectedWorkload.accuracy_data.baseline_accuracy * 100).toPrecision(3)}%
-
FP32
-
-
{(selectedWorkload.accuracy_data.optimized_accuracy * 100).toPrecision(3)}%
-
INT8
-
-
{(selectedWorkload.accuracy_data.ratio * 100).toPrecision(2)}%
-
Ratio
-
- } -
- ) -} - -export const getLabel = (label) => { - if (label.includes('/')) { - return label.replace(/^.*[\\\/]/, ''); - } else { - return label; - } -} - -export const customColor = [ - '#5B69FF', - '#FF848A', - '#EDB200', - '#1E2EB8', - '#FF5662', - '#C98F00', - '#000F8A', - '#C81326', - '#000864', - '#9D79BC', - '#A14DA0', -]; - -export default Diagnosis; diff --git a/neural_insights/gui/src/components/Diagnosis/Diagnosis.scss b/neural_insights/gui/src/components/Diagnosis/Diagnosis.scss deleted file mode 100644 index 30d29279bab..00000000000 --- a/neural_insights/gui/src/components/Diagnosis/Diagnosis.scss +++ /dev/null @@ -1,142 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -@import './../../variables.scss'; - -.Diagnosis { - - .property-table { - border-collapse: collapse; - width: 100%; - } - - .table-title { - font-family: IntelClearBd; - text-align: center; - } - - .table-key { - text-align: right; - padding: 5px; - } - - .table-value { - text-align: left; - background-color: $light-gray; - padding: 5px; - border: 2px white solid; - } - - .data-panel { - background-color: white; - padding: 10px; - border-radius: 0.5rem; - margin-bottom: 6px; - } - - .data-panel-top { - background-color: white; - padding: 10px; - border-radius: 0.5rem; - margin-top: 6px; - } - - .flexbox { - display: flex; - max-height: 99vh; - background-color: $light-gray; - } - - .flexbox-inside { - flex-shrink: 0; - padding: 3px; - display: flex; - flex-direction: column; - max-height: 90vh; - } - - .workloads-flex { - display: flex; - flex-direction: column; - overflow: auto; - } - - .overflow-table { - max-height: calc(90vh - 96px); - background-color: white; - border-radius: 0.5rem; - overflow: auto; - } - - .flex-item { - padding: 3px; - width: 98%; - max-width: calc(100vw - 370px); - } - - .flex-bigger { - padding: 3px; - width: 98%; - } - - .accuracy-table { - width: 98%; - } - - .accuracy-number { - font-size: 200%; - color: $energy-blue; - text-align: center; - padding-left: 20px; - } - - .accuracy-title { - font-family: IntelOneRg; - font-size: 120%; - } - - .accuracy-subtitle { - font-size: 80%; - color: $dark-gray; - text-align: center; - padding-left: 20px; - } - - .clickable { - cursor: pointer; - } - - .nowrap { - white-space: nowrap; - } - - .alert { - position: fixed; - top: 40vh; - left: 25vw; - margin: auto; - width: 50vw; - z-index: 100; - } - - .spinner-container { - width: 50px; - margin: auto; - padding: 20px; - } - - .spinner { - color: #5B69FF; - } -} \ No newline at end of file diff --git a/neural_insights/gui/src/components/Graph/Graph.js b/neural_insights/gui/src/components/Graph/Graph.js deleted file mode 100644 index 90e4ebdb8f0..00000000000 --- a/neural_insights/gui/src/components/Graph/Graph.js +++ /dev/null @@ -1,334 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -import React, { useEffect, useState } from 'react'; -import './Graph.scss'; -import { getLabel, customColor } from './../Diagnosis/Diagnosis'; -import Button from 'react-bootstrap/Button'; -import { api } from './../../App'; -import Spinner from 'react-bootstrap/Spinner'; - -const cytoscape = require('cytoscape'); -const nodeHtmlLabel = require('cytoscape-node-html-label'); -cytoscape.use(nodeHtmlLabel); -const elk = require('cytoscape-elk'); -cytoscape.use(elk); - -export default function Graph({ setSelectedNode, selectedWorkload, selectedOp, selectedPattern, setWarningText }) { - const [graph, setGraph] = useState(null); - const [groupNode, setGroupNode] = useState([]); - const groupNodeOpList = []; - - useEffect(() => { - if (selectedWorkload) { - const payload = { - workload_id: selectedWorkload.uuid, - path: [selectedWorkload.model_path], - ...((groupNode.length || groupNodeOpList.length) && { group: [...groupNode, ...groupNodeOpList] }) - }; - api.post('api/model/graph?token=' + localStorage.getItem('token'), payload) - .then( - response => { - setGraph(response.data); - }) - .catch(error => { - setWarningText(error.message); - }); - } - }, [selectedWorkload, groupNode]); - - useEffect(() => { - if (selectedOp) { - api.post('api/model/graph/highlight_pattern?token=' + localStorage.getItem('token'), { - workload_id: selectedWorkload.uuid, - path: [selectedWorkload.model_path], - op_name: selectedOp, - pattern: selectedPattern, - ...((groupNode.length || groupNodeOpList.length) && { group: [...groupNode, ...groupNodeOpList] }) - }) - .then( - response => { - setGraph(response.data.graph); - groupNodeOpList.push(...response.data.groups); - }) - .catch(error => { - if (error.response.status !== 400) { - setWarningText(error.message); - } - }); - } - }, [selectedPattern]); - - return ( -
- -
- ) -}; - -class CytoGraph extends React.Component { - constructor(props) { - super(props); - this.renderCytoscapeElement = this.renderCytoscapeElement.bind(this); - } - - handleCallback = (childData) => { - switch (childData) { - case 'fit': - this.cy.fit(); - break; - case 'center': - this.cy.center(); - break; - case 'reset': - this.cy.reset(); - break; - default: - break; - } - } - - renderCytoscapeElement() { - const elements = getElements(this.props.graph); - this.cy = - cytoscape({ - container: document.getElementById('cy'), - elements, - style: [{ - selector: 'node', - style: { - 'background-color': 'data(color)', - 'border-color': 'data(border_color)', - 'border-width': '3px', - color: '#fff', - label: 'data(label)', - shape: 'round-rectangle', - 'text-valign': 'center', - 'text-halign': 'center', - width: (node) => node.data('label').length * 12, - } - }, - { - selector: 'edge', - style: { - 'font-size': '10px', - 'source-text-offset': '10px', - 'target-text-offset': '10px', - width: 3, - 'line-color': '#ccc', - 'target-arrow-color': '#ccc', - 'target-arrow-shape': 'triangle', - 'curve-style': 'taxi', - } - }, - { - selector: 'node', - css: { - 'font-family': 'IntelClearRg', - } - }, - { - selector: 'node.selected', - css: { - 'border-color': '#00c7fd' - } - }, - { - selector: 'node.hover', - css: { - 'border-color': '#B1BABF', - 'border-style': 'dashed', - } - }, - { - selector: 'node[node_type = \'group_node\']', - css: { - color: 'black' - } - }, - { - selector: 'node[highlight = \'true\']', - css: { - 'border-color': '#FEC91B' - } - } - ], - layout: { - name: 'elk', - animate: true, - elk: { - 'algorithm': 'layered', - 'elk.direction': 'DOWN' - } - } - }); - - this.cy.nodeHtmlLabel([ - { - query: 'node[node_type = "group_node"]', - halign: 'right', - valign: 'bottom', - cssClass: 'plus-sign', - tpl: (data) => '
' - } - ]); - - this.cy.on('click', (event) => { - if (event.target._private.data.node_type === 'group_node') { - this.props.setGroupNode([...this.props.groupNode, event.target._private.data.id]); - } - }); - - this.cy.on('mouseover', 'node', e => { - e.target.addClass('hover'); - }); - - this.cy.on('mouseout', 'node', e => { - e.target.removeClass('hover'); - }); - - this.cy.on('tap', 'node', e => { - this.cy.elements('node:selected').removeClass('selected'); - if (e.target._private.data.node_type === 'node') { - e.target.addClass('selected'); - this.props.setSelectedNode(e.target._private.data); - } - }); - - setTimeout(() => { - if (this.cy.elements('node[highlight = \'true\']').length) { - this.cy.reset(); - this.cy.center(this.cy.elements('node[highlight = \'true\']')[0]); - } else { - this.cy.zoom({ - level: 2.0 - }); - this.cy.center(); - } - }, 1000); - } - - componentDidUpdate(prevProps) { - if (prevProps.graph !== this.props.graph) { - this.renderCytoscapeElement(); - } - } - - componentDidMount() { - if (this.props.graph) { - this.renderCytoscapeElement(); - } - } - - collapseNode(nodeName) { - const newExpandedNodes = this.props.groupNode.filter(x => x !== nodeName); - this.props.setGroupNode(newExpandedNodes); - } - - render() { - return ( -
-
- - {!this.props.graph && -
- -
- } - {this.props.groupNode.length > 0 && -
- - - - - - - {this.props.groupNode.map(groupNode => { - return ( - - - - - ) - })} - -
Expanded groups
{groupNode.replace('node_group_', '')} this.collapseNode(groupNode)} className="clickable" tooltip="Collapse this group">✕
-
- } -
-
-
-
- ) - } -} - -class GraphButtons extends React.Component { - onTrigger = (event) => { - this.props.parentCallback(event.target.id); - event.preventDefault(); - } - - render() { - return ( -
- - - -
- ) - } -} - -const getElements = (graph) => { - const elements = []; - if (graph.nodes && graph.edges) { - graph.nodes.forEach(node => { - elements.push({ - data: { - id: node.id, - label: getLabel(node.label), - parent: node.parent, - attributes: node.attributes, - properties: node.properties, - node_type: node.node_type, - highlight: String(node.highlight), - border_color: node.node_type === 'group_node' ? '#5B69FF' : customColor[getHash(node.label)], - color: node.node_type === 'group_node' ? '#fff' : customColor[getHash(node.label)], - }, - grabbable: false, - }); - }); - graph.edges.forEach(edge => { - elements.push({ - data: { - source: edge.source, - target: edge.target, - } - }); - }); - } - return elements; -} - -function getHash(input) { - var hash = 0, len = input.length; - for (var i = 0; i < len; i++) { - hash = ((hash << 5) - hash) + input.charCodeAt(i); - hash |= 0; - } - hash = Math.abs(hash); - return hash % customColor.length; -} - diff --git a/neural_insights/gui/src/components/Graph/Graph.scss b/neural_insights/gui/src/components/Graph/Graph.scss deleted file mode 100644 index ef4aa6c4690..00000000000 --- a/neural_insights/gui/src/components/Graph/Graph.scss +++ /dev/null @@ -1,73 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -@import './../../variables.scss'; - -* { - font-family: IntelClearRg; -} - -.Graph { - #cy { - height: 90vh; - position: relative; - margin: auto; - background: #fafafa; - background-image: radial-gradient(#bebebe 1px, transparent 0); - background-size: 18px 18px; - border-radius: 0.5rem; - } - - .plus-sign { - color: white; - background-color: #5B69FF; - border-radius: 50%; - width: 25px; - height: 25px; - text-align: center; - cursor: pointer; - } - - .graph-buttons { - position: absolute; - margin-top: 6px; - z-index: 10; - float: right; - } - - .graph-button { - cursor: pointer; - margin-left: 6px; - background-color: $accent-yellow; - color: black; - border: none; - } - - .nodes-table-container { - position: absolute; - top: 50px; - left: 5px; - background-color: rgba(182, 182, 182, 0.13); - } - - .nodes-table { - font-family: IntelClearRg; - width: 200px; - } - - .header { - font-family: IntelClearBd; - text-align: left; - } -} \ No newline at end of file diff --git a/neural_insights/gui/src/components/Histogram/Histogram.js b/neural_insights/gui/src/components/Histogram/Histogram.js deleted file mode 100644 index b93ff8bde2a..00000000000 --- a/neural_insights/gui/src/components/Histogram/Histogram.js +++ /dev/null @@ -1,130 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -import React, { useEffect, useState } from 'react'; -import './Histogram.scss'; -import Plot from 'react-plotly.js'; -import { api } from './../../App'; -import Spinner from 'react-bootstrap/Spinner'; - -function Histogram({ selectedWorkload, selectedOp, histogramType, setWarningText }) { - const [histogramData, setHistogramData] = useState(null); - - useEffect(() => { - if (selectedOp.length && histogramType.length) { - setHistogramData(null); - api.post('api/diagnosis/histogram?token=' + localStorage.getItem('token'), { workload_id: selectedWorkload.uuid, op_name: selectedOp, type: histogramType }) - .then( - response => { - setHistogramData(response.data); - }) - .catch(error => { - setWarningText(error?.response?.data); - }); - } - }, [histogramType, selectedOp]); - - return ( -
-

{histogramType.charAt(0).toUpperCase() + histogramType.slice(1)} histogram

- {!histogramData && } - - {histogramData?.length === 0 &&

No histogram data for this OP.

} - - {histogramData?.length > 0 && -
-
- When you hover over the chart a menu will appear in the top right corner.
- You can zoom the chart, save it as .png file or hide channels by clicking them in the legend. -
- -
- - -
-
- } -
- ) -}; - -const getHistogramData = (histogramData) => { - const data = []; - if (histogramData.length) { - const colorPalette = generateColor(histogramData[0].histograms.length); - histogramData[0].histograms.forEach((series, index) => { - data.push( - { - x: series.data, - type: 'violin', - orientation: 'h', - side: 'negative', - y0: 'channel ' + index, - name: 'channel ' + index, - width: 100, - opacity: 0.8, - fillcolor: colorPalette[index], - hoverinfo: 'none', - line: { - width: 1, - color: series.data.length === 1 ? colorPalette[index] : '#fff', - }, - points: false, - spanmode: 'hard' - } - ); - }); - } - return data; -} - -const layout = { - height: 450, - responsive: true, - yaxis: { - autorange: 'reversed', - showgrid: true, - }, - legend: { - tracegroupgap: 0, - }, - violinmode: 'overlay', - opacity: 1, - margin: { - l: 150, - r: 50, - b: 20, - t: 30, - pad: 0 - } -}; - -const generateColor = (num) => { - const colorPalette = []; - const step = 100 / num; - for (let i = num; i > 0; --i) { - colorPalette.push(`rgb(${20 + (step * i)}, ${100 - (step * i * 0.1)}, ${200 - (step * i * 0.1)})`); - } - return colorPalette; -} - -Histogram.propTypes = {}; - -Histogram.defaultProps = {}; - -export default Histogram; diff --git a/neural_insights/gui/src/components/Histogram/Histogram.scss b/neural_insights/gui/src/components/Histogram/Histogram.scss deleted file mode 100644 index 77d121d95a4..00000000000 --- a/neural_insights/gui/src/components/Histogram/Histogram.scss +++ /dev/null @@ -1,20 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -.Histogram { - padding: 10px; - background-color: white; - border-radius: 0.5rem; - min-width: 60vw; -} \ No newline at end of file diff --git a/neural_insights/gui/src/components/ModelSummary/ModelSummary.js b/neural_insights/gui/src/components/ModelSummary/ModelSummary.js deleted file mode 100644 index 0e81aa20522..00000000000 --- a/neural_insights/gui/src/components/ModelSummary/ModelSummary.js +++ /dev/null @@ -1,53 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -import React, { useEffect, useState } from 'react'; -import './ModelSummary.scss'; -import { api } from './../../App'; -import Spinner from 'react-bootstrap/Spinner'; - -export default function ModelSummary({ selectedWorkload, setWarningText }) { - const [summary, setSummary] = useState(null); - useEffect(() => { - if (selectedWorkload) { - setSummary(null); - const payload = { - workload_id: selectedWorkload.uuid, - }; - api.post('api/model/summary?token=' + localStorage.getItem('token'), payload) - .then( - response => { - setSummary(response); - }) - .catch(error => { - setWarningText(error.message); - }); - } - }, [selectedWorkload]); - - return ( -
- {!summary && -
- -
- } -
-        
-          {summary?.data?.summary.replaceAll('\n\n', '\n')}
-        
-      
-
- ) -} \ No newline at end of file diff --git a/neural_insights/gui/src/components/ModelSummary/ModelSummary.scss b/neural_insights/gui/src/components/ModelSummary/ModelSummary.scss deleted file mode 100644 index dcfe870d316..00000000000 --- a/neural_insights/gui/src/components/ModelSummary/ModelSummary.scss +++ /dev/null @@ -1,22 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -@import './../../variables.scss'; - -.summary { - font-family: IntelOneMono; - white-space: pre; - overflow: auto; - max-height: 90vh; -} \ No newline at end of file diff --git a/neural_insights/gui/src/components/OpDetails/OpDetails.js b/neural_insights/gui/src/components/OpDetails/OpDetails.js deleted file mode 100644 index 8c1be7434f4..00000000000 --- a/neural_insights/gui/src/components/OpDetails/OpDetails.js +++ /dev/null @@ -1,133 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -import React, { useEffect, useState } from 'react'; -import './OpDetails.scss'; -import Button from 'react-bootstrap/esm/Button'; -import { api } from './../../App'; - -export default function OpDetails({ selectedWorkload, selectedOp, setHistogramType, setSelectedPattern, setWarningText }) { - const [opDetails, setOpDetails] = useState({ - "OP name": "", - "Pattern": { - "sequence": [], - "precision": "" - }, - "Weights": { - "dtype": "", - "granularity": "" - }, - "Activation": { - "dtype": "" - } - }); - - useEffect(() => { - if (selectedOp?.length) { - api.post('api/diagnosis/op_details?token=' + localStorage.getItem('token'), { workload_id: selectedWorkload.uuid, op_name: selectedOp }) - .then( - response => { - setOpDetails(response.data); - setSelectedPattern(response.data.Pattern.sequence); - setHistogramType(null); - }) - .catch(error => { - setWarningText(error.message); - }); - } - }, [selectedOp]); - - return ( -
- {selectedOp && -
-

OP details

-
- {selectedWorkload.framework !== 'PyTorch' && - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
OP name{opDetails['OP name']}
Pattern
Sequence - {opDetails.Pattern.sequence.map( - sequence => { - return {sequence} - } - )} -
Precision{opDetails.Pattern.precision}
- Weights -
Dtype{opDetails.Weights.dtype} - -
Granularity{opDetails.Weights.granularity}
- Activation -
Dtype{opDetails.Activation.dtype} - -
- } - {selectedWorkload.framework === 'PyTorch' && - <> - - - - - - - -
OP name{opDetails['OP name']}
-
- -
-
- - - } -
- } -
- ); -} diff --git a/neural_insights/gui/src/components/OpDetails/OpDetails.scss b/neural_insights/gui/src/components/OpDetails/OpDetails.scss deleted file mode 100644 index a4f8ee21345..00000000000 --- a/neural_insights/gui/src/components/OpDetails/OpDetails.scss +++ /dev/null @@ -1,26 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -.histogram-btn { - float: right; -} - -#opDetails { - height: 560px; - max-width: 40vw; -} - -.table-value { - word-break: break-all; -} \ No newline at end of file diff --git a/neural_insights/gui/src/components/OpList/OpList.js b/neural_insights/gui/src/components/OpList/OpList.js deleted file mode 100644 index 8f0639c39d7..00000000000 --- a/neural_insights/gui/src/components/OpList/OpList.js +++ /dev/null @@ -1,90 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -import React, { useEffect, useState } from 'react'; -import { api } from '../../App'; -import Table from 'react-bootstrap/Table'; -import Spinner from 'react-bootstrap/Spinner'; - -export default function OpList({ selectedWorkload, setSelectedOp, selectedOp, setWarningText }) { - const [opList, setOpList] = useState([]); - - useEffect(() => { - if (selectedWorkload) { - setOpList([]); - api.post('api/diagnosis/op_list?token=' + localStorage.getItem('token'), { workload_id: selectedWorkload.uuid }) - .then( - response => { - setOpList(response.data.sort((a, b) => b.MSE - a.MSE)); - }) - .catch(error => { - if (selectedWorkload?.status !== 'wip') { - setWarningText(error.message + ': ' + error?.response?.data); - } - }); - } - }, [selectedWorkload, selectedOp]); - - const tableContent = - opList.map(opData => { - return ( - { - setSelectedOp(opData['OP name']); - setTimeout(() => { - document.getElementById('opDetails').scrollIntoView({ behavior: 'smooth' }); - }, 500) - }}> - {opData['OP name']} - {opData['MSE'].toExponential(3)} - {typeof opList[0]['Activation Min'] !== 'undefined' && - {opData['Activation Min']?.toFixed(2)} - } - {typeof opList[0]['Activation Max'] !== 'undefined' && - {opData['Activation Max']?.toFixed(2)} - } - - ) - }); - - return ( -
- {opList.length === 0 && -
- -
- } - {opList.length > 0 && - - - - - - {typeof opList[0]['Activation Min'] !== 'undefined' && - - } - {typeof opList[0]['Activation Max'] !== 'undefined' && - - } - - - - {tableContent} - -
OP NameMSEActivation MinActivation Max
- } -
- ); -} \ No newline at end of file diff --git a/neural_insights/gui/src/components/OpList/OpList.scss b/neural_insights/gui/src/components/OpList/OpList.scss deleted file mode 100644 index 02101c1432c..00000000000 --- a/neural_insights/gui/src/components/OpList/OpList.scss +++ /dev/null @@ -1,14 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. \ No newline at end of file diff --git a/neural_insights/gui/src/components/Profiling/Profiling.js b/neural_insights/gui/src/components/Profiling/Profiling.js deleted file mode 100644 index c70545be4eb..00000000000 --- a/neural_insights/gui/src/components/Profiling/Profiling.js +++ /dev/null @@ -1,197 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -import React, { useEffect, useState, useMemo } from 'react'; -import './Profiling.scss'; -import { api } from './../../App'; -import Plot from 'react-plotly.js'; -import { getLabel } from './../Diagnosis/Diagnosis'; -import Table from 'react-bootstrap/Table'; - -export default function Profiling({ selectedWorkload, setWarningText }) { - const [profilingTable, setProfilingTable] = useState([]); - const [profilingChartData, setProfilingChartData] = useState([]); - return ( -
- - -
- ) -} - -function ProfilingTable({ selectedWorkload, profilingTable, setProfilingTable, setProfilingChartData, setWarningText }) { - - const [checked, setChecked] = useState({}); - const [sorting, setSorting] = useState({ field: 'node_name', direction: 1 }); - - useEffect(() => { - if (selectedWorkload) { - api.post('api/profiling?token=' + localStorage.getItem('token'), { workload_id: selectedWorkload.uuid }) - .then( - response => { - setProfilingTable(response.data); - setSorting({ field: 'total_execution_time', direction: 1 }); - const showOnChart = {}; - const chartData = []; - response.data.forEach((node, index) => { - if (index < 10) { - showOnChart[node.node_name] = true; - chartData.push(node); - } else { - showOnChart[node.node_name] = false; - } - }); - setChecked(showOnChart); - setProfilingChartData(chartData); - }) - .catch(error => { - setWarningText(error.message); - }); - } - }, [selectedWorkload]); - - let sortedProfiling = useMemo(() => { - let sortedTable = [...profilingTable]; - if (sorting !== null) { - sortedTable.sort((a, b) => { - if (a[sorting.field] < b[sorting.field]) { - return sorting.direction; - } - if (a[sorting.field] > b[sorting.field]) { - return -sorting.direction; - } - return 0; - }); - } - return sortedTable; - }, [sorting]); - - const requestSorting = field => { - let direction = -sorting.direction; - setSorting({ field, direction }); - }; - - const getSortingClass = (name) => { - let classes = 'header clickable'; - if (sorting.field === name) { - return classes + (sorting.direction === 1 ? ' ascending' : ' descending'); - } - return 'header clickable'; - }; - - const requestChartCheck = (nodeName, value) => { - let chartCheck = checked; - chartCheck[nodeName] = value; - setChecked(chartCheck); - const newProfilingChartData = profilingTable.filter(node => checked[node.node_name] === true); - setProfilingChartData(newProfilingChartData); - }; - - const tableContent = sortedProfiling?.map(profiling => { - return ( - - {profiling.node_name} - {profiling.accelerator_execution_time} - {profiling.cpu_execution_time} - {profiling.op_defined} - {profiling.op_run} - {profiling.total_execution_time} - - { - requestChartCheck(profiling.node_name, e.target.checked); - }} - /> - - - ); - }); - - return ( -
- - - - - - - - - - - - {tableContent} - -
requestSorting('node_name')}>Name requestSorting('accelerator_execution_time')}>Accelerator execution time [μs] requestSorting('cpu_execution_time')}>CPU execution time [μs] requestSorting('op_defined')}>Op defined requestSorting('op_run')}>Op run requestSorting('total_execution_time')}>Total execution time [μs]Show on chart
-
- ); -} - -function ProfilingChart({ profilingChartData }) { - return (
- -
) -}; - -const getChartData = (profilingData) => { - let data = []; - if (Object.keys(profilingData).length) { - const colorPalette = generateColor(profilingData.length); - profilingData.forEach((node, index) => { - data.push({ - name: getLabel(node.node_name), - x: [node.node_name], - y: [node.total_execution_time], - type: 'bar', - marker: { - color: colorPalette[index] - } - }); - }); - } - return data; -} - -const layout = { - responsive: true, - xaxis: { - title: 'Total execution time [μs]', - showticklabels: false - }, - yaxis: { - showgrid: true, - }, - legend: { - tracegroupgap: 0, - }, - opacity: 1, -}; - -const generateColor = (num) => { - const colorPalette = []; - const step = 100 / num; - for (let i = num; i > 0; --i) { - colorPalette.push(`rgb(${20 + (step * i)}, ${100 - (step * i * 0.1)}, ${200 - (step * i * 0.1)})`); - } - return colorPalette; -} - diff --git a/neural_insights/gui/src/components/Profiling/Profiling.scss b/neural_insights/gui/src/components/Profiling/Profiling.scss deleted file mode 100644 index cddbf72cdf1..00000000000 --- a/neural_insights/gui/src/components/Profiling/Profiling.scss +++ /dev/null @@ -1,31 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -.Profiling { - .data-panel { - width: 100%; - } -} - -.ascending::after { - content: '\2191'; - display: inline-block; - margin-left: 1em; -} - -.descending::after { - content: '\2193'; - display: inline-block; - margin-left: 1em; -} \ No newline at end of file diff --git a/neural_insights/gui/src/components/Warning/Warning.js b/neural_insights/gui/src/components/Warning/Warning.js deleted file mode 100644 index 29fd86d7137..00000000000 --- a/neural_insights/gui/src/components/Warning/Warning.js +++ /dev/null @@ -1,38 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -import React from 'react'; -import Alert from 'react-bootstrap/Alert'; -import Button from 'react-bootstrap/Button'; -import './Warning.scss'; - -export default function Warning({ warningText, setWarningText }) { - - if (warningText.length) { - return ( - - Error -

- {warningText} -

-
- -
-
- ); - } - return; -} diff --git a/neural_insights/gui/src/components/Warning/Warning.scss b/neural_insights/gui/src/components/Warning/Warning.scss deleted file mode 100644 index 02101c1432c..00000000000 --- a/neural_insights/gui/src/components/Warning/Warning.scss +++ /dev/null @@ -1,14 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. \ No newline at end of file diff --git a/neural_insights/gui/src/components/WorkloadDetails/WorkloadDetails.js b/neural_insights/gui/src/components/WorkloadDetails/WorkloadDetails.js deleted file mode 100644 index 38b212adf65..00000000000 --- a/neural_insights/gui/src/components/WorkloadDetails/WorkloadDetails.js +++ /dev/null @@ -1,106 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -import React, { useState } from 'react'; -import Image from 'react-bootstrap/Image'; -import Tooltip from 'react-bootstrap/Tooltip'; -import OverlayTrigger from 'react-bootstrap/OverlayTrigger'; -import './WorkloadDetails.scss'; -import { api } from '../../App'; -import { getLabel } from '../Diagnosis/Diagnosis'; -import Workloads from './../Workloads/Workloads'; - -export default function WorkloadDetails({ selectedWorkload, setWarningText, setSelectedOp }) { - const [spinner, setSpinner] = useState(true); - - let deleteWorkload = (selectedWorkload) => { - api.post('api/workloads/delete?token=' + localStorage.getItem('token'), { workload_id: selectedWorkload.uuid }) - .then( - response => { - Workloads.getWorkloads(true); - } - ) - .catch(error => { - setWarningText(error.message); - setSpinner(false); - }); - } - - const tooltipDelete = ( - - Delete this workload - - ); - - const tooltipCopy = ( - - Copy full model path - - ); - - const tooltipFullPath = ( - - {selectedWorkload?.model_path} - - ); - - return ( -
- {selectedWorkload && -
-

Details - -
{ deleteWorkload(selectedWorkload); setSelectedOp(null); }}> - (e.currentTarget.src = "icons/057a-trash-solid.svg")} - onMouseOut={e => (e.currentTarget.src = "icons/057a-trash-solid-red.svg")} - /> -
-
-

- - - - - - - - - - - - -
Framework:{selectedWorkload?.framework}
- Model path: - - -
{getLabel(selectedWorkload?.model_path)}
-
-
- {selectedWorkload?.framework === 'TensorFlow' && - -
{ navigator.clipboard.writeText(selectedWorkload.model_path) }}> - (e.currentTarget.src = "icons/146b-copy-outlined-gray.svg")} - onMouseOut={e => (e.currentTarget.src = "icons/146b-copy-outlined.svg")} - /> -
-
- } -
-
- } -
- ) -} \ No newline at end of file diff --git a/neural_insights/gui/src/components/WorkloadDetails/WorkloadDetails.scss b/neural_insights/gui/src/components/WorkloadDetails/WorkloadDetails.scss deleted file mode 100644 index 3d75f746787..00000000000 --- a/neural_insights/gui/src/components/WorkloadDetails/WorkloadDetails.scss +++ /dev/null @@ -1,25 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -@import './../../variables.scss'; - -.details-list { - width: 100%; -} - -.delete-button { - float: right; - width: 25px; - height: 25px; -} \ No newline at end of file diff --git a/neural_insights/gui/src/components/Workloads/Workloads.js b/neural_insights/gui/src/components/Workloads/Workloads.js deleted file mode 100644 index f65945589bf..00000000000 --- a/neural_insights/gui/src/components/Workloads/Workloads.js +++ /dev/null @@ -1,87 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -import React, { useEffect, useState } from 'react'; -import Button from 'react-bootstrap/esm/Button'; -import Spinner from 'react-bootstrap/Spinner'; -import './Workloads.scss'; -import moment from 'moment'; -import { api } from './../../App'; -import { io } from 'socket.io-client'; - -export default function Workloads({ setSelectedWorkload, selectedWorkload, setWarningText, setSelectedOp, setSelectedNode }) { - const [workloads, setWorkloads] = useState([]); - const [spinner, setSpinner] = useState(true); - - let socket = io('/'); - socket.on('Config update', data => { - getWorkloads(false); - }); - - useEffect(() => { - getWorkloads(true); - }, []); - - let getWorkloads = (changeSelectedWorkload) => { - api.get('api/workloads?token=' + localStorage.getItem('token')) - .then( - response => { - if (changeSelectedWorkload) { - setSelectedWorkload(response.data.workloads[0]); - } - setWorkloads(response.data.workloads); - setSpinner(false); - } - ) - .catch(error => { - setWarningText(error.message); - setSpinner(false); - }); - } - - let workloadsList = workloads.map(workload => { - return ( -
{ setSelectedWorkload(workload); setSelectedOp(null); setSelectedNode(null) }}> - -
- ); - }); - - return ( -
- {workloadsList.length > 0 && -
-

Workloads

- {workloadsList} -
- } - {workloadsList.length === 0 && -
-

Neural Insights

-

Run diagnosis or profiling process to see workloads on this page.

-
- } - {spinner && -
- -
- } -
- ) - -} \ No newline at end of file diff --git a/neural_insights/gui/src/components/Workloads/Workloads.scss b/neural_insights/gui/src/components/Workloads/Workloads.scss deleted file mode 100644 index 0e36aae295b..00000000000 --- a/neural_insights/gui/src/components/Workloads/Workloads.scss +++ /dev/null @@ -1,24 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -@import './../../variables.scss'; - -.active { - background-color: $accent-yellow !important; -} - -.date { - color: $dark-gray; - font-size: 80%; -} diff --git a/neural_insights/gui/src/index.js b/neural_insights/gui/src/index.js deleted file mode 100644 index 62b5c4f6dc8..00000000000 --- a/neural_insights/gui/src/index.js +++ /dev/null @@ -1,30 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -import React from 'react'; -import ReactDOM from 'react-dom/client'; -import './index.scss'; -import App from './App'; -import reportWebVitals from './reportWebVitals'; -import 'bootstrap/dist/css/bootstrap.min.css'; - -const root = ReactDOM.createRoot(document.getElementById('root')); -root.render( - -); - -// If you want to start measuring performance in your app, pass a function -// to log results (for example: reportWebVitals(console.log)) -// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals -reportWebVitals(); diff --git a/neural_insights/gui/src/index.scss b/neural_insights/gui/src/index.scss deleted file mode 100644 index deff71665a5..00000000000 --- a/neural_insights/gui/src/index.scss +++ /dev/null @@ -1,22 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -@import './variables.scss'; - -body { - margin: 0; - font-family: IntelClearRg; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} \ No newline at end of file diff --git a/neural_insights/gui/src/logo.svg b/neural_insights/gui/src/logo.svg deleted file mode 100644 index 9dfc1c058ce..00000000000 --- a/neural_insights/gui/src/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/neural_insights/gui/src/reportWebVitals.js b/neural_insights/gui/src/reportWebVitals.js deleted file mode 100644 index df96eead5e2..00000000000 --- a/neural_insights/gui/src/reportWebVitals.js +++ /dev/null @@ -1,28 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -const reportWebVitals = onPerfEntry => { - if (onPerfEntry && onPerfEntry instanceof Function) { - import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { - getCLS(onPerfEntry); - getFID(onPerfEntry); - getFCP(onPerfEntry); - getLCP(onPerfEntry); - getTTFB(onPerfEntry); - }); - } -}; - -export default reportWebVitals; diff --git a/neural_insights/gui/src/setupTests.js b/neural_insights/gui/src/setupTests.js deleted file mode 100644 index 63ff5229545..00000000000 --- a/neural_insights/gui/src/setupTests.js +++ /dev/null @@ -1,20 +0,0 @@ -// -* - coding: utf - 8 -* - -// Copyright(c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0(the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// jest-dom adds custom jest matchers for asserting on DOM nodes. -// allows you to do things like: -// expect(element).toHaveTextContent(/react/i) -// learn more: https://github.com/testing-library/jest-dom -import '@testing-library/jest-dom'; diff --git a/neural_insights/gui/src/variables.scss b/neural_insights/gui/src/variables.scss deleted file mode 100644 index 30e4ffc39ed..00000000000 --- a/neural_insights/gui/src/variables.scss +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright (c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -//== Core Intel Colors -// -//## Colors defined in the corporate brand guidelines. -//## https://brandportal.intel.com/us/en/style/color - -$red: #ed1c24; // Intel red -$dark-orange: #fc4c02; -$orange: #FFA300; // Intel orange -$yellow: #F3D54E; // Intel yellow - -$dark-blue: #005B85; // Intel dark blue -$classic-blue5: #00285A; -$classic-blue4: #004A86; -$classic-blue3: #0068B5; -$blue: #0095CA; // Intel blue -$energy-blue: #00C7FD; -$light-blue: #7BDEFF; // Intel light blue -$pale-blue: #B4F0FF; // Intel pale blue -$accent-yellow: #FEC91B; - -$green: #8BAE46; // Intel green -$light-green: #D7F3A2; -$dark-green: #515A3D; - -$light-gray: #ececec; // no change -$gray: #939598; // no change -$dark-gray: #53565a; // no change - -$loop_color_good: #a6ce39; -$loop_color_neutral: #fdb813; -$loop_color_bad: #ed1b24; - -//== Extended Intel Colors -// -//## Color not included in the brand guidelines but approved for internal usage. - -$white: #ffffff; -$black: #000000; - -$lighter-red-selected: #d2b1ac; -$lighter-red: #ffe1dd; -$light-red: #ff6450; -$dark-red: #931c1a; -$hover-red: $light-red; -$tapped-red: $dark-red; - -$lighter-yellow: #fff2d0; - -$lighter-blue: $pale-blue; -$hover-blue: $light-blue; -$tapped-blue: $dark-blue; - -$lighter-gray1: #f7f8f9; -$lighter-gray2: #edeff0; -$lighter-gray3: #e1e5e7; -$lighter-gray3-5: #CCCCCC; -$lighter-gray4: #737373; -$lighter-gray: $lighter-gray2; -$darker-gray: #333; -$darkest-gray: #111; -$hover-gray: $lighter-gray; -$tapped-gray: $light-gray; - -/* Intel Clear font */ - -@font-face { - font-family: IntelOneRg; - src: url('/assets/fonts/intelone-display-regular.ttf'); -} - -@font-face { - font-family: IntelOneLt; - src: url('/assets/fonts/intelone-display-light.ttf'); -} - -@font-face { - font-family: IntelOneBd; - src: url('/assets/fonts/intelone-display-bold.ttf'); -} - -@font-face { - font-family: IntelClearRg; - src: url('/assets/fonts/IntelClear_Rg.ttf'); -} - -@font-face { - font-family: IntelClearLt; - src: url('/assets/fonts/IntelClear_Lt.ttf'); -} - -@font-face { - font-family: IntelClearBd; - src: url('/assets/fonts/IntelClear_Bd.ttf'); -} - -@font-face { - font-family: IntelClearBd; - src: url('/assets/fonts/IntelClear_Bd.ttf'); -} - -@font-face { - font-family: IntelOneMono; - src: url('/assets/fonts/intelone-mono-font-family-regular.ttf'); -} \ No newline at end of file diff --git a/neural_insights/main.py b/neural_insights/main.py deleted file mode 100644 index e139cbd38fa..00000000000 --- a/neural_insights/main.py +++ /dev/null @@ -1,56 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""WSGI Web Server.""" -import sys - -import gevent.monkey - -already_patched = gevent.monkey.is_module_patched("threading") -if not already_patched: - can_patch_ssl = "ssl" not in sys.modules - gevent.monkey.patch_all(ssl=can_patch_ssl) - -from neural_insights.utils.exceptions import NotFoundException # noqa: E402 -from neural_insights.utils.logger import change_log_level, log # noqa: E402 -from neural_insights.web.configuration import Configuration # noqa: E402 -from neural_insights.web.server import run_server # noqa: E402 - - -def main() -> None: - """Get parameters and initialize server.""" - try: - configuration = Configuration() - except NotFoundException as e: - print(str(e)) - sys.exit(1) - - change_log_level(configuration.log_level) - - log.info("Neural Insights Server started.\n") - - if configuration.allow_insecure_connections: - log.warning( - "Running in insecure mode.\n" "Everyone in your network may attempt to access this server.\n", - ) - - log.info(f"Open address {configuration.get_url()}") - configuration.dump_token_to_file() - - run_server(configuration) - - -if __name__ == "__main__": - main() diff --git a/neural_insights/ni.py b/neural_insights/ni.py deleted file mode 100644 index a7e678b40c2..00000000000 --- a/neural_insights/ni.py +++ /dev/null @@ -1,71 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Neural Insights main class.""" -from os import PathLike -from typing import Optional - -from neural_insights.components.workload_manager.quantization_workload import QuantizationWorkload -from neural_insights.components.workload_manager.workload import Workload -from neural_insights.components.workload_manager.workload_manager import WorkloadManager -from neural_insights.utils.consts import WorkloadModes - - -class NeuralInsights: - def __init__(self, workdir_location: PathLike) -> None: - self.workdir_location: PathLike = workdir_location - - def add_workload( - self, - workload_location: str, - model_path: str, - workload_mode: WorkloadModes, - workload_name: str, - model_summary_file: Optional[str], - ) -> str: - """Add workload to Neural Insights.""" - if workload_mode == WorkloadModes.QUANTIZATION: - workload = QuantizationWorkload() - else: - workload = Workload() - workload.workload_name = workload_name - workload.workload_location = workload_location - workload.mode = workload_mode - workload.model_path = model_path - workload.model_summary_file = model_summary_file - - workload_manager = WorkloadManager(workdir_location=self.workdir_location) - workload_manager.add_workload(workload) - - return workload.uuid - - def update_workload_status(self, workload_uuid: str, status: str) -> None: - """Update status of specified workload.""" - workload_manager = WorkloadManager(workdir_location=self.workdir_location) - workload_manager.update_workload_status(workload_uuid, status) - - def update_workload_accuracy_data( - self, - workload_uuid: str, - baseline_accuracy: float, - optimized_accuracy: float, - ) -> None: - """Update accuracy data of specified workload.""" - workload_manager = WorkloadManager(workdir_location=self.workdir_location) - workload_manager.update_workload_accuracy_data( - workload_uuid, - baseline_accuracy, - optimized_accuracy, - ) diff --git a/neural_insights/requirements.txt b/neural_insights/requirements.txt deleted file mode 100644 index 0bceba9e079..00000000000 --- a/neural_insights/requirements.txt +++ /dev/null @@ -1,9 +0,0 @@ -cryptography -Flask -Flask-Cors -Flask-SocketIO -gevent -gevent-websocket -neural_compressor>=2.2 -pywin32; sys_platform != 'linux' -torchinfo diff --git a/neural_insights/test/__init__.py b/neural_insights/test/__init__.py deleted file mode 100644 index 03d9d9791d4..00000000000 --- a/neural_insights/test/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The test package contains all test for Neural Insights.""" diff --git a/neural_insights/test/components/__init__.py b/neural_insights/test/components/__init__.py deleted file mode 100644 index 9ed2e1ca323..00000000000 --- a/neural_insights/test/components/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The components package contains all test for Neural Insights components.""" diff --git a/neural_insights/test/components/graph/__init__.py b/neural_insights/test/components/graph/__init__.py deleted file mode 100644 index 490f2150fb7..00000000000 --- a/neural_insights/test/components/graph/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The graph package contains test for Neural Insights graph component.""" diff --git a/neural_insights/test/components/graph/test_attribute.py b/neural_insights/test/components/graph/test_attribute.py deleted file mode 100644 index 36d53ad1f90..00000000000 --- a/neural_insights/test/components/graph/test_attribute.py +++ /dev/null @@ -1,62 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Test Attribute.""" - -import unittest -import uuid - -from neural_insights.components.graph.attribute import Attribute -from neural_insights.utils.json_serializer import JsonSerializer - - -def _get_random_string() -> str: - """Create random string to be used.""" - return uuid.uuid4().hex - - -class TestAttribute(unittest.TestCase): - """Test Attribute class.""" - - def test_setting_parameters(self) -> None: - """Test if parameters are correctly set.""" - name = _get_random_string() - attribute_type = _get_random_string() - value = _get_random_string() - - attribute = Attribute(name=name, attribute_type=attribute_type, value=value) - - self.assertEqual(name, attribute.name) - self.assertEqual(attribute_type, attribute.attribute_type) - self.assertEqual(value, attribute.value) - - def test_serialization(self) -> None: - """Test if Attribute is serialized as expected.""" - name = _get_random_string() - attribute_type = _get_random_string() - value = _get_random_string() - - attribute = Attribute(name=name, attribute_type=attribute_type, value=value) - - expected_serialized_object = { - "name": name, - "attribute_type": attribute_type, - "value": value, - } - serialized = JsonSerializer.serialize_item(attribute) - self.assertEqual(expected_serialized_object, serialized) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_insights/test/components/graph/test_collapser.py b/neural_insights/test/components/graph/test_collapser.py deleted file mode 100644 index 8cfef1c5e0f..00000000000 --- a/neural_insights/test/components/graph/test_collapser.py +++ /dev/null @@ -1,147 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Test Collapser.""" - -import unittest -from typing import List - -from neural_insights.components.graph.collapser import Collapser -from neural_insights.components.graph.graph import Graph -from neural_insights.components.graph.node import GroupNode, Node - - -def _create_simple_node(name: str, groups: List[str]) -> Node: - """Create Node.""" - return Node( - id=name, - label=name, - groups=groups, - ) - - -def _create_group_node(group_name: str) -> GroupNode: - """Create Node.""" - node_name = f"node_group_{group_name}" - return GroupNode( - id=node_name, - group_name=group_name, - ) - - -class TestCollapser(unittest.TestCase): - """Test Collapser class.""" - - def test_collapsing_with_all_groups_expanded(self) -> None: - """Test that no collapsing will happen when all groups are expanded.""" - source = self._get_source_graph() - - collapser = Collapser(["a", "a:b", "a:b:c"]) - collapsed = collapser.collapse(graph=source) - - self.assertEqual(source, collapsed) - - def test_collapsing_all_groups(self) -> None: - """Test that no collapsing will happen when all groups are expanded.""" - source = self._get_source_graph() - - expected = Graph() - expected.add_node(_create_simple_node("input", [])) - expected.add_node(_create_group_node("a")) - expected.add_node(_create_simple_node("e", ["e"])) - expected.add_node(_create_simple_node("output", [])) - expected.add_edge("input", "node_group_a") - expected.add_edge("node_group_a", "output") - expected.add_edge("input", "e") - expected.add_edge("e", "output") - - collapser = Collapser([]) - collapsed = collapser.collapse(graph=source) - - self.assertEqual(expected, collapsed) - - def test_expanding_all_groups(self) -> None: - """Test that no collapsing will happen when all groups are expanded.""" - source = self._get_source_graph() - - collapser = Collapser(["node_group_a", "node_group_a:b", "node_group_a:b:c"]) - collapsed = collapser.collapse(graph=source) - - self.assertEqual(source, collapsed) - - def test_collapsing_external_group(self) -> None: - """Test that no collapsing will happen when all groups are expanded.""" - source = self._get_source_graph() - - expected = Graph() - expected.add_node(_create_simple_node("input", [])) - expected.add_node(_create_simple_node("a:b", ["a"])) - expected.add_node(_create_group_node("a:b")) - expected.add_node(_create_simple_node("e", ["e"])) - expected.add_node(_create_simple_node("output", [])) - expected.add_edge("input", "a:b") - expected.add_edge("a:b", "node_group_a:b") - expected.add_edge("node_group_a:b", "output") - expected.add_edge("input", "e") - expected.add_edge("e", "output") - - collapser = Collapser(["node_group_a"]) - collapsed = collapser.collapse(graph=source) - - self.assertEqual(expected, collapsed) - - def test_collapsing_internal_group(self) -> None: - """Test that no collapsing will happen when all groups are expanded.""" - source = self._get_source_graph() - - expected = Graph() - expected.add_node(_create_simple_node("input", [])) - expected.add_node(_create_group_node("a")) - expected.add_node(_create_simple_node("e", ["e"])) - expected.add_node(_create_simple_node("output", [])) - expected.add_edge("input", "node_group_a") - expected.add_edge("node_group_a", "output") - expected.add_edge("input", "e") - expected.add_edge("e", "output") - - collapser = Collapser(["node_group_a:b"]) - collapsed = collapser.collapse(graph=source) - - self.assertEqual(expected, collapsed) - - def _get_source_graph(self) -> Graph: - """Return a graph with a well-known contents.""" - graph = Graph() - graph.add_node(_create_simple_node("input", [])) - graph.add_node(_create_simple_node("a:b", ["a"])) - graph.add_node(_create_simple_node("a:b:c1", ["a", "a:b"])) - graph.add_node(_create_simple_node("a:b:c2", ["a", "a:b"])) - graph.add_node(_create_simple_node("a:b:c:d", ["a", "a:b", "a:b:c"])) - graph.add_node(_create_simple_node("e", ["e"])) - graph.add_node(_create_simple_node("output", [])) - - graph.add_edge("input", "a:b") - graph.add_edge("a:b", "a:b:c1") - graph.add_edge("a:b", "a:b:c2") - graph.add_edge("a:b:c1", "a:b:c:d") - graph.add_edge("a:b:c2", "a:b:c:d") - graph.add_edge("a:b:c:d", "output") - graph.add_edge("input", "e") - graph.add_edge("e", "output") - - return graph - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_insights/test/components/graph/test_edge.py b/neural_insights/test/components/graph/test_edge.py deleted file mode 100644 index 36663cf3522..00000000000 --- a/neural_insights/test/components/graph/test_edge.py +++ /dev/null @@ -1,72 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Test Edge.""" - -import unittest -import uuid - -from neural_insights.components.graph.edge import Edge -from neural_insights.components.graph.node import Node -from neural_insights.utils.json_serializer import JsonSerializer - - -def _get_random_string() -> str: - """Create random string to be used.""" - return uuid.uuid4().hex - - -def _get_random_node() -> Node: - """Create a Node with random values.""" - return Node(id=_get_random_string(), label=_get_random_string()) - - -class TestEdge(unittest.TestCase): - """Test Edge class.""" - - def test_setting_parameters(self) -> None: - """Test if parameters are correctly set.""" - source_node = _get_random_node() - target_node = _get_random_node() - - edge = Edge( - source=source_node, - target=target_node, - ) - - self.assertEqual(source_node, edge._source) - self.assertEqual(source_node.id, edge.source) - self.assertEqual(target_node, edge._target) - self.assertEqual(target_node.id, edge.target) - - def test_serialization(self) -> None: - """Test if Edge is serialized as expected.""" - source_node = _get_random_node() - target_node = _get_random_node() - - edge = Edge( - source=source_node, - target=target_node, - ) - - expected_serialized_object = { - "source": source_node.id, - "target": target_node.id, - } - serialized = JsonSerializer.serialize_item(edge) - self.assertEqual(expected_serialized_object, serialized) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_insights/test/components/graph/test_graph.py b/neural_insights/test/components/graph/test_graph.py deleted file mode 100644 index d9ef610b520..00000000000 --- a/neural_insights/test/components/graph/test_graph.py +++ /dev/null @@ -1,182 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Test Graph classes.""" - -import unittest -import uuid -from typing import List - -from neural_insights.components.graph.graph import Graph -from neural_insights.components.graph.node import Node - - -def _get_random_string() -> str: - """Create random string to be used.""" - return uuid.uuid4().hex - - -def _get_random_node() -> Node: - """Create a Node with random values.""" - return Node(id=_get_random_string(), label=_get_random_string()) - - -def _get_fake_graph() -> Graph: - """Create graph with fake data.""" - node_1 = Node(id="node_1", label="Input") - node_2 = Node(id="node_2", label="SomeNode") - node_3 = Node(id="node_3", label="SomeNode") - node_4 = Node(id="node_4", label="SomeNode") - node_5 = Node(id="node_5", label="Softmax") - - graph = Graph() - graph.add_node(node_1) - graph.add_node(node_2) - graph.add_node(node_3) - graph.add_node(node_4) - graph.add_node(node_5) - - graph.add_edge(source_id=node_1.id, target_id=node_2.id) - graph.add_edge(source_id=node_1.id, target_id=node_3.id) - graph.add_edge(source_id=node_1.id, target_id=node_4.id) - graph.add_edge(source_id=node_2.id, target_id=node_5.id) - graph.add_edge(source_id=node_3.id, target_id=node_5.id) - graph.add_edge(source_id=node_4.id, target_id=node_5.id) - - return graph - - -def _get_fake_sequential_graph() -> Graph: - """Create graph with fake data.""" - node_1 = Node(id="node_1", label="Input") - node_2 = Node(id="node_2", label="Conv2D") - node_3 = Node(id="node_3", label="AddBias") - node_4 = Node(id="node_4", label="ReLU") - node_5 = Node(id="node_5", label="Softmax") - - graph = Graph() - graph.add_node(node_1) - graph.add_node(node_2) - graph.add_node(node_3) - graph.add_node(node_4) - graph.add_node(node_5) - - graph.add_edge(source_id=node_1.id, target_id=node_2.id) - graph.add_edge(source_id=node_2.id, target_id=node_3.id) - graph.add_edge(source_id=node_3.id, target_id=node_4.id) - graph.add_edge(source_id=node_4.id, target_id=node_5.id) - - return graph - - -class TestGraph(unittest.TestCase): - """Test Graph class.""" - - def test_empty_graph_has_no_nodes(self) -> None: - """Test if empty graph has no nodes.""" - graph = Graph() - self.assertEqual([], graph.nodes) - - def test_empty_graph_has_no_edges(self) -> None: - """Test if empty graph has no edges.""" - graph = Graph() - self.assertEqual([], graph.edges) - - def test_graph_with_one_node_returns_only_one_node(self) -> None: - """Test if empty graph with one node returns it correctly.""" - node = _get_random_node() - graph = Graph() - graph.add_node(node) - - self.assertEqual([node], graph.nodes) - - def test_adding_edge_when_no_nodes_does_not_add_an_adge(self) -> None: - """Test if adding an edge to empty graph fails as expected.""" - source_id = _get_random_string() - target_id = _get_random_string() - - graph = Graph() - result = graph.add_edge(source_id=source_id, target_id=target_id) - - self.assertEqual(False, result) - self.assertEqual([], graph.edges) - - def test_adding_edge_between_nodes_works(self) -> None: - """Test adding an edge.""" - source = _get_random_node() - target = _get_random_node() - - graph = Graph() - graph.add_node(source) - graph.add_node(target) - result = graph.add_edge(source_id=source.id, target_id=target.id) - - self.assertEqual(True, result) - - edges = graph.edges - self.assertEqual(1, len(edges)) - - edge = edges[0] - self.assertEqual(source, edge._source) - self.assertEqual(target, edge._target) - - def test_comparing_to_something_else_fails(self) -> None: - """Test if comparing Graph to something other fails.""" - with self.assertRaises(NotImplementedError): - Graph() == 1 - - def test_highlight_pattern(self) -> None: - """Test highlight_pattern.""" - graph = _get_fake_sequential_graph() - op_name = "node_2" - pattern = ["Conv2D", "AddBias", "ReLU"] - - graph.highlight_pattern(op_name, pattern) - - self.assertFalse(graph.get_node("node_1").highlight) - self.assertTrue(graph.get_node("node_2").highlight) - self.assertTrue(graph.get_node("node_3").highlight) - self.assertTrue(graph.get_node("node_4").highlight) - self.assertFalse(graph.get_node("node_5").highlight) - - def test_get_multiple_target_nodes(self) -> None: - """Test getting multiple target nodes using get_target_nodes.""" - graph = _get_fake_graph() - result = [node.id for node in graph.get_target_nodes("node_1")] - - expected = ["node_2", "node_3", "node_4"] - - self.assertListEqual(result, expected) - - def test_get_single_target_node(self) -> None: - """Test getting single target node using get_target_nodes.""" - graph = _get_fake_graph() - result = [node.id for node in graph.get_target_nodes("node_3")] - - expected = ["node_5"] - - self.assertListEqual(result, expected) - - def test_get_target_node_for_last_node(self) -> None: - """Test getting target node for last node using get_target_nodes.""" - graph = _get_fake_graph() - result = [node.id for node in graph.get_target_nodes("node_5")] - - expected: List[str] = [] - - self.assertListEqual(result, expected) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_insights/test/components/graph/test_graph_reader.py b/neural_insights/test/components/graph/test_graph_reader.py deleted file mode 100644 index 05d03acd063..00000000000 --- a/neural_insights/test/components/graph/test_graph_reader.py +++ /dev/null @@ -1,61 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Test Graph Reader.""" - -import unittest -from unittest.mock import MagicMock, patch - -from neural_insights.components.graph.graph import Graph -from neural_insights.components.graph.graph_reader import GraphReader - - -class TestGraphReader(unittest.TestCase): - """Test GraphReader class.""" - - @patch("neural_insights.components.graph.graph_reader.Collapser") - @patch("neural_insights.components.graph.graph_reader.ModelRepository") - def test_read( - self, - mocked_model_repository: MagicMock, - mocked_collapser: MagicMock, - ) -> None: - """Test read.""" - model_path = "/path/to/model.file" - expanded_groups = ["a", "b", "a/c"] - - model_graph = Graph() - collapsed_graph = Graph() - - mocked_model = MagicMock("neural_insights.components.model.Model").return_value - mocked_model.get_model_graph.return_value = model_graph - - mocked_model_repository.return_value.get_model.return_value = mocked_model - - mocked_collapser.return_value.collapse.return_value = collapsed_graph - - graph_reader = GraphReader() - self.assertIs(collapsed_graph, graph_reader.read(model_path, expanded_groups)) - - mocked_model_repository.assert_called_once() - mocked_model_repository.return_value.get_model.assert_called_once_with(model_path) - - mocked_model.get_model_graph.assert_called_once() - - mocked_collapser.assert_called_once_with(expanded_groups) - mocked_collapser.return_value.collapse.assert_called_once_with(model_graph) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_insights/test/components/graph/test_node.py b/neural_insights/test/components/graph/test_node.py deleted file mode 100644 index f99a42cb472..00000000000 --- a/neural_insights/test/components/graph/test_node.py +++ /dev/null @@ -1,43 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Test Node.""" - -import unittest -import uuid - -from neural_insights.components.graph.node import Node - - -def _get_random_string() -> str: - """Create random string to be used.""" - return uuid.uuid4().hex - - -class TestNode(unittest.TestCase): - """Test Node class.""" - - def test_setting_parameters(self) -> None: - """Test if parameters are correctly set.""" - id = _get_random_string() - label = _get_random_string() - - node = Node(id=id, label=label) - - self.assertEqual(id, node.id) - self.assertEqual(label, node.label) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_insights/test/components/model/__init__.py b/neural_insights/test/components/model/__init__.py deleted file mode 100644 index 4a959eb5618..00000000000 --- a/neural_insights/test/components/model/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The model package contains all test for Neural Insights Model component.""" diff --git a/neural_insights/test/components/model/onnx/__init__.py b/neural_insights/test/components/model/onnx/__init__.py deleted file mode 100644 index d263bd4a8f1..00000000000 --- a/neural_insights/test/components/model/onnx/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The onnx package contains all test for Neural Insights Model onnx component.""" diff --git a/neural_insights/test/components/model/onnx/test_model.py b/neural_insights/test/components/model/onnx/test_model.py deleted file mode 100644 index 839d611173b..00000000000 --- a/neural_insights/test/components/model/onnx/test_model.py +++ /dev/null @@ -1,119 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Test Onnx Model.""" - -import unittest -from unittest.mock import MagicMock, call, patch - -from neural_insights.components.graph.graph import Graph -from neural_insights.components.model.onnxrt.model import ( - OnnxrtModel, - remove_number_of_samples_from_shape, -) -from neural_insights.utils.consts import Frameworks - - -class TestOnnxrtModel(unittest.TestCase): - """Test OnnxrtModel class.""" - - def test_get_framework_name(self) -> None: - """Test getting correct framework name.""" - self.assertEqual(Frameworks.ONNX.value, OnnxrtModel.get_framework_name()) - - def test_supports_correct_path(self) -> None: - """Test getting correct framework name.""" - self.assertTrue(OnnxrtModel.supports_path("/path/to/model.onnx")) - - def test_supports_incorrect_path(self) -> None: - """Test getting correct framework name.""" - self.assertFalse(OnnxrtModel.supports_path("/path/to/model.pb")) - - @patch("neural_insights.components.model.onnxrt.model.check_module") - def test_guard_requirements_installed(self, mocked_check_module: MagicMock) -> None: - """Test guard_requirements_installed.""" - model = OnnxrtModel("/path/to/model.onnx") - - model.guard_requirements_installed() - - mocked_check_module.assert_has_calls([call("onnx"), call("onnxruntime")]) - - @patch("neural_insights.components.model.onnxrt.model.check_module") - def test_get_input_nodes(self, mocked_check_module: MagicMock) -> None: - """Test getting input nodes.""" - model = OnnxrtModel("/path/to/model.onnx") - self.assertIsNone(model.get_input_nodes()) - - @patch("neural_insights.components.model.onnxrt.model.check_module") - def test_get_output_nodes(self, mocked_check_module: MagicMock) -> None: - """Test getting output nodes.""" - model = OnnxrtModel("/path/to/model.onnx") - self.assertIsNone(model.get_output_nodes()) - - @patch("neural_insights.components.model.onnxrt.model.check_module") - def test_get_input_and_output_nodes(self, mocked_check_module: MagicMock) -> None: - """Test getting input nodes.""" - model = OnnxrtModel("/path/to/model.onnx") - self.assertIsNone(model.get_input_nodes()) - self.assertIsNone(model.get_output_nodes()) - - def test_ensure_supported_path(self) -> None: - """Test ensure_supported_path.""" - with self.assertRaisesRegex( - AttributeError, - "Model path: /path/to/model.pb is not supported by " - "neural_insights.components.model.onnxrt.model.OnnxrtModel class.", - ): - OnnxrtModel("/path/to/model.pb") - - @patch( - "neural_insights.components.model.onnxrt.model.OnnxrtReader", - autospec=True, - ) - def test_get_model_graph(self, mocked_onnxrt_graph_reader: MagicMock) -> None: - """Test getting Graph of a model.""" - expected = Graph() - - mocked_onnxrt_graph_reader.return_value.read.return_value = expected - - model = OnnxrtModel("/path/to/model.onnx") - - self.assertEqual(expected, model.get_model_graph()) - - mocked_onnxrt_graph_reader.assert_called_once_with(model) - - def test_shape_elements_order(self) -> None: - """Test getting shape elements order.""" - model = OnnxrtModel("/path/to/model.onnx") - self.assertListEqual(model.shape_elements_order, ["channels", "height", "width"]) - - def test_remove_number_of_samples_from_shape(self) -> None: - """Test removing number of samples from shape.""" - shape = "1,3,224,224" - actual = remove_number_of_samples_from_shape(shape) - - expected = "3,224,224" - self.assertEqual(expected, actual) - - def test_remove_number_of_samples_from_standard_shape(self) -> None: - """Test removing number of samples from shape.""" - shape = "1,2,3" - actual = remove_number_of_samples_from_shape(shape) - - expected = "1,2,3" - self.assertEqual(expected, actual) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_insights/test/components/model/tensorflow/__init__.py b/neural_insights/test/components/model/tensorflow/__init__.py deleted file mode 100644 index 95989bccc51..00000000000 --- a/neural_insights/test/components/model/tensorflow/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The tensorflow package contains all test for Neural Insights Model tensorflow component.""" diff --git a/neural_insights/test/components/model/tensorflow/test_frozen_pb.py b/neural_insights/test/components/model/tensorflow/test_frozen_pb.py deleted file mode 100644 index a1a093bc8cd..00000000000 --- a/neural_insights/test/components/model/tensorflow/test_frozen_pb.py +++ /dev/null @@ -1,215 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Test frozen pb Model.""" - -import unittest -from typing import List -from unittest.mock import MagicMock, patch - -from neural_insights.components.graph.graph import Graph -from neural_insights.components.graph.node import Node -from neural_insights.components.model.domain import Domain -from neural_insights.components.model.tensorflow.frozen_pb import FrozenPbModel -from neural_insights.utils.consts import DomainFlavours, Domains, Frameworks - - -class TestFrozenPbModel(unittest.TestCase): - """Test FrozenPbModel class.""" - - def setUp(self) -> None: - """Prepare environment.""" - super().setUp() - - get_model_type_patcher = patch( - "neural_insights.components.model.model_type_getter.nc_get_model_type", - ) - self.addCleanup(get_model_type_patcher.stop) - get_model_type_mock = get_model_type_patcher.start() - get_model_type_mock.side_effect = self._get_model_type - - nc_tensorflow_model_patcher = patch( - "neural_insights.components.model.tensorflow.model.NCModel", - ) - self.addCleanup(nc_tensorflow_model_patcher.stop) - nc_model_instance_mock = nc_tensorflow_model_patcher.start() - nc_model_instance_mock.return_value.input_node_names = [ - "first input node", - "second input node", - ] - nc_model_instance_mock.return_value.output_node_names = [ - "first output node", - "second output node", - ] - - def _get_model_type(self, path: str) -> str: - """Return model type for well known paths.""" - if "/path/to/frozen_pb.pb" == path: - return "frozen_pb" - raise ValueError() - - def test_get_framework_name(self) -> None: - """Test getting correct framework name.""" - self.assertEqual(Frameworks.TF.value, FrozenPbModel.get_framework_name()) - - def test_supports_correct_path(self) -> None: - """Test getting correct framework name.""" - self.assertTrue(FrozenPbModel.supports_path("/path/to/frozen_pb.pb")) - - def test_supports_incorrect_path(self) -> None: - """Test getting correct framework name.""" - self.assertFalse(FrozenPbModel.supports_path("/path/to/model.txt")) - - @patch("neural_insights.components.model.tensorflow.model.check_module") - def test_guard_requirements_installed(self, mocked_check_module: MagicMock) -> None: - """Test guard_requirements_installed.""" - model = FrozenPbModel("/path/to/frozen_pb.pb") - - model.guard_requirements_installed() - - mocked_check_module.assert_called_once_with("tensorflow") - - def test_get_input_nodes(self) -> None: - """Test getting input nodes.""" - model = FrozenPbModel("/path/to/frozen_pb.pb") - self.assertEqual(["first input node", "second input node"], model.get_input_nodes()) - - def test_get_output_nodes(self) -> None: - """Test getting output nodes.""" - model = FrozenPbModel("/path/to/frozen_pb.pb") - self.assertEqual( - ["first output node", "second output node", "custom"], - model.get_output_nodes(), - ) - - def test_get_input_and_output_nodes(self) -> None: - """Test getting input nodes.""" - model = FrozenPbModel("/path/to/frozen_pb.pb") - self.assertEqual(["first input node", "second input node"], model.get_input_nodes()) - self.assertEqual( - ["first output node", "second output node", "custom"], - model.get_output_nodes(), - ) - - @patch( - "neural_insights.components.model.tensorflow.model.TensorflowReader", - autospec=True, - ) - def test_get_model_graph(self, mocked_tensorflow_graph_reader: MagicMock) -> None: - """Test getting Graph of a model.""" - expected = Graph() - - mocked_tensorflow_graph_reader.return_value.read.return_value = expected - - model = FrozenPbModel("/path/to/frozen_pb.pb") - - self.assertEqual(expected, model.get_model_graph()) - - mocked_tensorflow_graph_reader.assert_called_once_with(model) - - def test_domain_object_detection_domain(self) -> None: - """Test getting domain of a model.""" - self.assert_model_domain_matches_expected( # pylint: disable=E1120 - node_names=["boxes", "scores", "classes"], - expected_domain=Domains.OBJECT_DETECTION.value, - expected_domain_flavour=DomainFlavours.NONE.value, - ) - - def test_domain_object_detection_domain_ssd(self) -> None: - """Test getting domain of a model.""" - self.assert_model_domain_matches_expected( # pylint: disable=E1120 - node_names=["bboxes", "scores", "classes", "ssd"], - expected_domain=Domains.OBJECT_DETECTION.value, - expected_domain_flavour=DomainFlavours.SSD.value, - ) - - def test_domain_object_detection_domain_yolo(self) -> None: - """Test getting domain of a model.""" - self.assert_model_domain_matches_expected( # pylint: disable=E1120 - node_names=["boxes", "yolo"], - expected_domain=Domains.OBJECT_DETECTION.value, - expected_domain_flavour=DomainFlavours.YOLO.value, - ) - - def test_domain_image_recognition_resnet(self) -> None: - """Test getting domain of a model.""" - self.assert_model_domain_matches_expected( # pylint: disable=E1120 - node_names=["resnet_model/Pad"], - expected_domain=Domains.IMAGE_RECOGNITION.value, - expected_domain_flavour=DomainFlavours.NONE.value, - ) - - def test_domain_unknown(self) -> None: - """Test getting domain of a model.""" - self.assert_model_domain_matches_expected( # pylint: disable=E1120 - node_names=["foo", "bar", "baz", "ssd"], - expected_domain="", - expected_domain_flavour="", - ) - - @patch( - "neural_insights.components.model.tensorflow.model.TensorflowReader", - autospec=True, - ) - def test_domain_graph_reader_exception( - self, - mocked_tensorflow_graph_reader: MagicMock, - ) -> None: - """Test getting domain of a model.""" - mocked_tensorflow_graph_reader.return_value.read.side_effect = Exception() - - model = FrozenPbModel("/path/to/frozen_pb.pb") - - expected = Domain(domain="", domain_flavour="") - - self.assertEqual(expected, model.domain) - mocked_tensorflow_graph_reader.assert_called_once_with(model) - - def test_shape_elements_order(self) -> None: - """Test getting shape elements order.""" - model = FrozenPbModel("/path/to/frozen_pb.pb") - self.assertListEqual(model.shape_elements_order, ["height", "width", "channels"]) - - @patch( - "neural_insights.components.model.tensorflow.model.TensorflowReader", - autospec=True, - ) - def assert_model_domain_matches_expected( - self, - mocked_tensorflow_graph_reader: MagicMock, - node_names: List[str], - expected_domain: str, - expected_domain_flavour: str, - ) -> None: - """Test getting domain of a model.""" - - def graph_with_nodes() -> Graph: - """Create a graph with named nodes.""" - graph = Graph() - for name in node_names: - graph.add_node(Node(id=name, label=name)) - return graph - - mocked_tensorflow_graph_reader.return_value.read.return_value = graph_with_nodes() - - model = FrozenPbModel("/path/to/frozen_pb.pb") - - expected = Domain(domain=expected_domain, domain_flavour=expected_domain_flavour) - - self.assertEqual(expected, model.domain) - mocked_tensorflow_graph_reader.assert_called_once_with(model) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_insights/test/components/model/tensorflow/test_keras.py b/neural_insights/test/components/model/tensorflow/test_keras.py deleted file mode 100644 index 871acd01018..00000000000 --- a/neural_insights/test/components/model/tensorflow/test_keras.py +++ /dev/null @@ -1,102 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Test Keras Model.""" - -import unittest -from unittest.mock import MagicMock, patch - -from neural_insights.components.model.tensorflow.keras import KerasModel -from neural_insights.utils.consts import Frameworks - - -class TestKerasModel(unittest.TestCase): - """Test KerasModel class.""" - - def setUp(self) -> None: - """Prepare environment.""" - super().setUp() - - get_model_type_patcher = patch( - "neural_insights.components.model.model_type_getter.nc_get_model_type", - ) - self.addCleanup(get_model_type_patcher.stop) - get_model_type_mock = get_model_type_patcher.start() - get_model_type_mock.side_effect = self._get_model_type - - nc_tensorflow_model_patcher = patch( - "neural_insights.components.model.tensorflow.model.NCModel", - ) - self.addCleanup(nc_tensorflow_model_patcher.stop) - nc_model_instance_mock = nc_tensorflow_model_patcher.start() - nc_model_instance_mock.return_value.input_node_names = [ - "first input node", - "second input node", - ] - nc_model_instance_mock.return_value.output_node_names = [ - "first output node", - "second output node", - ] - - def _get_model_type(self, path: str) -> str: - """Return model type for well known paths.""" - if "/path/to/keras.pb" == path: - return "keras" - raise ValueError() - - def test_get_framework_name(self) -> None: - """Test getting correct framework name.""" - self.assertEqual(Frameworks.TF.value, KerasModel.get_framework_name()) - - def test_supports_correct_path(self) -> None: - """Test getting correct framework name.""" - self.assertTrue(KerasModel.supports_path("/path/to/keras.pb")) - - def test_supports_incorrect_path(self) -> None: - """Test getting correct framework name.""" - self.assertFalse(KerasModel.supports_path("/path/to/model.txt")) - - @patch("neural_insights.components.model.tensorflow.model.check_module") - def test_guard_requirements_installed(self, mocked_check_module: MagicMock) -> None: - """Test guard_requirements_installed.""" - model = KerasModel("/path/to/keras.pb") - - model.guard_requirements_installed() - - mocked_check_module.assert_called_once_with("tensorflow") - - def test_get_input_nodes(self) -> None: - """Test getting input nodes.""" - model = KerasModel("/path/to/keras.pb") - self.assertIsNone(model.get_input_nodes()) - - def test_get_output_nodes(self) -> None: - """Test getting output nodes.""" - model = KerasModel("/path/to/keras.pb") - self.assertIsNone(model.get_output_nodes()) - - def test_get_input_and_output_nodes(self) -> None: - """Test getting input nodes.""" - model = KerasModel("/path/to/keras.pb") - self.assertIsNone(model.get_input_nodes()) - self.assertIsNone(model.get_output_nodes()) - - def test_shape_elements_order(self) -> None: - """Test getting shape elements order.""" - model = KerasModel("/path/to/keras.pb") - self.assertListEqual(model.shape_elements_order, ["height", "width", "channels"]) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_insights/test/components/model/tensorflow/test_meta_graph.py b/neural_insights/test/components/model/tensorflow/test_meta_graph.py deleted file mode 100644 index bdc06ffbedd..00000000000 --- a/neural_insights/test/components/model/tensorflow/test_meta_graph.py +++ /dev/null @@ -1,111 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Test Meta Graph Model.""" - -import unittest -from unittest.mock import MagicMock, patch - -from neural_insights.components.model.tensorflow.meta_graph import MetaGraphModel -from neural_insights.utils.consts import Frameworks - - -class TestMetaGraphModel(unittest.TestCase): - """Test MetaGraphModel class.""" - - def setUp(self) -> None: - """Prepare environment.""" - super().setUp() - - get_model_type_patcher = patch( - "neural_insights.components.model.model_type_getter.nc_get_model_type", - ) - self.addCleanup(get_model_type_patcher.stop) - get_model_type_mock = get_model_type_patcher.start() - get_model_type_mock.side_effect = self._get_model_type - - nc_tensorflow_model_patcher = patch( - "neural_insights.components.model.tensorflow.model.NCModel", - ) - self.addCleanup(nc_tensorflow_model_patcher.stop) - nc_model_instance_mock = nc_tensorflow_model_patcher.start() - nc_model_instance_mock.return_value.input_node_names = [ - "first input node", - "second input node", - ] - nc_model_instance_mock.return_value.output_node_names = [ - "first output node", - "second output node", - ] - - def _get_model_type(self, path: str) -> str: - """Return model type for well known paths.""" - if "/path/to/meta_graph/" == path: - return "checkpoint" - raise ValueError() - - def test_get_framework_name(self) -> None: - """Test getting correct framework name.""" - self.assertEqual(Frameworks.TF.value, MetaGraphModel.get_framework_name()) - - def test_supports_correct_path(self) -> None: - """Test getting correct framework name.""" - self.assertTrue(MetaGraphModel.supports_path("/path/to/meta_graph/")) - - def test_supports_incorrect_path(self) -> None: - """Test getting correct framework name.""" - self.assertFalse(MetaGraphModel.supports_path("/path/to/model.txt")) - - @patch("neural_insights.components.model.tensorflow.model.check_module") - def test_guard_requirements_installed(self, mocked_check_module: MagicMock) -> None: - """Test guard_requirements_installed.""" - model = MetaGraphModel("/path/to/meta_graph/") - - model.guard_requirements_installed() - - mocked_check_module.assert_called_once_with("tensorflow") - - def test_get_input_nodes(self) -> None: - """Test getting input nodes.""" - model = MetaGraphModel("/path/to/meta_graph/") - self.assertEqual([], model.get_input_nodes()) - - def test_get_output_nodes(self) -> None: - """Test getting output nodes.""" - model = MetaGraphModel("/path/to/meta_graph/") - self.assertEqual([], model.get_output_nodes()) - - def test_get_input_and_output_nodes(self) -> None: - """Test getting input nodes.""" - model = MetaGraphModel("/path/to/meta_graph/") - self.assertEqual([], model.get_input_nodes()) - self.assertEqual([], model.get_output_nodes()) - - def test_get_model_graph(self) -> None: - """Test getting Graph of a model.""" - with self.assertRaisesRegex( - NotImplementedError, - "Reading graph for MetaGraph is not supported.", - ): - model = MetaGraphModel("/path/to/meta_graph/") - model.get_model_graph() - - def test_shape_elements_order(self) -> None: - """Test getting shape elements order.""" - model = MetaGraphModel("/path/to/meta_graph/") - self.assertListEqual(model.shape_elements_order, ["height", "width", "channels"]) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_insights/test/components/model/tensorflow/test_saved_model.py b/neural_insights/test/components/model/tensorflow/test_saved_model.py deleted file mode 100644 index 8daa33082bd..00000000000 --- a/neural_insights/test/components/model/tensorflow/test_saved_model.py +++ /dev/null @@ -1,108 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Test saved_model Model.""" - -import unittest -from unittest.mock import MagicMock, patch - -from neural_insights.components.model.tensorflow.saved_model import SavedModelModel -from neural_insights.utils.consts import Frameworks - - -class TestSavedModelModel(unittest.TestCase): - """Test SavedModelModel class.""" - - def setUp(self) -> None: - """Prepare environment.""" - super().setUp() - - get_model_type_patcher = patch( - "neural_insights.components.model.model_type_getter.nc_get_model_type", - ) - self.addCleanup(get_model_type_patcher.stop) - get_model_type_mock = get_model_type_patcher.start() - get_model_type_mock.side_effect = self._get_model_type - - nc_tensorflow_model_patcher = patch( - "neural_insights.components.model.tensorflow.model.NCModel", - ) - self.addCleanup(nc_tensorflow_model_patcher.stop) - nc_model_instance_mock = nc_tensorflow_model_patcher.start() - nc_model_instance_mock.return_value.input_node_names = [ - "first input node", - "second input node", - ] - nc_model_instance_mock.return_value.output_node_names = [ - "first output node", - "second output node", - ] - - def _get_model_type(self, path: str) -> str: - """Return model type for well known paths.""" - if "/path/to/saved_model" == path: - return "saved_model" - raise ValueError() - - def test_get_framework_name(self) -> None: - """Test getting correct framework name.""" - self.assertEqual(Frameworks.TF.value, SavedModelModel.get_framework_name()) - - def test_supports_correct_path(self) -> None: - """Test getting correct framework name.""" - self.assertTrue(SavedModelModel.supports_path("/path/to/saved_model")) - - def test_supports_incorrect_path(self) -> None: - """Test getting correct framework name.""" - self.assertFalse(SavedModelModel.supports_path("/path/to/model.txt")) - - @patch("neural_insights.components.model.tensorflow.model.check_module") - def test_guard_requirements_installed(self, mocked_check_module: MagicMock) -> None: - """Test guard_requirements_installed.""" - model = SavedModelModel("/path/to/saved_model") - - model.guard_requirements_installed() - - mocked_check_module.assert_called_once_with("tensorflow") - - def test_get_input_nodes(self) -> None: - """Test getting input nodes.""" - model = SavedModelModel("/path/to/saved_model") - self.assertEqual(["first input node", "second input node"], model.get_input_nodes()) - - def test_get_output_nodes(self) -> None: - """Test getting output nodes.""" - model = SavedModelModel("/path/to/saved_model") - self.assertEqual( - ["first output node", "second output node", "custom"], - model.get_output_nodes(), - ) - - def test_get_input_and_output_nodes(self) -> None: - """Test getting input nodes.""" - model = SavedModelModel("/path/to/saved_model") - self.assertEqual(["first input node", "second input node"], model.get_input_nodes()) - self.assertEqual( - ["first output node", "second output node", "custom"], - model.get_output_nodes(), - ) - - def test_shape_elements_order(self) -> None: - """Test getting shape elements order.""" - model = SavedModelModel("/path/to/saved_model") - self.assertListEqual(model.shape_elements_order, ["height", "width", "channels"]) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_insights/test/components/model/test_domain.py b/neural_insights/test/components/model/test_domain.py deleted file mode 100644 index 55ed014dffe..00000000000 --- a/neural_insights/test/components/model/test_domain.py +++ /dev/null @@ -1,65 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Test Domain.""" - -import unittest - -from neural_insights.components.model.domain import Domain - - -class TestDomain(unittest.TestCase): - """Test Domain class.""" - - def test_none_domain(self) -> None: - """Test that unknown domain serializes as expected.""" - domain = Domain() - - expected = { - "domain": "", - "domain_flavour": "", - } - - self.assertEqual(expected, domain.serialize()) - - def test_domain_without_flavour(self) -> None: - """Test that domain serializes as expected.""" - domain = Domain(domain="foo") - - expected = { - "domain": "foo", - "domain_flavour": "", - } - - self.assertEqual(expected, domain.serialize()) - - def test_domain_with_flavour(self) -> None: - """Test that domain serializes as expected.""" - domain = Domain(domain="foo", domain_flavour="bar") - - expected = { - "domain": "foo", - "domain_flavour": "bar", - } - - self.assertEqual(expected, domain.serialize()) - - def test_domain_with_flavour_only_fails(self) -> None: - """Test that domain can't be created given flavour only.""" - with self.assertRaisesRegex(ValueError, "Domain must be set when given flavour"): - Domain(domain_flavour="bar") - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_insights/test/components/model/test_repository.py b/neural_insights/test/components/model/test_repository.py deleted file mode 100644 index 101de775b20..00000000000 --- a/neural_insights/test/components/model/test_repository.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Test ModelRepository.""" - -import unittest - -from neural_insights.components.model.repository import ModelRepository -from neural_insights.utils.consts import Frameworks -from neural_insights.utils.exceptions import NotFoundException - - -class TestModelRepository(unittest.TestCase): - """Test ModelRepository class.""" - - def test_onnx_is_model_path(self) -> None: - """Test if onnx file is recognized correctly.""" - path = "/home/user/model.onnx" - result = ModelRepository.is_model_path(path) - self.assertTrue(result) - - def test_mp3_is_model_path(self) -> None: - """Test if mp3 file is recognized correctly.""" - path = "/home/user/favourite_song.mp3" - result = ModelRepository.is_model_path(path) - self.assertFalse(result) - - def test_get_frameworks(self) -> None: - """Test getting frameworks.""" - expected = [Frameworks.ONNX.value, Frameworks.PT.value, Frameworks.TF.value] - - repository = ModelRepository() - actual = repository.get_frameworks() - - self.assertEqual(expected, actual) - - def test_framework_from_path_for_known_model(self) -> None: - """Test get_framework_from_path.""" - actual = ModelRepository.get_framework_from_path("/home/user/model.onnx") - self.assertEqual(Frameworks.ONNX.value, actual) - - def test_framework_from_path_for_unknown_model(self) -> None: - """Test get_framework_from_path.""" - with self.assertRaises(NotFoundException): - ModelRepository.get_framework_from_path("/home/user/favourite_song.mp3") - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_insights/test/requirements.txt b/neural_insights/test/requirements.txt deleted file mode 100644 index 4f2dd813753..00000000000 --- a/neural_insights/test/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -intel-tensorflow -onnxruntime -onnx -onnxruntime-extensions; python_version < '3.11' diff --git a/neural_insights/test/utils/__init__.py b/neural_insights/test/utils/__init__.py deleted file mode 100644 index 5fc8ab44e56..00000000000 --- a/neural_insights/test/utils/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The utils package contains all test for Neural Insights utils.""" diff --git a/neural_insights/test/utils/test_expiring_dict.py b/neural_insights/test/utils/test_expiring_dict.py deleted file mode 100644 index c08107fdb78..00000000000 --- a/neural_insights/test/utils/test_expiring_dict.py +++ /dev/null @@ -1,91 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""ExpiringDict test.""" -import time -import unittest - -from neural_insights.utils.expiring_dict import ExpiringDict, ExpiringDictItem - - -class TestExpiringDictItem(unittest.TestCase): - """ExpiringDictItem tests.""" - - def test_it_sets_values(self) -> None: - """Test if values are set correctly.""" - value = "this is expected value" - expires_at = time.time() + 2 - - item = ExpiringDictItem(value=value, expires_at=expires_at) - - self.assertEqual(value, item.value) - self.assertEqual(expires_at, item.expires_at) - - def test_it_expires_after_time_passed(self) -> None: - """Test if ExpiringDictItem expires after given time.""" - value = "this is expected value" - expires_at = time.time() + 2 - - item = ExpiringDictItem(value=value, expires_at=expires_at) - - self.assertFalse(item.is_expired()) - - time.sleep(3) - self.assertTrue(item.is_expired()) - - -class TestExpiringDict(unittest.TestCase): - """ExpiringDict tests.""" - - def test_items_disappear_after_expiration(self) -> None: - """Test that item is not accessible after expiration.""" - key = "tested key" - value = "expected value" - - items = ExpiringDict(ttl=2) - - with self.assertRaisesRegex(KeyError, expected_regex=key): - items[key] - - items[key] = value - - self.assertEqual(value, items[key]) - - time.sleep(3) - - with self.assertRaisesRegex(KeyError, expected_regex=key): - items[key] - - def test_items_disappear_after_expiration_when_passed_in_constructor(self) -> None: - """Test that item is not accessible after expiration.""" - key = "tested key" - value = "expected value" - - items = ExpiringDict( - initial_value={ - key: value, - }, - ttl=2, - ) - - self.assertEqual(value, items[key]) - - time.sleep(3) - - with self.assertRaisesRegex(KeyError, expected_regex=key): - items[key] - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_insights/test/utils/test_json_serializer.py b/neural_insights/test/utils/test_json_serializer.py deleted file mode 100644 index b4d43eb8e6a..00000000000 --- a/neural_insights/test/utils/test_json_serializer.py +++ /dev/null @@ -1,110 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Json Serializer test.""" - -import unittest -from enum import Enum -from typing import Any, List - -from neural_insights.utils.json_serializer import JsonSerializer - - -class SubClassToTest(JsonSerializer): - """Test sub class for json serializer tests.""" - - def __init__(self) -> None: - """Initialize test class.""" - super().__init__() - self.some_variable: str = "value" - - -class SomEnum(Enum): - """Enum to test.""" - - FOO = "foo" - BAR = 12 - - -class ClassToTest(JsonSerializer): - """Test class for json serializer tests.""" - - def __init__(self) -> None: - """Initialize test class.""" - super().__init__() - self._skip.append("skip_test") - self.skip_test: str = "this should be skipped" - self.none_value: Any = None - self.string: str = "some string" - self.empty_list: List = [] - self.some_list: List[Any] = ["a", 1] - self._private_var: int = 1 - self.sub = SubClassToTest() - subclass1 = SubClassToTest() - subclass1.some_variable = "this is subclass1 variable" - subclass2 = SubClassToTest() - subclass2.some_variable = "this is subclass2 variable" - self.sub_list: List[SubClassToTest] = [subclass1, subclass2] - self.empty_dict: dict = {} - self.dict_with_empty_values = { - "foo": None, - "bar": None, - } - self.dict_with_some_empty_values = { - "foo": None, - "bar": 12, - "baz": None, - "donk": 42, - } - self.enum_value = SomEnum.FOO - - -class TestJsonSerializer(unittest.TestCase): - """Json serializer tests.""" - - def __init__(self, *args: str, **kwargs: str) -> None: - """Parser tests constructor.""" - super().__init__(*args, **kwargs) - - def test_serialization(self) -> None: - """Test if path is correctly recognized as hidden.""" - test_object = ClassToTest() - result = test_object.serialize() - expected = { - "string": "some string", - "some_list": ["a", 1], - "private_var": 1, - "sub": { - "some_variable": "value", - }, - "sub_list": [ - { - "some_variable": "this is subclass1 variable", - }, - { - "some_variable": "this is subclass2 variable", - }, - ], - "dict_with_some_empty_values": { - "bar": 12, - "donk": 42, - }, - "enum_value": "foo", - } - self.assertEqual(type(result), dict) - self.assertDictEqual(result, expected) # type: ignore - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_insights/test/utils/test_logger.py b/neural_insights/test/utils/test_logger.py deleted file mode 100644 index e49482810d7..00000000000 --- a/neural_insights/test/utils/test_logger.py +++ /dev/null @@ -1,33 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Logger test.""" - -import logging -import unittest - -from neural_insights.utils.logger import change_log_level, log - - -class TestLogger(unittest.TestCase): - """Logger tests.""" - - def test_changing_log_level(self) -> None: - """Test default values.""" - change_log_level(logging.INFO) - self.assertEqual(logging.INFO, log.level) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_insights/test/utils/test_utils.py b/neural_insights/test/utils/test_utils.py deleted file mode 100644 index 8fd5e88e04d..00000000000 --- a/neural_insights/test/utils/test_utils.py +++ /dev/null @@ -1,97 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Utils test.""" - -import unittest -from unittest.mock import MagicMock, patch - -from neural_insights.utils.consts import Frameworks -from neural_insights.utils.exceptions import ( - ClientErrorException, -) -from neural_insights.utils.utils import ( - check_module, - get_file_extension, - get_framework_from_path, -) - -fake_metrics: dict = { - "topk": {}, - "COCOmAP": {}, - "MSE": {}, - "RMSE": {}, - "MAE": {}, - "metric1": {}, -} - - -class TestUtils(unittest.TestCase): - """Value parser tests.""" - - def __init__(self, *args: str, **kwargs: str) -> None: - """Parser tests constructor.""" - super().__init__(*args, **kwargs) - - @patch("neural_insights.components.model.tensorflow.frozen_pb.get_model_type") - def test_get_tensorflow_framework_from_path(self, mocked_get_model_type: MagicMock) -> None: - """Test getting framework name from path.""" - mocked_get_model_type.return_value = "frozen_pb" - path = "/home/user/model.pb" - result = get_framework_from_path(path) - self.assertEqual(result, Frameworks.TF.value) - mocked_get_model_type.assert_called_with(path) - - def test_get_onnx_framework_from_path(self) -> None: - """Test getting framework name from path.""" - path = "/home/user/model.onnx" - result = get_framework_from_path(path) - self.assertEqual(result, Frameworks.ONNX.value) - - def test_get_unknown_framework_from_path(self) -> None: - """Test getting framework name from path.""" - path = "/home/user/model.some_extension" - result = get_framework_from_path(path) - self.assertIsNone(result) - - def test_get_file_extension(self) -> None: - """Test getting file extension from path.""" - path = "/home/user/file.ext" - result = get_file_extension(path) - self.assertEqual(result, "ext") - - def test_get_file_with_dots_extension(self) -> None: - """Test getting file extension from path.""" - path = "/home/user/file.name.ext2" - result = get_file_extension(path) - self.assertEqual(result, "ext2") - - def test_get_file_without_extension(self) -> None: - """Test getting file extension from path.""" - path = "/home/user/file" - result = get_file_extension(path) - self.assertEqual(result, "") - - def test_check_module(self) -> None: - """Test checking existing module.""" - check_module("os") - - def test_check_non_existing_module(self) -> None: - """Test checking non existing module.""" - with self.assertRaises(ClientErrorException): - check_module("non_existing_module") - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_insights/test/web/service/__init__.py b/neural_insights/test/web/service/__init__.py deleted file mode 100644 index e455ed47c6f..00000000000 --- a/neural_insights/test/web/service/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The service package contains all test for web service.""" diff --git a/neural_insights/test/web/service/test_request_data_processor.py b/neural_insights/test/web/service/test_request_data_processor.py deleted file mode 100644 index bc194f6863e..00000000000 --- a/neural_insights/test/web/service/test_request_data_processor.py +++ /dev/null @@ -1,65 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""RequestDataProcessor test.""" - -import unittest -from typing import Any, Dict - -from neural_insights.utils.exceptions import ClientErrorException -from neural_insights.web.service.request_data_processor import RequestDataProcessor - - -class TestRequestDataProcessor(unittest.TestCase): - """Test RequestDataProcessor.""" - - def test_get_string_value_with_single_value(self) -> None: - """Test get_string_value when single value was provided.""" - expected = "expected_value" - data = { - "requested_key": [expected], - } - - self.assertEqual( - "expected_value", - RequestDataProcessor.get_string_value(data, "requested_key"), - ) - - def test_get_string_value_with_multiple_values(self) -> None: - """Test get_string_value when many values were provided.""" - expected = "expected_value" - data = { - "requested_key": [ - expected, - " and ", - "some", - "more", - ], - } - - self.assertEqual( - "expected_value", - RequestDataProcessor.get_string_value(data, "requested_key"), - ) - - def test_get_string_fails_when_data_missing(self) -> None: - """Test get_string_value fails.""" - data: Dict[str, Any] = {} - - with self.assertRaisesRegex(ClientErrorException, "Missing requested_key parameter"): - RequestDataProcessor.get_string_value(data, "requested_key") - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_insights/test/web/service/test_response_generator.py b/neural_insights/test/web/service/test_response_generator.py deleted file mode 100644 index cd1a9facf74..00000000000 --- a/neural_insights/test/web/service/test_response_generator.py +++ /dev/null @@ -1,90 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""RequestDataProcessor test.""" - -import unittest - -from werkzeug.wrappers import Response - -from neural_insights.utils.exceptions import ( - AccessDeniedException, - ClientErrorException, - InternalException, - NotFoundException, -) -from neural_insights.web.service.response_generator import ResponseGenerator - - -class TestResponseGenerator(unittest.TestCase): - """Test ResponseGenerator.""" - - def test_add_refresh(self) -> None: - """Test adding refresh header.""" - response = Response() - - self.assertEqual(None, response.headers.get("refresh")) - - ResponseGenerator.add_refresh(response, 15) - - self.assertEqual("15", response.headers.get("refresh")) - - def test_from_exception_for_client_error_exception(self) -> None: - """Test from_exception for ClientErrorException.""" - message = "Request is invalid!" - - response = ResponseGenerator.from_exception(ClientErrorException(message)) - - self.assertEqual(400, response.status_code) - self.assertEqual(message, response.data.decode("utf-8")) - - def test_from_exception_for_access_denied_exception(self) -> None: - """Test from_exception for AccessDeniedException.""" - message = "You can't enter here!" - - response = ResponseGenerator.from_exception(AccessDeniedException(message)) - - self.assertEqual(403, response.status_code) - self.assertEqual(message, response.data.decode("utf-8")) - - def test_from_exception_for_not_found_exception(self) -> None: - """Test from_exception for NotFoundException.""" - message = "There's nothing here!" - - response = ResponseGenerator.from_exception(NotFoundException(message)) - - self.assertEqual(404, response.status_code) - self.assertEqual(message, response.data.decode("utf-8")) - - def test_from_exception_for_internal_exception(self) -> None: - """Test from_exception for InternalException.""" - message = "Domain code crashed!" - - response = ResponseGenerator.from_exception(InternalException(message)) - - self.assertEqual(500, response.status_code) - self.assertEqual(message, response.data.decode("utf-8")) - - def test_from_exception_for_exception(self) -> None: - """Test from_exception for Exception.""" - message = "Something crashed!" - - response = ResponseGenerator.from_exception(Exception(message)) - - self.assertEqual(500, response.status_code) - self.assertEqual(message, response.data.decode("utf-8")) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_insights/test/web/test_communication.py b/neural_insights/test/web/test_communication.py deleted file mode 100644 index bf01f4e7bd7..00000000000 --- a/neural_insights/test/web/test_communication.py +++ /dev/null @@ -1,111 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Neural Insights Communication test.""" - -import unittest - -from neural_insights.web.communication import ( - Message, - MessageQueue, - Request, - Response, - create_simple_response, -) - - -class TestCommunication(unittest.TestCase): - """Neural Insights Communication tests.""" - - def setUp(self) -> None: - """Create test environment.""" - self.queue = MessageQueue() - - def test_request(self) -> None: - """Test that Request is working.""" - method = "GET" - operation = "/api/a/b/x" - data = self._get_random_dict() - request = Request(method, operation, data) - - self.assertEqual(method, request.method) - self.assertEqual(operation, request.operation) - self.assertEqual(data, request.data) - - def test_response(self) -> None: - """Test that Response is working.""" - response = Response() - - self.assertEqual({}, response.data) - self.assertEqual({}, response.command) - - def test_create_simple_response(self) -> None: - """Test that create_simple_response is working.""" - data = self._get_random_dict() - response = create_simple_response(data) - - self.assertEqual(data, response.data) - self.assertEqual({}, response.command) - - def test_message(self) -> None: - """Test that Message is working.""" - status = "Test status" - subject = "Test subject" - data = self._get_random_dict() - message = Message(status, subject, data) - - self.assertEqual(status, message.status) - self.assertEqual(subject, message.subject) - self.assertEqual(data, message.data) - - def test_message_queue_post_failure(self) -> None: - """Test posting failure messages to message queue.""" - data = self._get_random_dict() - self.queue.post_failure("subject", data) - self._assert_message("failure", "subject", data) - - def test_message_queue_post_success(self) -> None: - """Test posting success messages to message queue.""" - data = self._get_random_dict() - self.queue.post_success("subject", data) - self._assert_message("success", "subject", data) - - def test_message_queue_post_error(self) -> None: - """Test posting error messages to message queue.""" - data = self._get_random_dict() - self.queue.post_error("subject", data) - self._assert_message("error", "subject", data) - - def _get_random_dict(self, size: int = 5) -> dict: - """Build random dict.""" - from numpy.random import randint - - return {"key " + str(i): randint(65536) for i in range(size)} - - def _assert_message( - self, - expected_status: str, - expected_subject: str, - expected_data: dict, - ) -> None: - """Assert message in queue matches expectations.""" - message = self.queue.get() - - self.assertEqual(expected_status, message.status) - self.assertEqual(expected_subject, message.subject) - self.assertEqual(expected_data, message.data) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_insights/test/web/test_configuration.py b/neural_insights/test/web/test_configuration.py deleted file mode 100644 index 3925437bbb8..00000000000 --- a/neural_insights/test/web/test_configuration.py +++ /dev/null @@ -1,226 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Neural Insights Configuration test.""" - -import logging -import socket -import unittest -from unittest.mock import MagicMock, patch - -from neural_insights.utils.consts import WORKDIR_LOCATION -from neural_insights.web.configuration import Configuration -from neural_insights.web.exceptions import NotFoundException - - -@patch("neural_insights.web.configuration.determine_ip", new=lambda: "127.0.0.1") -class TestConfiguration(unittest.TestCase): - """Neural Insights Configuration tests.""" - - @patch( - "sys.argv", - [ - "main.py", - ], - ) - @patch("secrets.token_hex") - def test_defaults( - self, - mock_secrets_token_hex: MagicMock, - ) -> None: - """Test default values.""" - mock_secrets_token_hex.return_value = "this is a mocked token value" - - configuration = Configuration() - configuration.set_up() - - self.assertEqual(5000, configuration.server_port) - self.assertEqual(5000, configuration.gui_port) - self.assertEqual(logging.INFO, configuration.log_level) - self.assertEqual("127.0.0.1", configuration.server_address) - self.assertEqual("https", configuration.scheme) - self.assertEqual("this is a mocked token value", configuration.token) - self.assertEqual( - "https://127.0.0.1:5000/?token=this is a mocked token value", - configuration.get_url(), - ) - - @patch("sys.argv", ["main.py", "-P1234"]) - @patch("secrets.token_hex") - def test_changing_gui_port( - self, - mock_secrets_token_hex: MagicMock, - ) -> None: - """Test changing GUI port.""" - mock_secrets_token_hex.return_value = "this is a mocked token value" - - configuration = Configuration() - configuration.set_up() - - self.assertEqual(1234, configuration.gui_port) - self.assertNotEqual(configuration.server_port, configuration.gui_port) - self.assertEqual( - "https://127.0.0.1:1234/?token=this is a mocked token value", - configuration.get_url(), - ) - - @patch("sys.argv", ["main.py", "-p1234"]) - @patch("secrets.token_hex") - def test_changing_server_port( - self, - mock_secrets_token_hex: MagicMock, - ) -> None: - """Test changing API port.""" - mock_secrets_token_hex.return_value = "this is a mocked token value" - - configuration = Configuration() - configuration.set_up() - - self.assertEqual(1234, configuration.server_port) - self.assertEqual(1234, configuration.gui_port) - self.assertEqual( - "https://127.0.0.1:1234/?token=this is a mocked token value", - configuration.get_url(), - ) - - @patch("sys.argv", ["main.py", "-p 0"]) - def test_changing_server_port_too_low(self) -> None: - """Test changing API port to invalid value.""" - configuration = Configuration() - with self.assertRaisesRegex( - ValueError, - "Lowest allowed port number is 1, attempted to use: 0", - ): - configuration.set_up() - - @patch("sys.argv", ["main.py", "-p 65536"]) - def test_changing_server_port_too_high(self) -> None: - """Test changing API port to invalid value.""" - configuration = Configuration() - with self.assertRaisesRegex( - ValueError, - "Highest allowed port number is 65535, attempted to use: 65536", - ): - configuration.set_up() - - @patch("sys.argv", ["main.py", "-P 0"]) - def test_changing_gui_port_too_low(self) -> None: - """Test changing GUI port to invalid value.""" - configuration = Configuration() - with self.assertRaisesRegex( - ValueError, - "Lowest allowed port number is 1, attempted to use: 0", - ): - configuration.set_up() - - @patch("sys.argv", ["main.py", "-P 65536"]) - def test_changing_gui_port_too_high(self) -> None: - """Test changing GUI port to invalid value.""" - configuration = Configuration() - with self.assertRaisesRegex( - ValueError, - "Highest allowed port number is 65535, attempted to use: 65536", - ): - configuration.set_up() - - @patch("sys.argv", ["main.py", "-p1234", "-P5678"]) - @patch("secrets.token_hex") - def test_changing_server_and_gui_port( - self, - mock_secrets_token_hex: MagicMock, - ) -> None: - """Test changing API and GUI ports.""" - mock_secrets_token_hex.return_value = "this is a mocked token value" - - configuration = Configuration() - configuration.set_up() - - self.assertEqual(1234, configuration.server_port) - self.assertEqual(5678, configuration.gui_port) - self.assertEqual( - "https://127.0.0.1:5678/?token=this is a mocked token value", - configuration.get_url(), - ) - - @patch("sys.argv", ["main.py", "-vv"]) - def test_changing_log_level_to_defined_one(self) -> None: - """Test changing log level.""" - configuration = Configuration() - configuration.set_up() - - self.assertEqual(logging.DEBUG, configuration.log_level) - - @patch("sys.argv", ["main.py", "-vvvvvvvvvvvvv"]) - def test_changing_log_level_to_not_defined_one(self) -> None: - """Test changing log level to unknown one.""" - configuration = Configuration() - configuration.set_up() - - self.assertEqual(logging.DEBUG, configuration.log_level) - - @patch("socket.socket.bind") - @patch("sys.argv", ["main.py", "-p1234"]) - def test_changing_server_port_to_already_taken_fails( - self, - mock_socket_bind: MagicMock, - ) -> None: - """Test fail during attempting to use taken port.""" - mock_socket_bind.configure_mock(side_effect=socket.error) - - with self.assertRaises(NotFoundException): - configuration = Configuration() - configuration.set_up() - - @patch("socket.socket.bind") - @patch("sys.argv", ["main.py"]) - def test_when_all_ports_taken_it_fails( - self, - mock_socket_bind: MagicMock, - ) -> None: - """Test fail when all ports taken.""" - mock_socket_bind.configure_mock(side_effect=socket.error) - - with self.assertRaises(NotFoundException): - configuration = Configuration() - configuration.set_up() - - @patch("sys.argv", ["main.py"]) - def test_many_instances_are_the_same(self) -> None: - """Test that all instances references same object.""" - original_configuration = Configuration() - new_configuration = Configuration() - - self.assertTrue(original_configuration is new_configuration) - - @patch("sys.argv", ["main.py"]) - def test_reloading_config_changes_token(self) -> None: - """Test that reloading configuration changes token.""" - configuration = Configuration() - original_token = configuration.token - - configuration.set_up() - - self.assertNotEqual(original_token, configuration.token) - - @patch("sys.argv", ["main.py"]) - def test_default_workdir(self) -> None: - """Test that when no existing config given, default will be used.""" - configuration = Configuration() - configuration.set_up() - - self.assertEqual(WORKDIR_LOCATION, configuration.workdir) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_insights/test/web/test_router.py b/neural_insights/test/web/test_router.py deleted file mode 100644 index 8ee22271d5e..00000000000 --- a/neural_insights/test/web/test_router.py +++ /dev/null @@ -1,103 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Neural Insights Router test.""" - -import os -import shutil -import unittest -from typing import Any -from unittest.mock import MagicMock, patch - -from neural_insights.web.communication import Request -from neural_insights.web.exceptions import ServiceNotFoundException -from neural_insights.web.router import Router - -MOCKED_HOME = os.path.abspath(os.path.dirname(__file__)) - - -@patch.dict(os.environ, {"HOME": MOCKED_HOME}) -class TestRouter(unittest.TestCase): - """Neural Insights Router tests.""" - - def setUp(self) -> None: - """Prepare environment.""" - assert not os.path.isdir(self._get_workdir_path()) - self._paths_to_clean = [self._get_workdir_path()] - - def tearDown(self) -> None: - """Make environment clean again.""" - for path in self._paths_to_clean: - shutil.rmtree(path, ignore_errors=True) - - def test_handle_fails_on_unknown_path(self) -> None: - """Test that passing unknown path fails.""" - request = Request("GET", "/foo/bar", {}) - router = Router() - - with self.assertRaises(ServiceNotFoundException): - router.handle(request) - - @patch("neural_insights.web.router.get_workloads_list") - def test_executes_expected_realtime_function( - self, - mocked_get_workloads: MagicMock, - ) -> None: - """Test that passing known realtime endpoint succeeds.""" - expected_return = { - "workloads": [ - { - "accuracy_data": { - "baseline_accuracy": 0.7664, - "optimized_accuracy": 0.7634, - "ratio": -0.003914405010438417, - }, - "creation_time": 1685605003, - "framework": "ONNXRT", - "mode": "quantization", - "model_path": "/some/path/to/model.onnx", - "status": "success", - "uuid": "d34ec577-0b84-44d3-9e31-66ad884c5759", - "workload_location": "/path/to/nc_workspace/2023-06-01_09-36-39", - }, - { - "creation_time": 1685620648, - "framework": "ONNXRT", - "mode": "benchmark", - "model_path": "/some/path/to/model.onnx", - "status": "success", - "uuid": "d51b6028-c6c8-4227-b8e9-6f9b46845ab5", - "workload_location": "/path/to/nc_workspace/2023-06-01_09-36-39", - }, - ], - } - mocked_get_workloads.return_value = expected_return - request = Request("GET", "workloads", {}) - - router = Router() - response = router.handle(request) - - self.assertEqual({}, response.command) - self.assertEqual(expected_return, response.data) - - def _get_workdir_path(self) -> str: - """Build local path to workdir.""" - return os.path.join(MOCKED_HOME, ".neural_compressor") - - def _mocked_workdir_init(self, *args: Any, **kwargs: Any) -> None: - self.assertEqual(MOCKED_HOME, kwargs.get("workspace_path")) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_insights/utils/__init__.py b/neural_insights/utils/__init__.py deleted file mode 100644 index 573a731deb3..00000000000 --- a/neural_insights/utils/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The utils package contains utility components for Neural Insights.""" diff --git a/neural_insights/utils/consts.py b/neural_insights/utils/consts.py deleted file mode 100644 index e74fa43aea5..00000000000 --- a/neural_insights/utils/consts.py +++ /dev/null @@ -1,64 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Constant values.""" - -import os -from enum import Enum - -WORKDIR_LOCATION = os.path.join(os.environ.get("HOME", ""), ".neural_compressor") - -CONFIG_REFRESH_PERIOD = 5 - - -class WorkloadModes(Enum): - """Workload mode enumeration.""" - - BENCHMARK = "benchmark" - QUANTIZATION = "quantization" - - -class Domains(Enum): - """Model domains enumeration.""" - - NONE = "" - IMAGE_RECOGNITION = "Image Recognition" - OBJECT_DETECTION = "Object Detection" - NLP = "Neural Language Processing" - RECOMMENDATION = "Recommendation" - - -class DomainFlavours(Enum): - """Domain flavours enumeration.""" - - NONE = "" - SSD = "SSD" - YOLO = "Yolo" - - -class Frameworks(Enum): - """Supported frameworks enumeration.""" - - TF = "TensorFlow" - ONNX = "ONNXRT" - PT = "PyTorch" - - -class WorkloadStatus(Enum): - """Workload status enumeration.""" - - NEW = "new" - WIP = "wip" - SUCCESS = "success" - FAILURE = "failure" diff --git a/neural_insights/utils/environment.py b/neural_insights/utils/environment.py deleted file mode 100644 index 50764976b58..00000000000 --- a/neural_insights/utils/environment.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Environment manager class.""" -import os -import sys - - -class Environment: - """Environment manager class.""" - - @staticmethod - def ensure_workdir_exists_and_writeable() -> None: - """Ensure that configured directory exists and can be used.""" - from neural_insights.utils.logger import log - from neural_insights.web.configuration import Configuration - - configuration = Configuration() - workdir = configuration.workdir - error_message_tail = "Please ensure it is a directory that can be written to.\nExiting.\n" - try: - os.makedirs(workdir, exist_ok=True) - except Exception as e: - log.error(f"Unable to create workdir at {workdir}: {e}.\n{error_message_tail}") - log.error(e) - sys.exit(1) - if not os.access(workdir, os.W_OK): - log.error(f"Unable to create files at {workdir}.\n{error_message_tail}") - sys.exit(2) diff --git a/neural_insights/utils/exceptions.py b/neural_insights/utils/exceptions.py deleted file mode 100644 index 80baa1057b0..00000000000 --- a/neural_insights/utils/exceptions.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Domain Exceptions.""" - - -class NotFoundException(Exception): - """Not Found Exception.""" - - pass - - -class AccessDeniedException(Exception): - """Access Denied.""" - - pass - - -class ClientErrorException(Exception): - """Generic user error.""" - - pass - - -class InternalException(Exception): - """Internal application exception.""" - - pass diff --git a/neural_insights/utils/expiring_dict.py b/neural_insights/utils/expiring_dict.py deleted file mode 100644 index 69ad958715f..00000000000 --- a/neural_insights/utils/expiring_dict.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Dict with items expiring after given time.""" -import time -from collections import UserDict -from typing import Any, Optional - - -class ExpiringDictItem: - """Item that knows it it's already expired.""" - - def __init__(self, value: Any, expires_at: float): - """Create object.""" - self.value = value - self.expires_at = expires_at - - def is_expired(self) -> bool: - """Check if item is already expired.""" - return time.time() > self.expires_at - - -class ExpiringDict(UserDict): - """Dict with items expiring after given time.""" - - def __init__(self, initial_value: Optional[dict] = None, ttl: int = 120) -> None: - """Create object.""" - super().__init__() - self.ttl = ttl - if initial_value is None: - initial_value = {} - - for key, value in initial_value.items(): - self[key] = value - - def __setitem__(self, key: str, item: Any) -> None: - """Add item to dict.""" - super().__setitem__(key, self._create_item(value=item)) - - def __getitem__(self, key: str) -> Any: - """Get item from dict.""" - item: ExpiringDictItem = super().__getitem__(key) - if item.is_expired(): - raise KeyError(key) - return item.value - - def _create_item(self, value: Any) -> ExpiringDictItem: - """Create item for collection.""" - return ExpiringDictItem(value=value, expires_at=time.time() + self.ttl) diff --git a/neural_insights/utils/json_serializer.py b/neural_insights/utils/json_serializer.py deleted file mode 100644 index c37a45e00e6..00000000000 --- a/neural_insights/utils/json_serializer.py +++ /dev/null @@ -1,143 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""JsonSerializer module.""" - -import re -from enum import Enum -from typing import Any, Dict, List, Optional, Union - -from neural_insights.utils.logger import log - - -class JsonSerializer: - """Dict serializable class.""" - - def __init__(self) -> None: - """Initialize json serializable class.""" - # List of variable names that will - # be skipped during serialization - self._skip = ["_skip"] - - def __eq__(self, other: Any) -> bool: - """Compare self to other instance.""" - if type(self) is not type(other): - # don't attempt to compare against unrelated types - raise NotImplementedError - - return self.serialize() == other.serialize() - - def serialize( - self, - serialization_type: str = "default", - ) -> Union[Dict[str, Any], List[Dict[str, Any]]]: - """Serialize class to dict. - - :param serialization_type: serialization type, defaults to "default" - :type serialization_type: str, optional - :return: serialized class - :rtype: Union[dict, List[dict]] - """ - result = {} - for key, value in self.__dict__.items(): - if key in self._skip: - continue - if value is None: - continue - - variable_name = re.sub(r"^_", "", key) - getter_value = value - try: - getter_value = getattr(self, variable_name) - except AttributeError: - log.warning(f"Found f{key} attribute without {variable_name} getter.") - - serialized_value = self._serialize_value( - getter_value, - serialization_type, - ) - - if serialized_value is not None: - result[variable_name] = serialized_value - - return result - - def _serialize_value(self, value: Any, serialization_type: str) -> Any: - """Serialize single value.""" - if isinstance(value, list): - return self._serialize_list(value, serialization_type) - if isinstance(value, dict): - return self._serialize_dict(value, serialization_type) - else: - return self.serialize_item(value, serialization_type) - - def _serialize_list( - self, - value: list, - serialization_type: str, - ) -> Optional[List[Any]]: - """Serialize list.""" - serialized_list = [] - - for item in value: - serialized_item = self.serialize_item(item, serialization_type) - if serialized_item is not None: - serialized_list.append(serialized_item) - - if len(serialized_list) == 0: - return None - - return serialized_list - - def _serialize_dict( - self, - value: dict, - serialization_type: str, - ) -> Optional[Dict[str, Any]]: - """Serialize dict.""" - serialized_dict = {} - - for key in value.keys(): - serialized_item = self.serialize_item(value[key], serialization_type) - if serialized_item is not None: - serialized_dict[key] = serialized_item - - if len(serialized_dict.keys()) == 0: - return None - - return serialized_dict - - @staticmethod - def serialize_item(value: Any, serialization_type: str = "default") -> Any: - """Serialize objects that don't support json dump. - - i.e datetime object can't be serialized to JSON format and throw an TypeError exception - TypeError: datetime.datetime(2016, 4, 8, 11, 22, 3, 84913) is not JSON serializable - To handle that override method serialize_item to convert object - >>> serialize_item(datetime) - "2016-04-08T11:22:03.084913" - - For all other cases it should return serializable object i.e. str, int float - - :param value: Any type - :param serialization_type: serialization type - :return: Value that can be handled by json.dump - """ - if issubclass(type(value), JsonSerializer): - # pylint: disable=maybe-no-member - serialized_value = value.serialize(serialization_type) - return serialized_value - if isinstance(value, Enum): - return value.value - return value diff --git a/neural_insights/utils/logger.py b/neural_insights/utils/logger.py deleted file mode 100644 index 578bee33ae0..00000000000 --- a/neural_insights/utils/logger.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Neural Insights Logger module.""" -import logging - -log = logging.getLogger("Neural Insights") - -handler = logging.StreamHandler() -formatter = logging.Formatter( - "%(asctime)s [%(levelname)s] %(message)s", - "%Y-%m-%d %H:%M:%S", -) -handler.setFormatter(formatter) -log.addHandler(handler) - - -def change_log_level(log_level: int) -> None: - """Change log level.""" - global log - log.setLevel(level=log_level) diff --git a/neural_insights/utils/singleton.py b/neural_insights/utils/singleton.py deleted file mode 100644 index 79551043a3e..00000000000 --- a/neural_insights/utils/singleton.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Singleton metaclass.""" - -from typing import Any - - -class Singleton(type): - """Singleton class.""" - - _instances: dict = {} - - def __call__(cls, *args: list, **kwargs: dict) -> Any: - """Get or create singleton instance.""" - if cls not in cls._instances: - cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) - return cls._instances[cls] diff --git a/neural_insights/utils/utils.py b/neural_insights/utils/utils.py deleted file mode 100644 index 7a8da311b6f..00000000000 --- a/neural_insights/utils/utils.py +++ /dev/null @@ -1,94 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Utils module for Neural Insights server.""" -import os -import socket -from importlib.util import find_spec -from pathlib import Path -from typing import Optional, Union - -from neural_insights.utils.exceptions import ClientErrorException, NotFoundException - - -def determine_ip() -> str: - """Return IP to be used by server.""" - sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - try: - sock.connect(("10.0.0.0", 1)) - ip = sock.getsockname()[0] - except Exception: - ip = "127.0.0.1" - finally: - sock.close() - - return ip - - -def get_size(path: str, unit: str = "MB", add_unit: bool = False) -> Union[str, int]: - """Check file or directory size.""" - supported_units = { - "B": 1, - "KB": 1024, - "MB": 1024**2, - "GB": 1024**3, - } - unit_modifier = supported_units.get(unit, None) - if unit_modifier is None: - raise Exception( - "Unit not supported. Select one of following: " + str(supported_units.keys()), - ) - root_dir = Path(path) - if root_dir.is_file(): - size = root_dir.stat().st_size - else: - size = sum(f.stat().st_size for f in root_dir.glob("**/*") if f.is_file()) - size = int(round(size / unit_modifier)) - if add_unit: - return f"{size}{unit}" - return size - - -def check_module(module_name: str) -> None: - """Check if module exists. - - Raise exception when not found. - """ - if module_name == "onnxrt": - module_name = "onnxruntime" - if module_name == "pytorch": - module_name = "torch" - module = find_spec(module_name.lower()) - if module is None: - raise ClientErrorException(f"Could not find {module_name} module.") - - -def get_file_extension(path: str) -> str: - """Get file extension without leading dot.""" - return os.path.splitext(path)[1][1:] - - -def get_framework_from_path(model_path: str) -> Optional[str]: - """Get framework name from model extension. - - :param model_path: Path to model. - """ - from neural_insights.components.model.repository import ModelRepository - - model_repository = ModelRepository() - try: - model = model_repository.get_model(model_path) - return model.get_framework_name() - except NotFoundException: - return None diff --git a/neural_insights/version.py b/neural_insights/version.py deleted file mode 100644 index fe341ac52e8..00000000000 --- a/neural_insights/version.py +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# flake8: noqa -"""Neural Insights.""" - -from neural_compressor.version import __version__ diff --git a/neural_insights/web/__init__.py b/neural_insights/web/__init__.py deleted file mode 100644 index 5a33153cf19..00000000000 --- a/neural_insights/web/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The web package contains all components required for running backend for GUI.""" diff --git a/neural_insights/web/app/asset-manifest.json b/neural_insights/web/app/asset-manifest.json deleted file mode 100644 index 2ed595bd2de..00000000000 --- a/neural_insights/web/app/asset-manifest.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "files": { - "main.css": "/static/css/main.bb4c518c.css", - "main.js": "/static/js/main.b053b871.js", - "static/js/787.c1112931.chunk.js": "/static/js/787.c1112931.chunk.js", - "static/media/IntelClear_Rg.ttf": "/static/media/IntelClear_Rg.33af11200cffaf9540ff.ttf", - "static/media/IntelClear_Lt.ttf": "/static/media/IntelClear_Lt.c5e18e9d5505364da760.ttf", - "static/media/IntelClear_Bd.ttf": "/static/media/IntelClear_Bd.060888be7dccf869db54.ttf", - "static/media/intelone-display-light.ttf": "/static/media/intelone-display-light.68a9d0311f7374acb0cf.ttf", - "static/media/intelone-display-bold.ttf": "/static/media/intelone-display-bold.64a6eab04dcda9c570c8.ttf", - "static/media/intelone-display-regular.ttf": "/static/media/intelone-display-regular.0f8c3ef25c545acb6b7c.ttf", - "static/media/intelone-mono-font-family-regular.ttf": "/static/media/intelone-mono-font-family-regular.de914c9a804c00b4f3e5.ttf", - "index.html": "/index.html", - "main.bb4c518c.css.map": "/static/css/main.bb4c518c.css.map", - "main.b053b871.js.map": "/static/js/main.b053b871.js.map", - "787.c1112931.chunk.js.map": "/static/js/787.c1112931.chunk.js.map" - }, - "entrypoints": [ - "static/css/main.bb4c518c.css", - "static/js/main.b053b871.js" - ] -} \ No newline at end of file diff --git a/neural_insights/web/app/favicon.ico b/neural_insights/web/app/favicon.ico deleted file mode 100644 index 39f348e6a77..00000000000 Binary files a/neural_insights/web/app/favicon.ico and /dev/null differ diff --git a/neural_insights/web/app/icons/057a-trash-solid-red.svg b/neural_insights/web/app/icons/057a-trash-solid-red.svg deleted file mode 100644 index 389c37091bd..00000000000 --- a/neural_insights/web/app/icons/057a-trash-solid-red.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - diff --git a/neural_insights/web/app/icons/057a-trash-solid.svg b/neural_insights/web/app/icons/057a-trash-solid.svg deleted file mode 100644 index 623f93c34b7..00000000000 --- a/neural_insights/web/app/icons/057a-trash-solid.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - diff --git a/neural_insights/web/app/icons/146b-copy-outlined-gray.svg b/neural_insights/web/app/icons/146b-copy-outlined-gray.svg deleted file mode 100644 index 2194c1ab27e..00000000000 --- a/neural_insights/web/app/icons/146b-copy-outlined-gray.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - diff --git a/neural_insights/web/app/icons/146b-copy-outlined.svg b/neural_insights/web/app/icons/146b-copy-outlined.svg deleted file mode 100644 index 9a6262f2284..00000000000 --- a/neural_insights/web/app/icons/146b-copy-outlined.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - diff --git a/neural_insights/web/app/index.html b/neural_insights/web/app/index.html deleted file mode 100644 index cc231e503b1..00000000000 --- a/neural_insights/web/app/index.html +++ /dev/null @@ -1 +0,0 @@ -Neural Insights
\ No newline at end of file diff --git a/neural_insights/web/app/static/css/main.bb4c518c.css b/neural_insights/web/app/static/css/main.bb4c518c.css deleted file mode 100644 index 233dcf38419..00000000000 --- a/neural_insights/web/app/static/css/main.bb4c518c.css +++ /dev/null @@ -1,6 +0,0 @@ -@charset "UTF-8";body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:IntelClearRg}table.rounded{border-collapse:collapse;margin:auto}table.rounded tr.header{font-weight:700;text-align:center}table.rounded th.header{background:#fec91b;color:#000;vertical-align:middle}table.rounded td.header{background:#fec91b;border-bottom:1px solid #fafafa;border-radius:0;color:#000;padding:10px;text-align:center}table.rounded tr:nth-child(2n){background-color:hsla(0,0%,71%,.13)}table.rounded tr:nth-child(odd){background-color:hsla(0,0%,91%,.13)}table.rounded td.cell,table.rounded tr.cell{border-bottom:none;padding:5px}table.rounded tr:last-child td:last-child{border-radius:0 0 .5rem 0}table.rounded tr:last-child td:first-child{border-radius:0 0 0 .5rem}table.rounded tr:last-child td:only-child{border-radius:0 0 .5rem .5rem}table.rounded tr:first-child th:first-child{border-radius:.5rem 0 0 0}table.rounded tr:first-child th:last-child{border-radius:0 .5rem 0 0}table.rounded tr:first-child td:first-child{border-radius:.5rem 0 0 0}table.rounded tr:first-child td:last-child{border-radius:0 .5rem 0 0}table.rounded tr:first-child td:only-child{border-radius:.5rem .5rem 0 0}table.rounded tr:only-child td:only-child{border-radius:.5rem .5rem .5rem .5rem}table.rounded tr.active{background-color:rgba(255,224,122,.714)!important;color:#000}.right{text-align:right}.center{text-align:center}.btn-primary{background-color:#fec91b!important;border:2px solid #fec91b!important;color:#000!important}.btn-primary:focus,.btn-primary:hover{border:2px solid #000!important;color:#000!important}.btn-secondary{background-color:#fff!important;margin-bottom:4px;width:100%}.btn-secondary,.btn-secondary:hover{border-color:#fec91b!important;color:#000!important}.btn-secondary:hover{background-color:#fff2d0!important}.Diagnosis .property-table{border-collapse:collapse;width:100%}.Diagnosis .table-title{font-family:IntelClearBd;text-align:center}.Diagnosis .table-key{padding:5px;text-align:right}.Diagnosis .table-value{background-color:#ececec;border:2px solid #fff;padding:5px;text-align:left}.Diagnosis .data-panel{margin-bottom:6px}.Diagnosis .data-panel,.Diagnosis .data-panel-top{background-color:#fff;border-radius:.5rem;padding:10px}.Diagnosis .data-panel-top{margin-top:6px}.Diagnosis .flexbox{background-color:#ececec;display:flex;max-height:99vh}.Diagnosis .flexbox-inside{display:flex;flex-direction:column;flex-shrink:0;max-height:90vh;padding:3px}.Diagnosis .workloads-flex{display:flex;flex-direction:column;overflow:auto}.Diagnosis .overflow-table{background-color:#fff;border-radius:.5rem;max-height:calc(90vh - 96px);overflow:auto}.Diagnosis .flex-item{max-width:calc(100vw - 370px);padding:3px;width:98%}.Diagnosis .flex-bigger{padding:3px;width:98%}.Diagnosis .accuracy-table{width:98%}.Diagnosis .accuracy-number{color:#00c7fd;font-size:200%;padding-left:20px;text-align:center}.Diagnosis .accuracy-title{font-family:IntelOneRg;font-size:120%}.Diagnosis .accuracy-subtitle{color:#53565a;font-size:80%;padding-left:20px;text-align:center}.Diagnosis .clickable{cursor:pointer}.Diagnosis .nowrap{white-space:nowrap}.Diagnosis .alert{left:25vw;margin:auto;position:fixed;top:40vh;width:50vw;z-index:100}.Diagnosis .spinner-container{margin:auto;padding:20px;width:50px}.Diagnosis .spinner{color:#5b69ff}*{font-family:IntelClearRg}.Graph #cy{background:#fafafa;background-image:radial-gradient(#bebebe 1px,transparent 0);background-size:18px 18px;border-radius:.5rem;height:90vh;margin:auto;position:relative}.Graph .plus-sign{background-color:#5b69ff;border-radius:50%;color:#fff;cursor:pointer;height:25px;text-align:center;width:25px}.Graph .graph-buttons{float:right;margin-top:6px;position:absolute;z-index:10}.Graph .graph-button{background-color:#fec91b;border:none;color:#000;cursor:pointer;margin-left:6px}.Graph .nodes-table-container{background-color:hsla(0,0%,71%,.13);left:5px;position:absolute;top:50px}.Graph .nodes-table{font-family:IntelClearRg;width:200px}.Graph .header{font-family:IntelClearBd;text-align:left}.histogram-btn{float:right}#opDetails{height:560px;max-width:40vw}.Histogram{background-color:#fff;border-radius:.5rem;min-width:60vw;padding:10px}.active{background-color:#fec91b!important}.date{color:#53565a;font-size:80%}.details-list{width:100%}.delete-button{float:right;height:25px;width:25px}@font-face{font-family:IntelOneRg;src:url(/static/media/intelone-display-regular.0f8c3ef25c545acb6b7c.ttf)}@font-face{font-family:IntelOneLt;src:url(/static/media/intelone-display-light.68a9d0311f7374acb0cf.ttf)}@font-face{font-family:IntelOneBd;src:url(/static/media/intelone-display-bold.64a6eab04dcda9c570c8.ttf)}@font-face{font-family:IntelClearRg;src:url(/static/media/IntelClear_Rg.33af11200cffaf9540ff.ttf)}@font-face{font-family:IntelClearLt;src:url(/static/media/IntelClear_Lt.c5e18e9d5505364da760.ttf)}@font-face{font-family:IntelClearBd;src:url(/static/media/IntelClear_Bd.060888be7dccf869db54.ttf)}@font-face{font-family:IntelOneMono;src:url(/static/media/intelone-mono-font-family-regular.de914c9a804c00b4f3e5.ttf)}.summary{font-family:IntelOneMono;max-height:90vh;overflow:auto;white-space:pre}.Profiling .data-panel{width:100%}.ascending:after{content:"↑"}.ascending:after,.descending:after{display:inline-block;margin-left:1em}.descending:after{content:"↓"}/*! - * Bootstrap v5.3.0 (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:#0d6efd;--bs-indigo:#6610f2;--bs-purple:#6f42c1;--bs-pink:#d63384;--bs-red:#dc3545;--bs-orange:#fd7e14;--bs-yellow:#ffc107;--bs-green:#198754;--bs-teal:#20c997;--bs-cyan:#0dcaf0;--bs-black:#000;--bs-white:#fff;--bs-gray:#6c757d;--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:#6c757d;--bs-gray-700:#495057;--bs-gray-800:#343a40;--bs-gray-900:#212529;--bs-primary:#0d6efd;--bs-secondary:#6c757d;--bs-success:#198754;--bs-info:#0dcaf0;--bs-warning:#ffc107;--bs-danger:#dc3545;--bs-light:#f8f9fa;--bs-dark:#212529;--bs-primary-rgb:13,110,253;--bs-secondary-rgb:108,117,125;--bs-success-rgb:25,135,84;--bs-info-rgb:13,202,240;--bs-warning-rgb:255,193,7;--bs-danger-rgb:220,53,69;--bs-light-rgb:248,249,250;--bs-dark-rgb:33,37,41;--bs-primary-text-emphasis:#052c65;--bs-secondary-text-emphasis:#2b2f32;--bs-success-text-emphasis:#0a3622;--bs-info-text-emphasis:#055160;--bs-warning-text-emphasis:#664d03;--bs-danger-text-emphasis:#58151c;--bs-light-text-emphasis:#495057;--bs-dark-text-emphasis:#495057;--bs-primary-bg-subtle:#cfe2ff;--bs-secondary-bg-subtle:#e2e3e5;--bs-success-bg-subtle:#d1e7dd;--bs-info-bg-subtle:#cff4fc;--bs-warning-bg-subtle:#fff3cd;--bs-danger-bg-subtle:#f8d7da;--bs-light-bg-subtle:#fcfcfd;--bs-dark-bg-subtle:#ced4da;--bs-primary-border-subtle:#9ec5fe;--bs-secondary-border-subtle:#c4c8cb;--bs-success-border-subtle:#a3cfbb;--bs-info-border-subtle:#9eeaf9;--bs-warning-border-subtle:#ffe69c;--bs-danger-border-subtle:#f1aeb5;--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,hsla(0,0%,100%,.15),hsla(0,0%,100%,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:#212529;--bs-body-color-rgb:33,37,41;--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(33,37,41,.75);--bs-secondary-color-rgb:33,37,41;--bs-secondary-bg:#e9ecef;--bs-secondary-bg-rgb:233,236,239;--bs-tertiary-color:rgba(33,37,41,.5);--bs-tertiary-color-rgb:33,37,41;--bs-tertiary-bg:#f8f9fa;--bs-tertiary-bg-rgb:248,249,250;--bs-heading-color:inherit;--bs-link-color:#0d6efd;--bs-link-color-rgb:13,110,253;--bs-link-decoration:underline;--bs-link-hover-color:#0a58ca;--bs-link-hover-color-rgb:10,88,202;--bs-code-color:#d63384;--bs-highlight-bg:#fff3cd;--bs-border-width:1px;--bs-border-style:solid;--bs-border-color:#dee2e6;--bs-border-color-translucent:rgba(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,.15);--bs-box-shadow-sm:0 0.125rem 0.25rem rgba(0,0,0,.075);--bs-box-shadow-lg:0 1rem 3rem rgba(0,0,0,.175);--bs-box-shadow-inset:inset 0 1px 2px rgba(0,0,0,.075);--bs-focus-ring-width:0.25rem;--bs-focus-ring-opacity:0.25;--bs-focus-ring-color:rgba(13,110,253,.25);--bs-form-valid-color:#198754;--bs-form-valid-border-color:#198754;--bs-form-invalid-color:#dc3545;--bs-form-invalid-border-color:#dc3545}[data-bs-theme=dark]{--bs-body-color:#adb5bd;--bs-body-color-rgb:173,181,189;--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(173,181,189,.75);--bs-secondary-color-rgb:173,181,189;--bs-secondary-bg:#343a40;--bs-secondary-bg-rgb:52,58,64;--bs-tertiary-color:rgba(173,181,189,.5);--bs-tertiary-color-rgb:173,181,189;--bs-tertiary-bg:#2b3035;--bs-tertiary-bg-rgb:43,48,53;--bs-primary-text-emphasis:#6ea8fe;--bs-secondary-text-emphasis:#a7acb1;--bs-success-text-emphasis:#75b798;--bs-info-text-emphasis:#6edff6;--bs-warning-text-emphasis:#ffda6a;--bs-danger-text-emphasis:#ea868f;--bs-light-text-emphasis:#f8f9fa;--bs-dark-text-emphasis:#dee2e6;--bs-primary-bg-subtle:#031633;--bs-secondary-bg-subtle:#161719;--bs-success-bg-subtle:#051b11;--bs-info-bg-subtle:#032830;--bs-warning-bg-subtle:#332701;--bs-danger-bg-subtle:#2c0b0e;--bs-light-bg-subtle:#343a40;--bs-dark-bg-subtle:#1a1d20;--bs-primary-border-subtle:#084298;--bs-secondary-border-subtle:#41464b;--bs-success-border-subtle:#0f5132;--bs-info-border-subtle:#087990;--bs-warning-border-subtle:#997404;--bs-danger-border-subtle:#842029;--bs-light-border-subtle:#495057;--bs-dark-border-subtle:#343a40;--bs-heading-color:inherit;--bs-link-color:#6ea8fe;--bs-link-hover-color:#8bb9fe;--bs-link-color-rgb:110,168,254;--bs-link-hover-color-rgb:139,185,254;--bs-code-color:#e685b5;--bs-border-color:#495057;--bs-border-color-translucent:hsla(0,0%,100%,.15);--bs-form-valid-color:#75b798;--bs-form-valid-border-color:#75b798;--bs-form-invalid-color:#ea868f;--bs-form-invalid-border-color:#ea868f;color-scheme:dark}*,:after,:before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent;background-color:#fff;background-color:var(--bs-body-bg);color:#212529;color:var(--bs-body-color);font-family: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;font-family:var(--bs-body-font-family);font-size:1rem;font-size:var(--bs-body-font-size);font-weight:400;font-weight:var(--bs-body-font-weight);line-height:1.5;line-height:var(--bs-body-line-height);margin:0;text-align:var(--bs-body-text-align)}hr{border:0;border-top:1px solid;border-top:var(--bs-border-width) solid;color:inherit;margin:1rem 0;opacity:.25}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{color:inherit;color:var(--bs-heading-color);font-weight:500;line-height:1.2;margin-bottom:.5rem;margin-top:0}.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-bottom:1rem;margin-top:0}abbr[title]{cursor:help;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit;margin-bottom:1rem}ol,ul{padding-left:2rem}dl,ol,ul{margin-bottom:1rem;margin-top:0}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{background-color:#fff3cd;background-color:var(--bs-highlight-bg);padding:.1875em}sub,sup{font-size:.75em;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;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:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-family:var(--bs-font-monospace);font-size:1em}pre{display:block;font-size:.875em;margin-bottom:1rem;margin-top:0;overflow:auto}pre code{color:inherit;font-size:inherit;word-break:normal}code{word-wrap:break-word;color:#d63384;color:var(--bs-code-color);font-size:.875em}a>code{color:inherit}kbd{background-color:#212529;background-color:var(--bs-body-color);border-radius:.25rem;color:#fff;color:var(--bs-body-bg);font-size:.875em;padding:.1875rem .375rem}kbd kbd{font-size:1em;padding:0}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{border-collapse:collapse;caption-side:bottom}caption{color:rgba(33,37,41,.75);color:var(--bs-secondary-color);padding-bottom:.5rem;padding-top:.5rem;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border:0 solid;border-color:inherit}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit;margin:0}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{border-style:none;padding:0}textarea{resize:vertical}fieldset{border:0;margin:0;min-width:0;padding:0}legend{float:left;font-size:calc(1.275rem + .3vw);line-height:inherit;margin-bottom:.5rem;padding:0;width:100%}@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{-webkit-appearance:button;font:inherit}::file-selector-button{-webkit-appearance:button;font:inherit}output{display:inline-block}iframe{border:0}summary{cursor:pointer;display:list-item}progress{vertical-align:initial}[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-inline,.list-unstyled{list-style:none;padding-left:0}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:.875em;text-transform:uppercase}.blockquote{font-size:1.25rem;margin-bottom:1rem}.blockquote>:last-child{margin-bottom:0}.blockquote-footer{color:#6c757d;font-size:.875em;margin-bottom:1rem;margin-top:-1rem}.blockquote-footer:before{content:"— "}.img-fluid,.img-thumbnail{height:auto;max-width:100%}.img-thumbnail{background-color:#fff;background-color:var(--bs-body-bg);border:1px solid #dee2e6;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:.375rem;border-radius:var(--bs-border-radius);padding:.25rem}.figure{display:inline-block}.figure-img{line-height:1;margin-bottom:.5rem}.figure-caption{color:rgba(33,37,41,.75);color:var(--bs-secondary-color);font-size:.875em}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl,.container-xxl{--bs-gutter-x:1.5rem;--bs-gutter-y:0;margin-left:auto;margin-right:auto;padding-left:calc(var(--bs-gutter-x)*.5);padding-right:calc(var(--bs-gutter-x)*.5);width:100%}@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-left:calc(var(--bs-gutter-x)*-.5);margin-right:calc(var(--bs-gutter-x)*-.5);margin-top:calc(var(--bs-gutter-y)*-1)}.row>*{flex-shrink:0;margin-top:var(--bs-gutter-y);max-width:100%;padding-left:calc(var(--bs-gutter-x)*.5);padding-right:calc(var(--bs-gutter-x)*.5);width:100%}.col{flex:1 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.3333333333%}.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.6666666667%}.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}.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.3333333333%}.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.6666666667%}.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}.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.3333333333%}.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.6666666667%}.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}.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.3333333333%}.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.6666666667%}.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}.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.3333333333%}.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.6666666667%}.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}.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.3333333333%}.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.6666666667%}.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-body-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-body-color);--bs-table-striped-bg:rgba(0,0,0,.05);--bs-table-active-color:var(--bs-body-color);--bs-table-active-bg:rgba(0,0,0,.1);--bs-table-hover-color:var(--bs-body-color);--bs-table-hover-bg:rgba(0,0,0,.075);border-color:var(--bs-table-border-color);margin-bottom:1rem;vertical-align:top;width:100%}.table>:not(caption)>*>*{background-color:var(--bs-table-bg);border-bottom-width:1px;border-bottom-width:var(--bs-border-width);box-shadow:inset 0 0 0 9999px var(--bs-table-accent-bg);box-shadow:inset 0 0 0 9999px var(--bs-table-bg-state,var(--bs-table-bg-type,var(--bs-table-accent-bg)));color:var(--bs-table-color);color:var(--bs-table-color-state,var(--bs-table-color-type,var(--bs-table-color)));padding:.5rem}.table>tbody{vertical-align:inherit}.table>thead{vertical-align:bottom}.table-group-divider{border-top:2px solid;border-top:calc(var(--bs-border-width)*2) solid}.caption-top{caption-side:top}.table-sm>:not(caption)>*>*{padding:.25rem}.table-bordered>:not(caption)>*{border-width:1px 0;border-width:var(--bs-border-width) 0}.table-bordered>:not(caption)>*>*{border-width:0 1px;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-columns>:not(caption)>tr>:nth-child(2n),.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-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:#cfe2ff;--bs-table-border-color:#bacbe6;--bs-table-striped-bg:#c5d7f2;--bs-table-striped-color:#000;--bs-table-active-bg:#bacbe6;--bs-table-active-color:#000;--bs-table-hover-bg:#bfd1ec;--bs-table-hover-color:#000}.table-primary,.table-secondary{border-color:var(--bs-table-border-color);color:var(--bs-table-color)}.table-secondary{--bs-table-color:#000;--bs-table-bg:#e2e3e5;--bs-table-border-color:#cbccce;--bs-table-striped-bg:#d7d8da;--bs-table-striped-color:#000;--bs-table-active-bg:#cbccce;--bs-table-active-color:#000;--bs-table-hover-bg:#d1d2d4;--bs-table-hover-color:#000}.table-success{--bs-table-color:#000;--bs-table-bg:#d1e7dd;--bs-table-border-color:#bcd0c7;--bs-table-striped-bg:#c7dbd2;--bs-table-striped-color:#000;--bs-table-active-bg:#bcd0c7;--bs-table-active-color:#000;--bs-table-hover-bg:#c1d6cc;--bs-table-hover-color:#000}.table-info,.table-success{border-color:var(--bs-table-border-color);color:var(--bs-table-color)}.table-info{--bs-table-color:#000;--bs-table-bg:#cff4fc;--bs-table-border-color:#badce3;--bs-table-striped-bg:#c5e8ef;--bs-table-striped-color:#000;--bs-table-active-bg:#badce3;--bs-table-active-color:#000;--bs-table-hover-bg:#bfe2e9;--bs-table-hover-color:#000}.table-warning{--bs-table-color:#000;--bs-table-bg:#fff3cd;--bs-table-border-color:#e6dbb9;--bs-table-striped-bg:#f2e7c3;--bs-table-striped-color:#000;--bs-table-active-bg:#e6dbb9;--bs-table-active-color:#000;--bs-table-hover-bg:#ece1be;--bs-table-hover-color:#000}.table-danger,.table-warning{border-color:var(--bs-table-border-color);color:var(--bs-table-color)}.table-danger{--bs-table-color:#000;--bs-table-bg:#f8d7da;--bs-table-border-color:#dfc2c4;--bs-table-striped-bg:#eccccf;--bs-table-striped-color:#000;--bs-table-active-bg:#dfc2c4;--bs-table-active-color:#000;--bs-table-hover-bg:#e5c7ca;--bs-table-hover-color:#000}.table-light{--bs-table-color:#000;--bs-table-bg:#f8f9fa;--bs-table-border-color:#dfe0e1;--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}.table-dark,.table-light{border-color:var(--bs-table-border-color);color:var(--bs-table-color)}.table-dark{--bs-table-color:#fff;--bs-table-bg:#212529;--bs-table-border-color:#373b3e;--bs-table-striped-bg:#2c3034;--bs-table-striped-color:#fff;--bs-table-active-bg:#373b3e;--bs-table-active-color:#fff;--bs-table-hover-bg:#323539;--bs-table-hover-color:#fff}.table-responsive{-webkit-overflow-scrolling:touch;overflow-x:auto}@media (max-width:575.98px){.table-responsive-sm{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (max-width:767.98px){.table-responsive-md{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (max-width:991.98px){.table-responsive-lg{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (max-width:1199.98px){.table-responsive-xl{-webkit-overflow-scrolling:touch;overflow-x:auto}}@media (max-width:1399.98px){.table-responsive-xxl{-webkit-overflow-scrolling:touch;overflow-x:auto}}.form-label{margin-bottom:.5rem}.col-form-label{font-size:inherit;line-height:1.5;margin-bottom:0;padding-bottom:calc(.375rem + 1px);padding-bottom:calc(.375rem + var(--bs-border-width));padding-top:calc(.375rem + 1px);padding-top:calc(.375rem + var(--bs-border-width))}.col-form-label-lg{font-size:1.25rem;padding-bottom:calc(.5rem + 1px);padding-bottom:calc(.5rem + var(--bs-border-width));padding-top:calc(.5rem + 1px);padding-top:calc(.5rem + var(--bs-border-width))}.col-form-label-sm{font-size:.875rem;padding-bottom:calc(.25rem + 1px);padding-bottom:calc(.25rem + var(--bs-border-width));padding-top:calc(.25rem + 1px);padding-top:calc(.25rem + var(--bs-border-width))}.form-text{color:rgba(33,37,41,.75);color:var(--bs-secondary-color);font-size:.875em;margin-top:.25rem}.form-control{-webkit-appearance:none;appearance:none;background-clip:padding-box;background-color:#fff;background-color:var(--bs-body-bg);border:1px solid #dee2e6;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:.375rem;border-radius:var(--bs-border-radius);color:#212529;color:var(--bs-body-color);display:block;font-size:1rem;font-weight:400;line-height:1.5;padding:.375rem .75rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}@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{background-color:#fff;background-color:var(--bs-body-bg);border-color:#86b7fe;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);color:#212529;color:var(--bs-body-color);outline:0}.form-control::-webkit-date-and-time-value{height:1.5em;margin:0;min-width:85px}.form-control::-webkit-datetime-edit{display:block;padding:0}.form-control::-webkit-input-placeholder{color:rgba(33,37,41,.75);color:var(--bs-secondary-color);opacity:1}.form-control::placeholder{color:rgba(33,37,41,.75);color:var(--bs-secondary-color);opacity:1}.form-control:disabled{background-color:#e9ecef;background-color:var(--bs-secondary-bg);opacity:1}.form-control::-webkit-file-upload-button{-webkit-margin-end:.75rem;background-color:#f8f9fa;background-color:var(--bs-tertiary-bg);border:0 solid;border-color:inherit;border-inline-end-width:1px;border-inline-end-width:var(--bs-border-width);border-radius:0;color:#212529;color:var(--bs-body-color);margin:-.375rem -.75rem;margin-inline-end:.75rem;padding:.375rem .75rem;pointer-events:none;-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{-webkit-margin-end:.75rem;background-color:#f8f9fa;background-color:var(--bs-tertiary-bg);border:0 solid;border-color:inherit;border-inline-end-width:1px;border-inline-end-width:var(--bs-border-width);border-radius:0;color:#212529;color:var(--bs-body-color);margin:-.375rem -.75rem;margin-inline-end:.75rem;padding:.375rem .75rem;pointer-events:none;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:#e9ecef;background-color:var(--bs-secondary-bg)}.form-control:hover:not(:disabled):not([readonly])::file-selector-button{background-color:#e9ecef;background-color:var(--bs-secondary-bg)}.form-control-plaintext{background-color:initial;border:solid transparent;border-width:1px 0;border-width:var(--bs-border-width) 0;color:#212529;color:var(--bs-body-color);display:block;line-height:1.5;margin-bottom:0;padding:.375rem 0;width:100%}.form-control-plaintext:focus{outline:0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-left:0;padding-right:0}.form-control-sm{border-radius:.25rem;border-radius:var(--bs-border-radius-sm);font-size:.875rem;min-height:calc(1.5em + .5rem + 2px);min-height:calc(1.5em + .5rem + var(--bs-border-width)*2);padding:.25rem .5rem}.form-control-sm::-webkit-file-upload-button{-webkit-margin-end:.5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem;padding:.25rem .5rem}.form-control-sm::file-selector-button{-webkit-margin-end:.5rem;margin:-.25rem -.5rem;margin-inline-end:.5rem;padding:.25rem .5rem}.form-control-lg{border-radius:.5rem;border-radius:var(--bs-border-radius-lg);font-size:1.25rem;min-height:calc(1.5em + 1rem + 2px);min-height:calc(1.5em + 1rem + var(--bs-border-width)*2);padding:.5rem 1rem}.form-control-lg::-webkit-file-upload-button{-webkit-margin-end:1rem;margin:-.5rem -1rem;margin-inline-end:1rem;padding:.5rem 1rem}.form-control-lg::file-selector-button{-webkit-margin-end:1rem;margin:-.5rem -1rem;margin-inline-end:1rem;padding:.5rem 1rem}textarea.form-control{min-height:calc(1.5em + .75rem + 2px);min-height:calc(1.5em + .75rem + var(--bs-border-width)*2)}textarea.form-control-sm{min-height:calc(1.5em + .5rem + 2px);min-height:calc(1.5em + .5rem + var(--bs-border-width)*2)}textarea.form-control-lg{min-height:calc(1.5em + 1rem + 2px);min-height:calc(1.5em + 1rem + var(--bs-border-width)*2)}.form-control-color{height:calc(1.5em + .75rem + 2px);height:calc(1.5em + .75rem + var(--bs-border-width)*2);padding:.375rem;width:3rem}.form-control-color:not(:disabled):not([readonly]){cursor:pointer}.form-control-color::-moz-color-swatch{border:0!important;border-radius:.375rem;border-radius:var(--bs-border-radius)}.form-control-color::-webkit-color-swatch{border:0!important;border-radius:.375rem;border-radius:var(--bs-border-radius)}.form-control-color.form-control-sm{height:calc(1.5em + .5rem + 2px);height:calc(1.5em + .5rem + var(--bs-border-width)*2)}.form-control-color.form-control-lg{height:calc(1.5em + 1rem + 2px);height:calc(1.5em + 1rem + var(--bs-border-width)*2)}.form-select{--bs-form-select-bg-img:url("data:image/svg+xml;charset=utf-8,%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");-webkit-appearance:none;appearance:none;background-color:#fff;background-color:var(--bs-body-bg);background-image:var(--bs-form-select-bg-img),none;background-image:var(--bs-form-select-bg-img),var(--bs-form-select-bg-icon,none);background-position:right .75rem center;background-repeat:no-repeat;background-size:16px 12px;border:1px solid #dee2e6;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:.375rem;border-radius:var(--bs-border-radius);color:#212529;color:var(--bs-body-color);display:block;font-size:1rem;font-weight:400;line-height:1.5;padding:.375rem 2.25rem .375rem .75rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.form-select{transition:none}}.form-select:focus{border-color:#86b7fe;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);outline:0}.form-select[multiple],.form-select[size]:not([size="1"]){background-image:none;padding-right:.75rem}.form-select:disabled{background-color:#e9ecef;background-color:var(--bs-secondary-bg)}.form-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #212529;text-shadow:0 0 0 var(--bs-body-color)}.form-select-sm{border-radius:.25rem;border-radius:var(--bs-border-radius-sm);font-size:.875rem;padding-bottom:.25rem;padding-left:.5rem;padding-top:.25rem}.form-select-lg{border-radius:.5rem;border-radius:var(--bs-border-radius-lg);font-size:1.25rem;padding-bottom:.5rem;padding-left:1rem;padding-top:.5rem}[data-bs-theme=dark] .form-select{--bs-form-select-bg-img:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath fill='none' stroke='%23adb5bd' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3E%3C/svg%3E")}.form-check{display:block;margin-bottom:.125rem;min-height:1.5rem;padding-left:1.5em}.form-check .form-check-input{float:left;margin-left:-1.5em}.form-check-reverse{padding-left:0;padding-right:1.5em;text-align:right}.form-check-reverse .form-check-input{float:right;margin-left:0;margin-right:-1.5em}.form-check-input{--bs-form-check-bg:var(--bs-body-bg);-webkit-appearance:none;appearance:none;background-color:var(--bs-form-check-bg);background-image:var(--bs-form-check-bg-image);background-position:50%;background-repeat:no-repeat;background-size:contain;border:1px solid #dee2e6;border:var(--bs-border-width) solid var(--bs-border-color);height:1em;margin-top:.25em;-webkit-print-color-adjust:exact;print-color-adjust:exact;vertical-align:top;width:1em}.form-check-input[type=checkbox]{border-radius:.25em}.form-check-input[type=radio]{border-radius:50%}.form-check-input:active{-webkit-filter:brightness(90%);filter:brightness(90%)}.form-check-input:focus{border-color:#86b7fe;box-shadow:0 0 0 .25rem rgba(13,110,253,.25);outline:0}.form-check-input:checked{background-color:#0d6efd;border-color:#0d6efd}.form-check-input:checked[type=checkbox]{--bs-form-check-bg-image:url("data:image/svg+xml;charset=utf-8,%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;charset=utf-8,%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{--bs-form-check-bg-image:url("data:image/svg+xml;charset=utf-8,%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");background-color:#0d6efd;border-color:#0d6efd}.form-check-input:disabled{-webkit-filter:none;filter:none;opacity:.5;pointer-events:none}.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;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='rgba(0, 0, 0, 0.25)'/%3E%3C/svg%3E");background-image:var(--bs-form-switch-bg);background-position:0;border-radius:2em;margin-left:-2.5em;transition:background-position .15s ease-in-out;width:2em}@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;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%2386b7fe'/%3E%3C/svg%3E")}.form-switch .form-check-input:checked{--bs-form-switch-bg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E");background-position:100%}.form-switch.form-check-reverse{padding-left:0;padding-right:2.5em}.form-switch.form-check-reverse .form-check-input{margin-left:0;margin-right:-2.5em}.form-check-inline{display:inline-block;margin-right:1rem}.btn-check{clip:rect(0,0,0,0);pointer-events:none;position:absolute}.btn-check:disabled+.btn,.btn-check[disabled]+.btn{-webkit-filter:none;filter:none;opacity:.65;pointer-events:none}[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus){--bs-form-switch-bg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='rgba(255, 255, 255, 0.25)'/%3E%3C/svg%3E")}.form-range{-webkit-appearance:none;appearance:none;background-color:initial;height:1.5rem;padding:0;width:100%}.form-range:focus{outline:0}.form-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #fff,0 0 0 .25rem rgba(13,110,253,.25)}.form-range::-moz-focus-outer{border:0}.form-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;height:1rem;margin-top:-.25rem;-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;width:1rem}@media (prefers-reduced-motion:reduce){.form-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.form-range::-webkit-slider-thumb:active{background-color:#b6d4fe}.form-range::-webkit-slider-runnable-track{background-color:#f8f9fa;background-color:var(--bs-tertiary-bg);border-color:transparent;border-radius:1rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.form-range::-moz-range-thumb{appearance:none;background-color:#0d6efd;border:0;border-radius:1rem;height: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;width:1rem}@media (prefers-reduced-motion:reduce){.form-range::-moz-range-thumb{-moz-transition:none;transition:none}}.form-range::-moz-range-thumb:active{background-color:#b6d4fe}.form-range::-moz-range-track{background-color:#f8f9fa;background-color:var(--bs-tertiary-bg);border-color:transparent;border-radius:1rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.form-range:disabled{pointer-events:none}.form-range:disabled::-webkit-slider-thumb{background-color:rgba(33,37,41,.75);background-color:var(--bs-secondary-color)}.form-range:disabled::-moz-range-thumb{background-color:rgba(33,37,41,.75);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 + 2px);height:calc(3.5rem + var(--bs-border-width)*2);line-height:1.25;min-height:calc(3.5rem + 2px);min-height:calc(3.5rem + var(--bs-border-width)*2)}.form-floating>label{border:1px solid transparent;border:var(--bs-border-width) solid transparent;height:100%;left:0;overflow:hidden;padding:1rem .75rem;pointer-events:none;position:absolute;text-align:start;text-overflow:ellipsis;top:0;-webkit-transform-origin:0 0;transform-origin:0 0;transition:opacity .1s ease-in-out,-webkit-transform .1s ease-in-out;transition:opacity .1s ease-in-out,transform .1s ease-in-out;transition:opacity .1s ease-in-out,transform .1s ease-in-out,-webkit-transform .1s ease-in-out;white-space:nowrap;z-index:2}@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::-webkit-input-placeholder,.form-floating>.form-control::-webkit-input-placeholder{color:transparent}.form-floating>.form-control-plaintext::placeholder,.form-floating>.form-control::placeholder{color:transparent}.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-bottom:.625rem;padding-top:1.625rem}.form-floating>.form-control-plaintext:-webkit-autofill,.form-floating>.form-control:-webkit-autofill{padding-bottom:.625rem;padding-top:1.625rem}.form-floating>.form-select{padding-bottom:.625rem;padding-top:1.625rem}.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(33,37,41,.65);color:rgba(var(--bs-body-color-rgb),.65);-webkit-transform:scale(.85) translateY(-.5rem) translateX(.15rem);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.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{background-color:#fff;background-color:var(--bs-body-bg);border-radius:.375rem;border-radius:var(--bs-border-radius);content:"";height:1.5em;inset:1rem .375rem;position:absolute;z-index:-1}.form-floating>.form-control:-webkit-autofill~label{color:rgba(33,37,41,.65);color:rgba(var(--bs-body-color-rgb),.65);-webkit-transform:scale(.85) translateY(-.5rem) translateX(.15rem);transform:scale(.85) translateY(-.5rem) translateX(.15rem)}.form-floating>.form-control-plaintext~label{border-width:1px 0;border-width:var(--bs-border-width) 0}.form-floating>:disabled~label{color:#6c757d}.form-floating>:disabled~label:after{background-color:#e9ecef;background-color:var(--bs-secondary-bg)}.input-group{align-items:stretch;display:flex;flex-wrap:wrap;position:relative;width:100%}.input-group>.form-control,.input-group>.form-floating,.input-group>.form-select{flex:1 1 auto;min-width:0;position:relative;width:1%}.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{align-items:center;background-color:#f8f9fa;background-color:var(--bs-tertiary-bg);border:1px solid #dee2e6;border:var(--bs-border-width) solid var(--bs-border-color);border-radius:.375rem;border-radius:var(--bs-border-radius);color:#212529;color:var(--bs-body-color);display:flex;font-size:1rem;font-weight:400;line-height:1.5;padding:.375rem .75rem;text-align:center;white-space:nowrap}.input-group-lg>.btn,.input-group-lg>.form-control,.input-group-lg>.form-select,.input-group-lg>.input-group-text{border-radius:.5rem;border-radius:var(--bs-border-radius-lg);font-size:1.25rem;padding:.5rem 1rem}.input-group-sm>.btn,.input-group-sm>.form-control,.input-group-sm>.form-select,.input-group-sm>.input-group-text{border-radius:.25rem;border-radius:var(--bs-border-radius-sm);font-size:.875rem;padding:.25rem .5rem}.input-group-lg>.form-select,.input-group-sm>.form-select{padding-right:3rem}.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),.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-bottom-right-radius:0;border-top-right-radius:0}.input-group>:not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback){border-bottom-left-radius:0;border-top-left-radius:0;margin-left:-1px;margin-left:calc(var(--bs-border-width)*-1)}.input-group>.form-floating:not(:first-child)>.form-control,.input-group>.form-floating:not(:first-child)>.form-select{border-bottom-left-radius:0;border-top-left-radius:0}.valid-feedback{color:#198754;color:var(--bs-form-valid-color);display:none;font-size:.875em;margin-top:.25rem;width:100%}.valid-tooltip{background-color:#198754;background-color:var(--bs-success);border-radius:.375rem;border-radius:var(--bs-border-radius);color:#fff;display:none;font-size:.875rem;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.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{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23198754' 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-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#198754;border-color:var(--bs-form-valid-border-color);padding-right:calc(1.5em + .75rem)}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#198754;border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(25,135,84,.25);box-shadow:0 0 0 .25rem rgba(var(--bs-success-rgb),.25)}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.form-select.is-valid,.was-validated .form-select:valid{border-color:#198754;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;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23198754' 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-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem);padding-right:4.125rem}.form-select.is-valid:focus,.was-validated .form-select:valid:focus{border-color:#198754;border-color:var(--bs-form-valid-border-color);box-shadow:0 0 0 .25rem rgba(25,135,84,.25);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(3.75rem + 1.5em)}.form-check-input.is-valid,.was-validated .form-check-input:valid{border-color:#198754;border-color:var(--bs-form-valid-border-color)}.form-check-input.is-valid:checked,.was-validated .form-check-input:valid:checked{background-color:#198754;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(25,135,84,.25);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:#198754;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{color:#dc3545;color:var(--bs-form-invalid-color);display:none;font-size:.875em;margin-top:.25rem;width:100%}.invalid-tooltip{background-color:#dc3545;background-color:var(--bs-danger);border-radius:.375rem;border-radius:var(--bs-border-radius);color:#fff;display:none;font-size:.875rem;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.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{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%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='%23dc3545' stroke='none'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#dc3545;border-color:var(--bs-form-invalid-border-color);padding-right:calc(1.5em + .75rem)}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc3545;border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(220,53,69,.25);box-shadow:0 0 0 .25rem rgba(var(--bs-danger-rgb),.25)}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.form-select.is-invalid,.was-validated .form-select:invalid{border-color:#dc3545;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;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc3545'%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='%23dc3545' stroke='none'/%3E%3C/svg%3E");background-position:right .75rem center,center right 2.25rem;background-size:16px 12px,calc(.75em + .375rem) calc(.75em + .375rem);padding-right:4.125rem}.form-select.is-invalid:focus,.was-validated .form-select:invalid:focus{border-color:#dc3545;border-color:var(--bs-form-invalid-border-color);box-shadow:0 0 0 .25rem rgba(220,53,69,.25);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(3.75rem + 1.5em)}.form-check-input.is-invalid,.was-validated .form-check-input:invalid{border-color:#dc3545;border-color:var(--bs-form-invalid-border-color)}.form-check-input.is-invalid:checked,.was-validated .form-check-input:invalid:checked{background-color:#dc3545;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(220,53,69,.25);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:#dc3545;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 hsla(0,0%,100%,.15),0 1px 1px rgba(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);background-color:var(--bs-btn-bg);border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);color:var(--bs-btn-color);cursor:pointer;display:inline-block;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);padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-user-select:none;user-select:none;vertical-align:middle}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);color:var(--bs-btn-hover-color)}.btn-check+.btn:hover{background-color:var(--bs-btn-bg);border-color:var(--bs-btn-border-color);color:var(--bs-btn-color)}.btn:focus-visible{background-color:var(--bs-btn-hover-bg);border-color:var(--bs-btn-hover-border-color);box-shadow:var(--bs-btn-focus-box-shadow);color:var(--bs-btn-hover-color);outline:0}.btn-check:focus-visible+.btn{border-color:var(--bs-btn-hover-border-color);box-shadow:var(--bs-btn-focus-box-shadow);outline:0}.btn-check:checked+.btn,.btn.active,.btn.show,.btn:first-child:active,:not(.btn-check)+.btn:active{background-color:var(--bs-btn-active-bg);border-color:var(--bs-btn-active-border-color);color:var(--bs-btn-active-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{background-color:var(--bs-btn-disabled-bg);border-color:var(--bs-btn-disabled-border-color);color:var(--bs-btn-disabled-color);opacity:var(--bs-btn-disabled-opacity);pointer-events:none}.btn-primary{--bs-btn-color:#fff;--bs-btn-bg:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0b5ed7;--bs-btn-hover-border-color:#0a58ca;--bs-btn-focus-shadow-rgb:49,132,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0a58ca;--bs-btn-active-border-color:#0a53be;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#0d6efd;--bs-btn-disabled-border-color:#0d6efd}.btn-secondary{--bs-btn-color:#fff;--bs-btn-bg:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#5c636a;--bs-btn-hover-border-color:#565e64;--bs-btn-focus-shadow-rgb:130,138,145;--bs-btn-active-color:#fff;--bs-btn-active-bg:#565e64;--bs-btn-active-border-color:#51585e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#6c757d;--bs-btn-disabled-border-color:#6c757d}.btn-success{--bs-btn-color:#fff;--bs-btn-bg:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#157347;--bs-btn-hover-border-color:#146c43;--bs-btn-focus-shadow-rgb:60,153,110;--bs-btn-active-color:#fff;--bs-btn-active-bg:#146c43;--bs-btn-active-border-color:#13653f;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#198754;--bs-btn-disabled-border-color:#198754}.btn-info{--bs-btn-color:#000;--bs-btn-bg:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#31d2f2;--bs-btn-hover-border-color:#25cff2;--bs-btn-focus-shadow-rgb:11,172,204;--bs-btn-active-color:#000;--bs-btn-active-bg:#3dd5f3;--bs-btn-active-border-color:#25cff2;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#0dcaf0;--bs-btn-disabled-border-color:#0dcaf0}.btn-warning{--bs-btn-color:#000;--bs-btn-bg:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffca2c;--bs-btn-hover-border-color:#ffc720;--bs-btn-focus-shadow-rgb:217,164,6;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffcd39;--bs-btn-active-border-color:#ffc720;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#000;--bs-btn-disabled-bg:#ffc107;--bs-btn-disabled-border-color:#ffc107}.btn-danger{--bs-btn-color:#fff;--bs-btn-bg:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#bb2d3b;--bs-btn-hover-border-color:#b02a37;--bs-btn-focus-shadow-rgb:225,83,97;--bs-btn-active-color:#fff;--bs-btn-active-bg:#b02a37;--bs-btn-active-border-color:#a52834;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#dc3545;--bs-btn-disabled-border-color:#dc3545}.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,.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:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#424649;--bs-btn-hover-border-color:#373b3e;--bs-btn-focus-shadow-rgb:66,70,73;--bs-btn-active-color:#fff;--bs-btn-active-bg:#4d5154;--bs-btn-active-border-color:#373b3e;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#fff;--bs-btn-disabled-bg:#212529;--bs-btn-disabled-border-color:#212529}.btn-outline-primary{--bs-btn-color:#0d6efd;--bs-btn-border-color:#0d6efd;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#0d6efd;--bs-btn-hover-border-color:#0d6efd;--bs-btn-focus-shadow-rgb:13,110,253;--bs-btn-active-color:#fff;--bs-btn-active-bg:#0d6efd;--bs-btn-active-border-color:#0d6efd;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#0d6efd;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0d6efd;--bs-gradient:none}.btn-outline-secondary{--bs-btn-color:#6c757d;--bs-btn-border-color:#6c757d;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#6c757d;--bs-btn-hover-border-color:#6c757d;--bs-btn-focus-shadow-rgb:108,117,125;--bs-btn-active-color:#fff;--bs-btn-active-bg:#6c757d;--bs-btn-active-border-color:#6c757d;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#6c757d;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#6c757d;--bs-gradient:none}.btn-outline-success{--bs-btn-color:#198754;--bs-btn-border-color:#198754;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#198754;--bs-btn-hover-border-color:#198754;--bs-btn-focus-shadow-rgb:25,135,84;--bs-btn-active-color:#fff;--bs-btn-active-bg:#198754;--bs-btn-active-border-color:#198754;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#198754;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#198754;--bs-gradient:none}.btn-outline-info{--bs-btn-color:#0dcaf0;--bs-btn-border-color:#0dcaf0;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#0dcaf0;--bs-btn-hover-border-color:#0dcaf0;--bs-btn-focus-shadow-rgb:13,202,240;--bs-btn-active-color:#000;--bs-btn-active-bg:#0dcaf0;--bs-btn-active-border-color:#0dcaf0;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#0dcaf0;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#0dcaf0;--bs-gradient:none}.btn-outline-warning{--bs-btn-color:#ffc107;--bs-btn-border-color:#ffc107;--bs-btn-hover-color:#000;--bs-btn-hover-bg:#ffc107;--bs-btn-hover-border-color:#ffc107;--bs-btn-focus-shadow-rgb:255,193,7;--bs-btn-active-color:#000;--bs-btn-active-bg:#ffc107;--bs-btn-active-border-color:#ffc107;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#ffc107;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#ffc107;--bs-gradient:none}.btn-outline-danger{--bs-btn-color:#dc3545;--bs-btn-border-color:#dc3545;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#dc3545;--bs-btn-hover-border-color:#dc3545;--bs-btn-focus-shadow-rgb:220,53,69;--bs-btn-active-color:#fff;--bs-btn-active-bg:#dc3545;--bs-btn-active-border-color:#dc3545;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#dc3545;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#dc3545;--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,.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:#212529;--bs-btn-border-color:#212529;--bs-btn-hover-color:#fff;--bs-btn-hover-bg:#212529;--bs-btn-hover-border-color:#212529;--bs-btn-focus-shadow-rgb:33,37,41;--bs-btn-active-color:#fff;--bs-btn-active-bg:#212529;--bs-btn-active-border-color:#212529;--bs-btn-active-shadow:inset 0 3px 5px rgba(0,0,0,.125);--bs-btn-disabled-color:#212529;--bs-btn-disabled-bg:transparent;--bs-btn-disabled-border-color:#212529;--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:#6c757d;--bs-btn-disabled-border-color:transparent;--bs-btn-box-shadow:0 0 0 #000;--bs-btn-focus-shadow-rgb:49,132,253;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{height:auto;transition:width .35s ease;width:0}@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{border-bottom:0;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:.3em solid;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.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:0 0.5rem 1rem rgba(0,0,0,.15);--bs-dropdown-link-color:var(--bs-body-color);--bs-dropdown-link-hover-color:var(--bs-body-color);--bs-dropdown-link-hover-bg:var(--bs-tertiary-bg);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--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:#6c757d;--bs-dropdown-header-padding-x:1rem;--bs-dropdown-header-padding-y:0.5rem;background-clip:padding-box;background-color:var(--bs-dropdown-bg);border:var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);border-radius:var(--bs-dropdown-border-radius);color:var(--bs-dropdown-color);display:none;font-size:var(--bs-dropdown-font-size);list-style:none;margin:0;min-width:var(--bs-dropdown-min-width);padding:var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);position:absolute;text-align:left;z-index:var(--bs-dropdown-zindex)}.dropdown-menu[data-bs-popper]{left:0;margin-top:var(--bs-dropdown-spacer);top:100%}.dropdown-menu-start{--bs-position:start}.dropdown-menu-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-end{--bs-position:end}.dropdown-menu-end[data-bs-popper]{left:auto;right:0}@media (min-width:576px){.dropdown-menu-sm-start{--bs-position:start}.dropdown-menu-sm-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-sm-end{--bs-position:end}.dropdown-menu-sm-end[data-bs-popper]{left:auto;right:0}}@media (min-width:768px){.dropdown-menu-md-start{--bs-position:start}.dropdown-menu-md-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-md-end{--bs-position:end}.dropdown-menu-md-end[data-bs-popper]{left:auto;right:0}}@media (min-width:992px){.dropdown-menu-lg-start{--bs-position:start}.dropdown-menu-lg-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-lg-end{--bs-position:end}.dropdown-menu-lg-end[data-bs-popper]{left:auto;right:0}}@media (min-width:1200px){.dropdown-menu-xl-start{--bs-position:start}.dropdown-menu-xl-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-xl-end{--bs-position:end}.dropdown-menu-xl-end[data-bs-popper]{left:auto;right:0}}@media (min-width:1400px){.dropdown-menu-xxl-start{--bs-position:start}.dropdown-menu-xxl-start[data-bs-popper]{left:0;right:auto}.dropdown-menu-xxl-end{--bs-position:end}.dropdown-menu-xxl-end[data-bs-popper]{left:auto;right:0}}.dropup .dropdown-menu[data-bs-popper]{bottom:100%;margin-bottom:var(--bs-dropdown-spacer);margin-top:0;top:auto}.dropup .dropdown-toggle:after{border-bottom:.3em solid;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:0;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-menu[data-bs-popper]{left:100%;margin-left:var(--bs-dropdown-spacer);margin-top:0;right:auto;top:0}.dropend .dropdown-toggle:after{border-bottom:.3em solid transparent;border-left:.3em solid;border-right:0;border-top:.3em solid transparent;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropend .dropdown-toggle:empty:after{margin-left:0}.dropend .dropdown-toggle:after{vertical-align:0}.dropstart .dropdown-menu[data-bs-popper]{left:auto;margin-right:var(--bs-dropdown-spacer);margin-top:0;right:100%;top:0}.dropstart .dropdown-toggle:after{content:"";display:inline-block;display:none;margin-left:.255em;vertical-align:.255em}.dropstart .dropdown-toggle:before{border-bottom:.3em solid transparent;border-right:.3em solid;border-top:.3em solid transparent;content:"";display:inline-block;margin-right:.255em;vertical-align:.255em}.dropstart .dropdown-toggle:empty:after{margin-left:0}.dropstart .dropdown-toggle:before{vertical-align:0}.dropdown-divider{border-top:1px solid var(--bs-dropdown-divider-bg);height:0;margin:var(--bs-dropdown-divider-margin-y) 0;opacity:1;overflow:hidden}.dropdown-item{background-color:initial;border:0;border-radius:0;border-radius:var(--bs-dropdown-item-border-radius,0);clear:both;color:var(--bs-dropdown-link-color);display:block;font-weight:400;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);text-align:inherit;text-decoration:none;white-space:nowrap;width:100%}.dropdown-item:focus,.dropdown-item:hover{background-color:var(--bs-dropdown-link-hover-bg);color:var(--bs-dropdown-link-hover-color)}.dropdown-item.active,.dropdown-item:active{background-color:var(--bs-dropdown-link-active-bg);color:var(--bs-dropdown-link-active-color);text-decoration:none}.dropdown-item.disabled,.dropdown-item:disabled{background-color:initial;color:var(--bs-dropdown-link-disabled-color);pointer-events:none}.dropdown-menu.show{display:block}.dropdown-header{color:var(--bs-dropdown-header-color);display:block;font-size:.875rem;margin-bottom:0;padding:var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);white-space:nowrap}.dropdown-item-text{color:var(--bs-dropdown-link-color);display:block;padding:var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x)}.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:hsla(0,0%,100%,.15);--bs-dropdown-link-active-color:#fff;--bs-dropdown-link-active-bg:#0d6efd;--bs-dropdown-link-disabled-color:#adb5bd;--bs-dropdown-header-color:#adb5bd}.btn-group,.btn-group-vertical{display:inline-flex;position:relative;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{flex:1 1 auto;position:relative}.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:.375rem;border-radius:var(--bs-border-radius)}.btn-group>.btn-group:not(:first-child),.btn-group>:not(.btn-check:first-child)+.btn{margin-left:-1px;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-bottom-right-radius:0;border-top-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-bottom-left-radius:0;border-top-left-radius:0}.dropdown-toggle-split{padding-left:.5625rem;padding-right:.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-left:.375rem;padding-right:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-left:.75rem;padding-right:.75rem}.btn-group-vertical{align-items:flex-start;flex-direction:column;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:-1px;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-left-radius:0;border-bottom-right-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;list-style:none;margin-bottom:0;padding-left:0}.nav-link{background:0 0;border:0;color:var(--bs-nav-link-color);display:block;font-size:var(--bs-nav-link-font-size);font-weight:var(--bs-nav-link-font-weight);padding:var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);text-decoration:none;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{box-shadow:0 0 0 .25rem rgba(13,110,253,.25);outline:0}.nav-link.disabled{color:var(--bs-nav-link-disabled-color);cursor:default;pointer-events:none}.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{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);margin-bottom:calc(var(--bs-nav-tabs-border-width)*-1)}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:var(--bs-nav-tabs-link-hover-border-color);isolation:isolate}.nav-tabs .nav-link.disabled,.nav-tabs .nav-link:disabled{background-color:initial;border-color:transparent;color:var(--bs-nav-link-disabled-color)}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{background-color:var(--bs-nav-tabs-link-active-bg);border-color:var(--bs-nav-tabs-link-active-border-color);color:var(--bs-nav-tabs-link-active-color)}.nav-tabs .dropdown-menu{border-top-left-radius:0;border-top-right-radius:0;margin-top:calc(var(--bs-nav-tabs-border-width)*-1)}.nav-pills{--bs-nav-pills-border-radius:var(--bs-border-radius);--bs-nav-pills-link-active-color:#fff;--bs-nav-pills-link-active-bg:#0d6efd}.nav-pills .nav-link{border-radius:var(--bs-nav-pills-border-radius)}.nav-pills .nav-link:disabled{background-color:initial;border-color:transparent;color:var(--bs-nav-link-disabled-color)}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{background-color:var(--bs-nav-pills-link-active-bg);color:var(--bs-nav-pills-link-active-color)}.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{border-bottom:var(--bs-nav-underline-border-width) solid transparent;padding-left:0;padding-right:0}.nav-underline .nav-link:focus,.nav-underline .nav-link:hover{border-bottom-color:initial}.nav-underline .nav-link.active,.nav-underline .show>.nav-link{border-bottom-color:initial;color:var(--bs-nav-underline-link-active-color);font-weight:700}.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;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3E%3Cpath stroke='rgba(33, 37, 41, 0.75)' 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;align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between;padding:var(--bs-navbar-padding-y) var(--bs-navbar-padding-x);position:relative}.navbar>.container,.navbar>.container-fluid,.navbar>.container-lg,.navbar>.container-md,.navbar>.container-sm,.navbar>.container-xl,.navbar>.container-xxl{align-items:center;display:flex;flex-wrap:inherit;justify-content:space-between}.navbar-brand{color:var(--bs-navbar-brand-color);font-size:var(--bs-navbar-brand-font-size);margin-right:var(--bs-navbar-brand-margin-end);padding-bottom:var(--bs-navbar-brand-padding-y);padding-top:var(--bs-navbar-brand-padding-y);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;list-style:none;margin-bottom:0;padding-left:0}.navbar-nav .nav-link.active,.navbar-nav .nav-link.show{color:var(--bs-navbar-active-color)}.navbar-nav .dropdown-menu{position:static}.navbar-text{color:var(--bs-navbar-color);padding-bottom:.5rem;padding-top:.5rem}.navbar-text a,.navbar-text a:focus,.navbar-text a:hover{color:var(--bs-navbar-active-color)}.navbar-collapse{align-items:center;flex-basis:100%;flex-grow:1}.navbar-toggler{background-color:initial;border:var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);border-radius:var(--bs-navbar-toggler-border-radius);color:var(--bs-navbar-color);font-size:var(--bs-navbar-toggler-font-size);line-height:1;padding:var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);transition:var(--bs-navbar-toggler-transition)}@media (prefers-reduced-motion:reduce){.navbar-toggler{transition:none}}.navbar-toggler:hover{text-decoration:none}.navbar-toggler:focus{box-shadow:0 0 0 var(--bs-navbar-toggler-focus-width);outline:0;text-decoration:none}.navbar-toggler-icon{background-image:var(--bs-navbar-toggler-icon-bg);background-position:50%;background-repeat:no-repeat;background-size:100%;display:inline-block;height:1.5em;vertical-align:middle;width:1.5em}.navbar-nav-scroll{max-height:75vh;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-left:var(--bs-navbar-nav-link-padding-x);padding-right: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{background-color:initial!important;border:0!important;flex-grow:1;height:auto!important;position:static;-webkit-transform:none!important;transform:none!important;transition:none;visibility:visible!important;width:auto!important;z-index:auto}.navbar-expand-sm .offcanvas .offcanvas-header{display:none}.navbar-expand-sm .offcanvas .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}}@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-left:var(--bs-navbar-nav-link-padding-x);padding-right: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{background-color:initial!important;border:0!important;flex-grow:1;height:auto!important;position:static;-webkit-transform:none!important;transform:none!important;transition:none;visibility:visible!important;width:auto!important;z-index:auto}.navbar-expand-md .offcanvas .offcanvas-header{display:none}.navbar-expand-md .offcanvas .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}}@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-left:var(--bs-navbar-nav-link-padding-x);padding-right: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{background-color:initial!important;border:0!important;flex-grow:1;height:auto!important;position:static;-webkit-transform:none!important;transform:none!important;transition:none;visibility:visible!important;width:auto!important;z-index:auto}.navbar-expand-lg .offcanvas .offcanvas-header{display:none}.navbar-expand-lg .offcanvas .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}}@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-left:var(--bs-navbar-nav-link-padding-x);padding-right: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{background-color:initial!important;border:0!important;flex-grow:1;height:auto!important;position:static;-webkit-transform:none!important;transform:none!important;transition:none;visibility:visible!important;width:auto!important;z-index:auto}.navbar-expand-xl .offcanvas .offcanvas-header{display:none}.navbar-expand-xl .offcanvas .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}}@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-left:var(--bs-navbar-nav-link-padding-x);padding-right: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{background-color:initial!important;border:0!important;flex-grow:1;height:auto!important;position:static;-webkit-transform:none!important;transform:none!important;transition:none;visibility:visible!important;width:auto!important;z-index:auto}.navbar-expand-xxl .offcanvas .offcanvas-header{display:none}.navbar-expand-xxl .offcanvas .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}}.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-left:var(--bs-navbar-nav-link-padding-x);padding-right: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{background-color:initial!important;border:0!important;flex-grow:1;height:auto!important;position:static;-webkit-transform:none!important;transform:none!important;transition:none;visibility:visible!important;width:auto!important;z-index:auto}.navbar-expand .offcanvas .offcanvas-header{display:none}.navbar-expand .offcanvas .offcanvas-body{display:flex;flex-grow:0;overflow-y:visible;padding:0}.navbar-dark,.navbar[data-bs-theme=dark]{--bs-navbar-color:hsla(0,0%,100%,.55);--bs-navbar-hover-color:hsla(0,0%,100%,.75);--bs-navbar-disabled-color:hsla(0,0%,100%,.25);--bs-navbar-active-color:#fff;--bs-navbar-brand-color:#fff;--bs-navbar-brand-hover-color:#fff;--bs-navbar-toggler-border-color:hsla(0,0%,100%,.1)}.navbar-dark,.navbar[data-bs-theme=dark],[data-bs-theme=dark] .navbar-toggler-icon{--bs-navbar-toggler-icon-bg:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3E%3Cpath stroke='rgba(255, 255, 255, 0.55)' 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;word-wrap:break-word;background-clip:initial;background-color:var(--bs-card-bg);border:var(--bs-card-border-width) solid var(--bs-card-border-color);border-radius:var(--bs-card-border-radius);color:#212529;color:var(--bs-body-color);display:flex;flex-direction:column;height:var(--bs-card-height);min-width:0;position:relative}.card>hr{margin-left:0;margin-right:0}.card>.list-group{border-bottom:inherit;border-top:inherit}.card>.list-group:first-child{border-top-left-radius:var(--bs-card-inner-border-radius);border-top-right-radius:var(--bs-card-inner-border-radius);border-top-width:0}.card>.list-group:last-child{border-bottom-left-radius:var(--bs-card-inner-border-radius);border-bottom-right-radius:var(--bs-card-inner-border-radius);border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{color:var(--bs-card-color);flex:1 1 auto;padding:var(--bs-card-spacer-y) var(--bs-card-spacer-x)}.card-title{color:var(--bs-card-title-color);margin-bottom:var(--bs-card-title-spacer-y)}.card-subtitle{color:var(--bs-card-subtitle-color);margin-top:calc(var(--bs-card-title-spacer-y)*-.5)}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link+.card-link{margin-left:var(--bs-card-spacer-x)}.card-header{background-color:var(--bs-card-cap-bg);border-bottom:var(--bs-card-border-width) solid var(--bs-card-border-color);color:var(--bs-card-cap-color);margin-bottom:0;padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x)}.card-header:first-child{border-radius:var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0}.card-footer{background-color:var(--bs-card-cap-bg);border-top:var(--bs-card-border-width) solid var(--bs-card-border-color);color:var(--bs-card-cap-color);padding:var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x)}.card-footer:last-child{border-radius:0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius)}.card-header-tabs{border-bottom:0;margin-bottom:calc(var(--bs-card-cap-padding-y)*-1);margin-left:calc(var(--bs-card-cap-padding-x)*-.5);margin-right:calc(var(--bs-card-cap-padding-x)*-.5)}.card-header-tabs .nav-link.active{background-color:var(--bs-card-bg);border-bottom-color:var(--bs-card-bg)}.card-header-pills{margin-left:calc(var(--bs-card-cap-padding-x)*-.5);margin-right:calc(var(--bs-card-cap-padding-x)*-.5)}.card-img-overlay{border-radius:var(--bs-card-inner-border-radius);bottom:0;left:0;padding:var(--bs-card-img-overlay-padding);position:absolute;right:0;top:0}.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-left-radius:var(--bs-card-inner-border-radius);border-bottom-right-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;margin-bottom:0}.card-group>.card+.card{border-left:0;margin-left:0}.card-group>.card:not(:last-child){border-bottom-right-radius:0;border-top-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-bottom-left-radius:0;border-top-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;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%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;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23052c65'%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:#86b7fe;--bs-accordion-btn-focus-box-shadow:0 0 0 0.25rem rgba(13,110,253,.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{align-items:center;background-color:var(--bs-accordion-btn-bg);border:0;border-radius:0;color:var(--bs-accordion-btn-color);display:flex;font-size:1rem;overflow-anchor:none;padding:var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);position:relative;text-align:left;transition:var(--bs-accordion-transition);width:100%}@media (prefers-reduced-motion:reduce){.accordion-button{transition:none}}.accordion-button:not(.collapsed){background-color:var(--bs-accordion-active-bg);box-shadow:inset 0 calc(var(--bs-accordion-border-width)*-1) 0 var(--bs-accordion-border-color);color:var(--bs-accordion-active-color)}.accordion-button:not(.collapsed):after{background-image:var(--bs-accordion-btn-active-icon);-webkit-transform:var(--bs-accordion-btn-icon-transform);transform:var(--bs-accordion-btn-icon-transform)}.accordion-button:after{background-image:var(--bs-accordion-btn-icon);background-repeat:no-repeat;background-size:var(--bs-accordion-btn-icon-width);content:"";flex-shrink:0;height:var(--bs-accordion-btn-icon-width);margin-left:auto;transition:var(--bs-accordion-btn-icon-transition);width:var(--bs-accordion-btn-icon-width)}@media (prefers-reduced-motion:reduce){.accordion-button:after{transition:none}}.accordion-button:hover{z-index:2}.accordion-button:focus{border-color:var(--bs-accordion-btn-focus-border-color);box-shadow:var(--bs-accordion-btn-focus-box-shadow);outline:0;z-index:3}.accordion-header{margin-bottom:0}.accordion-item{background-color:var(--bs-accordion-bg);border:var(--bs-accordion-border-width) solid var(--bs-accordion-border-color);color:var(--bs-accordion-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-left-radius:var(--bs-accordion-border-radius);border-bottom-right-radius:var(--bs-accordion-border-radius)}.accordion-item:last-of-type .accordion-button.collapsed{border-bottom-left-radius:var(--bs-accordion-inner-border-radius);border-bottom-right-radius:var(--bs-accordion-inner-border-radius)}.accordion-item:last-of-type .accordion-collapse{border-bottom-left-radius:var(--bs-accordion-border-radius);border-bottom-right-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-left:0;border-radius:0;border-right: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;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%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;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%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);background-color:var(--bs-breadcrumb-bg);border-radius:var(--bs-breadcrumb-border-radius);display:flex;flex-wrap:wrap;font-size:var(--bs-breadcrumb-font-size);list-style:none;margin-bottom:var(--bs-breadcrumb-margin-bottom);padding:var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x)}.breadcrumb-item+.breadcrumb-item{padding-left:var(--bs-breadcrumb-item-padding-x)}.breadcrumb-item+.breadcrumb-item:before{color:var(--bs-breadcrumb-divider-color);content:"/";content:var(--bs-breadcrumb-divider,"/");float:left;padding-right:var(--bs-breadcrumb-item-padding-x)}.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(13,110,253,.25);--bs-pagination-active-color:#fff;--bs-pagination-active-bg:#0d6efd;--bs-pagination-active-border-color:#0d6efd;--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;list-style:none;padding-left:0}.page-link{background-color:var(--bs-pagination-bg);border:var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);color:var(--bs-pagination-color);display:block;font-size:var(--bs-pagination-font-size);padding:var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);position:relative;text-decoration:none;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{background-color:var(--bs-pagination-hover-bg);border-color:var(--bs-pagination-hover-border-color);color:var(--bs-pagination-hover-color);z-index:2}.page-link:focus{background-color:var(--bs-pagination-focus-bg);box-shadow:var(--bs-pagination-focus-box-shadow);color:var(--bs-pagination-focus-color);outline:0;z-index:3}.active>.page-link,.page-link.active{background-color:var(--bs-pagination-active-bg);border-color:var(--bs-pagination-active-border-color);color:var(--bs-pagination-active-color);z-index:3}.disabled>.page-link,.page-link.disabled{background-color:var(--bs-pagination-disabled-bg);border-color:var(--bs-pagination-disabled-border-color);color:var(--bs-pagination-disabled-color);pointer-events:none}.page-item:not(:first-child) .page-link{margin-left:-1px;margin-left:calc(var(--bs-border-width)*-1)}.page-item:first-child .page-link{border-bottom-left-radius:var(--bs-pagination-border-radius);border-top-left-radius:var(--bs-pagination-border-radius)}.page-item:last-child .page-link{border-bottom-right-radius:var(--bs-pagination-border-radius);border-top-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);border-radius:var(--bs-badge-border-radius);color:var(--bs-badge-color);display:inline-block;font-size:var(--bs-badge-font-size);font-weight:var(--bs-badge-font-weight);line-height:1;padding:var(--bs-badge-padding-y) var(--bs-badge-padding-x);text-align:center;vertical-align:initial;white-space:nowrap}.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;background-color:var(--bs-alert-bg);border:var(--bs-alert-border);border-radius:var(--bs-alert-border-radius);color:var(--bs-alert-color);margin-bottom:var(--bs-alert-margin-bottom);padding:var(--bs-alert-padding-y) var(--bs-alert-padding-x);position:relative}.alert-heading{color:inherit}.alert-link{color:var(--bs-alert-link-color);font-weight:700}.alert-dismissible{padding-right:3rem}.alert-dismissible .btn-close{padding:1.25rem 1rem;position:absolute;right:0;top:0;z-index:2}.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)}@-webkit-keyframes progress-bar-stripes{0%{background-position-x:1rem}}@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:#0d6efd;--bs-progress-bar-transition:width 0.6s ease;background-color:var(--bs-progress-bg);border-radius:var(--bs-progress-border-radius);display:flex;font-size:var(--bs-progress-font-size);height:var(--bs-progress-height);overflow:hidden}.progress-bar{background-color:var(--bs-progress-bar-bg);color:var(--bs-progress-bar-color);display:flex;flex-direction:column;justify-content:center;overflow:hidden;text-align:center;transition:var(--bs-progress-bar-transition);white-space:nowrap}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,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{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{-webkit-animation:none;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:#0d6efd;--bs-list-group-active-border-color:#0d6efd;border-radius:var(--bs-list-group-border-radius);display:flex;flex-direction:column;margin-bottom:0;padding-left:0}.list-group-numbered{counter-reset:section;list-style-type:none}.list-group-numbered>.list-group-item:before{content:counters(section,".") ". ";counter-increment:section}.list-group-item-action{color:var(--bs-list-group-action-color);text-align:inherit;width:100%}.list-group-item-action:focus,.list-group-item-action:hover{background-color:var(--bs-list-group-action-hover-bg);color:var(--bs-list-group-action-hover-color);text-decoration:none;z-index:1}.list-group-item-action:active{background-color:var(--bs-list-group-action-active-bg);color:var(--bs-list-group-action-active-color)}.list-group-item{background-color:var(--bs-list-group-bg);border:var(--bs-list-group-border-width) solid var(--bs-list-group-border-color);color:var(--bs-list-group-color);display:block;padding:var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);position:relative;text-decoration:none}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{background-color:var(--bs-list-group-disabled-bg);color:var(--bs-list-group-disabled-color);pointer-events:none}.list-group-item.active{background-color:var(--bs-list-group-active-bg);border-color:var(--bs-list-group-active-border-color);color:var(--bs-list-group-active-color);z-index:2}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{border-top-width:var(--bs-list-group-border-width);margin-top:calc(var(--bs-list-group-border-width)*-1)}.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-bottom-left-radius:0;border-top-right-radius:var(--bs-list-group-border-radius)}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-left-width:0;border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal>.list-group-item+.list-group-item.active{border-left-width:var(--bs-list-group-border-width);margin-left:calc(var(--bs-list-group-border-width)*-1)}@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-bottom-left-radius:0;border-top-right-radius:var(--bs-list-group-border-radius)}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-left-width:0;border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{border-left-width:var(--bs-list-group-border-width);margin-left:calc(var(--bs-list-group-border-width)*-1)}}@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-bottom-left-radius:0;border-top-right-radius:var(--bs-list-group-border-radius)}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-left-width:0;border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal-md>.list-group-item+.list-group-item.active{border-left-width:var(--bs-list-group-border-width);margin-left:calc(var(--bs-list-group-border-width)*-1)}}@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-bottom-left-radius:0;border-top-right-radius:var(--bs-list-group-border-radius)}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-left-width:0;border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{border-left-width:var(--bs-list-group-border-width);margin-left:calc(var(--bs-list-group-border-width)*-1)}}@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-bottom-left-radius:0;border-top-right-radius:var(--bs-list-group-border-radius)}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-left-width:0;border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{border-left-width:var(--bs-list-group-border-width);margin-left:calc(var(--bs-list-group-border-width)*-1)}}@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-bottom-left-radius:0;border-top-right-radius:var(--bs-list-group-border-radius)}.list-group-horizontal-xxl>.list-group-item.active{margin-top:0}.list-group-horizontal-xxl>.list-group-item+.list-group-item{border-left-width:0;border-top-width:var(--bs-list-group-border-width)}.list-group-horizontal-xxl>.list-group-item+.list-group-item.active{border-left-width:var(--bs-list-group-border-width);margin-left:calc(var(--bs-list-group-border-width)*-1)}}.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;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%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(13,110,253,.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%);background:transparent var(--bs-btn-close-bg) center/1em auto no-repeat;border:0;border-radius:.375rem;box-sizing:initial;height:1em;opacity:var(--bs-btn-close-opacity);padding:.25em;width:1em}.btn-close,.btn-close:hover{color:var(--bs-btn-close-color)}.btn-close:hover{opacity:var(--bs-btn-close-hover-opacity);text-decoration:none}.btn-close:focus{box-shadow:var(--bs-btn-close-focus-shadow);opacity:var(--bs-btn-close-focus-opacity);outline:0}.btn-close.disabled,.btn-close:disabled{opacity:var(--bs-btn-close-disabled-opacity);pointer-events:none;-webkit-user-select:none;user-select:none}.btn-close-white,[data-bs-theme=dark] .btn-close{-webkit-filter:var(--bs-btn-close-white-filter);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);background-clip:padding-box;background-color:var(--bs-toast-bg);border:var(--bs-toast-border-width) solid var(--bs-toast-border-color);border-radius:var(--bs-toast-border-radius);box-shadow:var(--bs-toast-box-shadow);color:var(--bs-toast-color);font-size:var(--bs-toast-font-size);max-width:100%;pointer-events:auto;width:var(--bs-toast-max-width)}.toast.showing{opacity:0}.toast:not(.show){display:none}.toast-container{--bs-toast-zindex:1090;max-width:100%;pointer-events:none;position:absolute;width:-webkit-max-content;width:max-content;z-index:var(--bs-toast-zindex)}.toast-container>:not(:last-child){margin-bottom:var(--bs-toast-spacing)}.toast-header{align-items:center;background-clip:padding-box;background-color:var(--bs-toast-header-bg);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));color:var(--bs-toast-header-color);display:flex;padding:var(--bs-toast-padding-y) var(--bs-toast-padding-x)}.toast-header .btn-close{margin-left:var(--bs-toast-padding-x);margin-right:calc(var(--bs-toast-padding-x)*-.5)}.toast-body{word-wrap:break-word;padding:var(--bs-toast-padding-x)}.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:0 0.125rem 0.25rem rgba(0,0,0,.075);--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);display:none;height:100%;left:0;outline:0;overflow-x:hidden;overflow-y:auto;position:fixed;top:0;width:100%;z-index:var(--bs-modal-zindex)}.modal-dialog{margin:var(--bs-modal-margin);pointer-events:none;position:relative;width:auto}.modal.fade .modal-dialog{-webkit-transform:translateY(-50px);transform:translateY(-50px);transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{-webkit-transform:none;transform:none}.modal.modal-static .modal-dialog{-webkit-transform:scale(1.02);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{align-items:center;display:flex;min-height:calc(100% - var(--bs-modal-margin)*2)}.modal-content{background-clip:padding-box;background-color:var(--bs-modal-bg);border:var(--bs-modal-border-width) solid var(--bs-modal-border-color);border-radius:var(--bs-modal-border-radius);color:var(--bs-modal-color);display:flex;flex-direction:column;outline:0;pointer-events:auto;position:relative;width:100%}.modal-backdrop{--bs-backdrop-zindex:1050;--bs-backdrop-bg:#000;--bs-backdrop-opacity:0.5;background-color:var(--bs-backdrop-bg);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:var(--bs-backdrop-zindex)}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:var(--bs-backdrop-opacity)}.modal-header{align-items:center;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);display:flex;flex-shrink:0;justify-content:space-between;padding:var(--bs-modal-header-padding)}.modal-header .btn-close{margin:calc(var(--bs-modal-header-padding-y)*-.5) calc(var(--bs-modal-header-padding-x)*-.5) calc(var(--bs-modal-header-padding-y)*-.5) auto;padding:calc(var(--bs-modal-header-padding-y)*.5) calc(var(--bs-modal-header-padding-x)*.5)}.modal-title{line-height:var(--bs-modal-title-line-height);margin-bottom:0}.modal-body{flex:1 1 auto;padding:var(--bs-modal-padding);position:relative}.modal-footer{align-items:center;background-color:var(--bs-modal-footer-bg);border-bottom-left-radius:var(--bs-modal-inner-border-radius);border-bottom-right-radius:var(--bs-modal-inner-border-radius);border-top:var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);display:flex;flex-shrink:0;flex-wrap:wrap;justify-content:flex-end;padding:calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap)*.5)}.modal-footer>*{margin:calc(var(--bs-modal-footer-gap)*.5)}@media (min-width:576px){.modal{--bs-modal-margin:1.75rem;--bs-modal-box-shadow:0 0.5rem 1rem rgba(0,0,0,.15)}.modal-dialog{margin-left:auto;margin-right:auto;max-width:var(--bs-modal-width)}.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{height:100%;margin:0;max-width:none;width:100vw}.modal-fullscreen .modal-content{border:0;border-radius:0;height:100%}.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{height:100%;margin:0;max-width:none;width:100vw}.modal-fullscreen-sm-down .modal-content{border:0;border-radius:0;height:100%}.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{height:100%;margin:0;max-width:none;width:100vw}.modal-fullscreen-md-down .modal-content{border:0;border-radius:0;height:100%}.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{height:100%;margin:0;max-width:none;width:100vw}.modal-fullscreen-lg-down .modal-content{border:0;border-radius:0;height:100%}.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{height:100%;margin:0;max-width:none;width:100vw}.modal-fullscreen-xl-down .modal-content{border:0;border-radius:0;height:100%}.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{height:100%;margin:0;max-width:none;width:100vw}.modal-fullscreen-xxl-down .modal-content{border:0;border-radius:0;height:100%}.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;word-wrap:break-word;display:block;font-family: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;font-family:var(--bs-font-sans-serif);font-size:var(--bs-tooltip-font-size);font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;margin:var(--bs-tooltip-margin);opacity:0;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;z-index:var(--bs-tooltip-zindex)}.tooltip.show{opacity:var(--bs-tooltip-opacity)}.tooltip .tooltip-arrow{display:block;height:var(--bs-tooltip-arrow-height);width:var(--bs-tooltip-arrow-width)}.tooltip .tooltip-arrow:before{border-color:transparent;border-style:solid;content:"";position:absolute}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow,.bs-tooltip-top .tooltip-arrow{bottom:calc(var(--bs-tooltip-arrow-height)*-1)}.bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow:before,.bs-tooltip-top .tooltip-arrow:before{border-top-color:var(--bs-tooltip-bg);border-width:var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;top:-1px}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow,.bs-tooltip-end .tooltip-arrow{height:var(--bs-tooltip-arrow-width);left:calc(var(--bs-tooltip-arrow-height)*-1);width:var(--bs-tooltip-arrow-height)}.bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow:before,.bs-tooltip-end .tooltip-arrow:before{border-right-color:var(--bs-tooltip-bg);border-width:calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width)*.5) 0;right:-1px}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow,.bs-tooltip-bottom .tooltip-arrow{top:calc(var(--bs-tooltip-arrow-height)*-1)}.bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow:before,.bs-tooltip-bottom .tooltip-arrow:before{border-bottom-color:var(--bs-tooltip-bg);border-width:0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);bottom:-1px}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow,.bs-tooltip-start .tooltip-arrow{height:var(--bs-tooltip-arrow-width);right:calc(var(--bs-tooltip-arrow-height)*-1);width:var(--bs-tooltip-arrow-height)}.bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow:before,.bs-tooltip-start .tooltip-arrow:before{border-left-color:var(--bs-tooltip-bg);border-width:calc(var(--bs-tooltip-arrow-width)*.5) 0 calc(var(--bs-tooltip-arrow-width)*.5) var(--bs-tooltip-arrow-height);left:-1px}.tooltip-inner{background-color:var(--bs-tooltip-bg);border-radius:var(--bs-tooltip-border-radius);color:var(--bs-tooltip-color);max-width:var(--bs-tooltip-max-width);padding:var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);text-align:center}.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:0 0.5rem 1rem rgba(0,0,0,.15);--bs-popover-header-padding-x:1rem;--bs-popover-header-padding-y:0.5rem;--bs-popover-header-font-size:1rem;--bs-popover-header-color:inherit;--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);word-wrap:break-word;background-clip:padding-box;background-color:var(--bs-popover-bg);border:var(--bs-popover-border-width) solid var(--bs-popover-border-color);border-radius:var(--bs-popover-border-radius);display:block;font-family: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;font-family:var(--bs-font-sans-serif);font-size:var(--bs-popover-font-size);font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;max-width:var(--bs-popover-max-width);text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;z-index:var(--bs-popover-zindex)}.popover .popover-arrow{display:block;height:var(--bs-popover-arrow-height);width:var(--bs-popover-arrow-width)}.popover .popover-arrow:after,.popover .popover-arrow:before{border:0 solid transparent;content:"";display:block;position:absolute}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow,.bs-popover-top>.popover-arrow{bottom:calc((var(--bs-popover-arrow-height))*-1 - 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{border-top-color:var(--bs-popover-arrow-border);bottom:0}.bs-popover-auto[data-popper-placement^=top]>.popover-arrow:after,.bs-popover-top>.popover-arrow:after{border-top-color:var(--bs-popover-bg);bottom:var(--bs-popover-border-width)}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow,.bs-popover-end>.popover-arrow{height:var(--bs-popover-arrow-width);left:calc((var(--bs-popover-arrow-height))*-1 - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height)}.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{border-right-color:var(--bs-popover-arrow-border);left:0}.bs-popover-auto[data-popper-placement^=right]>.popover-arrow:after,.bs-popover-end>.popover-arrow:after{border-right-color:var(--bs-popover-bg);left:var(--bs-popover-border-width)}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow,.bs-popover-bottom>.popover-arrow{top:calc((var(--bs-popover-arrow-height))*-1 - 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{border-bottom-color:var(--bs-popover-arrow-border);top:0}.bs-popover-auto[data-popper-placement^=bottom]>.popover-arrow:after,.bs-popover-bottom>.popover-arrow:after{border-bottom-color:var(--bs-popover-bg);top:var(--bs-popover-border-width)}.bs-popover-auto[data-popper-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{border-bottom:var(--bs-popover-border-width) solid var(--bs-popover-header-bg);content:"";display:block;left:50%;margin-left:calc(var(--bs-popover-arrow-width)*-.5);position:absolute;top:0;width:var(--bs-popover-arrow-width)}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow,.bs-popover-start>.popover-arrow{height:var(--bs-popover-arrow-width);right:calc((var(--bs-popover-arrow-height))*-1 - var(--bs-popover-border-width));width:var(--bs-popover-arrow-height)}.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{border-left-color:var(--bs-popover-arrow-border);right:0}.bs-popover-auto[data-popper-placement^=left]>.popover-arrow:after,.bs-popover-start>.popover-arrow:after{border-left-color:var(--bs-popover-bg);right:var(--bs-popover-border-width)}.popover-header{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);color:var(--bs-popover-header-color);font-size:var(--bs-popover-header-font-size);margin-bottom:0;padding:var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x)}.popover-header:empty{display:none}.popover-body{color:var(--bs-popover-body-color);padding:var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x)}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{overflow:hidden;position:relative;width:100%}.carousel-inner:after{clear:both;content:"";display:block}.carousel-item{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:none;float:left;margin-right:-100%;position:relative;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out;width:100%}@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){-webkit-transform:translateX(100%);transform:translateX(100%)}.active.carousel-item-start,.carousel-item-prev:not(.carousel-item-end){-webkit-transform:translateX(-100%);transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;-webkit-transform:none;transform:none;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-start,.carousel-fade .carousel-item-prev.carousel-item-end,.carousel-fade .carousel-item.active{opacity:1;z-index:1}.carousel-fade .active.carousel-item-end,.carousel-fade .active.carousel-item-start{opacity:0;transition:opacity 0s .6s;z-index:0}@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{align-items:center;background:0 0;border:0;bottom:0;color:#fff;display:flex;justify-content:center;opacity:.5;padding:0;position:absolute;text-align:center;top:0;transition:opacity .15s ease;width:15%;z-index:1}@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;opacity:.9;outline:0;text-decoration:none}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{background-position:50%;background-repeat:no-repeat;background-size:100% 100%;display:inline-block;height:2rem;width:2rem}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf-8,%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;charset=utf-8,%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{bottom:0;display:flex;justify-content:center;left:0;margin-bottom:1rem;margin-left:15%;margin-right:15%;padding:0;position:absolute;right:0;z-index:2}.carousel-indicators [data-bs-target]{background-clip:padding-box;background-color:#fff;border:0;border-bottom:10px solid transparent;border-top:10px solid transparent;box-sizing:initial;cursor:pointer;flex:0 1 auto;height:3px;margin-left:3px;margin-right:3px;opacity:.5;padding:0;text-indent:-999px;transition:opacity .6s ease;width:30px}@media (prefers-reduced-motion:reduce){.carousel-indicators [data-bs-target]{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{bottom:1.25rem;color:#fff;left:15%;padding-bottom:1.25rem;padding-top:1.25rem;position:absolute;right:15%;text-align:center}.carousel-dark .carousel-control-next-icon,.carousel-dark .carousel-control-prev-icon{-webkit-filter:invert(1) grayscale(100);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{-webkit-filter:invert(1) grayscale(100);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{-webkit-animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);animation:var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);border-radius:50%;display:inline-block;height:var(--bs-spinner-height);vertical-align:var(--bs-spinner-vertical-align);width:var(--bs-spinner-width)}@-webkit-keyframes spinner-border{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spinner-border{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.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-right-color:currentcolor;border:var(--bs-spinner-border-width) solid;border-right:var(--bs-spinner-border-width) solid transparent}.spinner-border-sm{--bs-spinner-width:1rem;--bs-spinner-height:1rem;--bs-spinner-border-width:0.2em}@-webkit-keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;transform:none}}@keyframes spinner-grow{0%{-webkit-transform:scale(0);transform:scale(0)}50%{opacity:1;-webkit-transform:none;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:0 0.125rem 0.25rem rgba(0,0,0,.075);--bs-offcanvas-transition:transform 0.3s ease-in-out;--bs-offcanvas-title-line-height:1.5}@media (max-width:575.98px){.offcanvas-sm{background-clip:padding-box;background-color:var(--bs-offcanvas-bg);bottom:0;color:var(--bs-offcanvas-color);display:flex;flex-direction:column;max-width:100%;outline:0;position:fixed;transition:var(--bs-offcanvas-transition);visibility:hidden;z-index:var(--bs-offcanvas-zindex)}}@media (max-width:575.98px) and (prefers-reduced-motion:reduce){.offcanvas-sm{transition:none}}@media (max-width:575.98px){.offcanvas-sm.offcanvas-start{border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);left:0;top:0;-webkit-transform:translateX(-100%);transform:translateX(-100%);width:var(--bs-offcanvas-width)}.offcanvas-sm.offcanvas-end{border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);right:0;top:0;-webkit-transform:translateX(100%);transform:translateX(100%);width:var(--bs-offcanvas-width)}.offcanvas-sm.offcanvas-top{border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;-webkit-transform:translateY(-100%);transform:translateY(-100%)}.offcanvas-sm.offcanvas-bottom,.offcanvas-sm.offcanvas-top{height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0}.offcanvas-sm.offcanvas-bottom{border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);-webkit-transform:translateY(100%);transform:translateY(100%)}.offcanvas-sm.show:not(.hiding),.offcanvas-sm.showing{-webkit-transform:none;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:initial!important}.offcanvas-sm .offcanvas-header{display:none}.offcanvas-sm .offcanvas-body{background-color:initial!important;display:flex;flex-grow:0;overflow-y:visible;padding:0}}@media (max-width:767.98px){.offcanvas-md{background-clip:padding-box;background-color:var(--bs-offcanvas-bg);bottom:0;color:var(--bs-offcanvas-color);display:flex;flex-direction:column;max-width:100%;outline:0;position:fixed;transition:var(--bs-offcanvas-transition);visibility:hidden;z-index:var(--bs-offcanvas-zindex)}}@media (max-width:767.98px) and (prefers-reduced-motion:reduce){.offcanvas-md{transition:none}}@media (max-width:767.98px){.offcanvas-md.offcanvas-start{border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);left:0;top:0;-webkit-transform:translateX(-100%);transform:translateX(-100%);width:var(--bs-offcanvas-width)}.offcanvas-md.offcanvas-end{border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);right:0;top:0;-webkit-transform:translateX(100%);transform:translateX(100%);width:var(--bs-offcanvas-width)}.offcanvas-md.offcanvas-top{border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;-webkit-transform:translateY(-100%);transform:translateY(-100%)}.offcanvas-md.offcanvas-bottom,.offcanvas-md.offcanvas-top{height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0}.offcanvas-md.offcanvas-bottom{border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);-webkit-transform:translateY(100%);transform:translateY(100%)}.offcanvas-md.show:not(.hiding),.offcanvas-md.showing{-webkit-transform:none;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:initial!important}.offcanvas-md .offcanvas-header{display:none}.offcanvas-md .offcanvas-body{background-color:initial!important;display:flex;flex-grow:0;overflow-y:visible;padding:0}}@media (max-width:991.98px){.offcanvas-lg{background-clip:padding-box;background-color:var(--bs-offcanvas-bg);bottom:0;color:var(--bs-offcanvas-color);display:flex;flex-direction:column;max-width:100%;outline:0;position:fixed;transition:var(--bs-offcanvas-transition);visibility:hidden;z-index:var(--bs-offcanvas-zindex)}}@media (max-width:991.98px) and (prefers-reduced-motion:reduce){.offcanvas-lg{transition:none}}@media (max-width:991.98px){.offcanvas-lg.offcanvas-start{border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);left:0;top:0;-webkit-transform:translateX(-100%);transform:translateX(-100%);width:var(--bs-offcanvas-width)}.offcanvas-lg.offcanvas-end{border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);right:0;top:0;-webkit-transform:translateX(100%);transform:translateX(100%);width:var(--bs-offcanvas-width)}.offcanvas-lg.offcanvas-top{border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;-webkit-transform:translateY(-100%);transform:translateY(-100%)}.offcanvas-lg.offcanvas-bottom,.offcanvas-lg.offcanvas-top{height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0}.offcanvas-lg.offcanvas-bottom{border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);-webkit-transform:translateY(100%);transform:translateY(100%)}.offcanvas-lg.show:not(.hiding),.offcanvas-lg.showing{-webkit-transform:none;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:initial!important}.offcanvas-lg .offcanvas-header{display:none}.offcanvas-lg .offcanvas-body{background-color:initial!important;display:flex;flex-grow:0;overflow-y:visible;padding:0}}@media (max-width:1199.98px){.offcanvas-xl{background-clip:padding-box;background-color:var(--bs-offcanvas-bg);bottom:0;color:var(--bs-offcanvas-color);display:flex;flex-direction:column;max-width:100%;outline:0;position:fixed;transition:var(--bs-offcanvas-transition);visibility:hidden;z-index:var(--bs-offcanvas-zindex)}}@media (max-width:1199.98px) and (prefers-reduced-motion:reduce){.offcanvas-xl{transition:none}}@media (max-width:1199.98px){.offcanvas-xl.offcanvas-start{border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);left:0;top:0;-webkit-transform:translateX(-100%);transform:translateX(-100%);width:var(--bs-offcanvas-width)}.offcanvas-xl.offcanvas-end{border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);right:0;top:0;-webkit-transform:translateX(100%);transform:translateX(100%);width:var(--bs-offcanvas-width)}.offcanvas-xl.offcanvas-top{border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;-webkit-transform:translateY(-100%);transform:translateY(-100%)}.offcanvas-xl.offcanvas-bottom,.offcanvas-xl.offcanvas-top{height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0}.offcanvas-xl.offcanvas-bottom{border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);-webkit-transform:translateY(100%);transform:translateY(100%)}.offcanvas-xl.show:not(.hiding),.offcanvas-xl.showing{-webkit-transform:none;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:initial!important}.offcanvas-xl .offcanvas-header{display:none}.offcanvas-xl .offcanvas-body{background-color:initial!important;display:flex;flex-grow:0;overflow-y:visible;padding:0}}@media (max-width:1399.98px){.offcanvas-xxl{background-clip:padding-box;background-color:var(--bs-offcanvas-bg);bottom:0;color:var(--bs-offcanvas-color);display:flex;flex-direction:column;max-width:100%;outline:0;position:fixed;transition:var(--bs-offcanvas-transition);visibility:hidden;z-index:var(--bs-offcanvas-zindex)}}@media (max-width:1399.98px) and (prefers-reduced-motion:reduce){.offcanvas-xxl{transition:none}}@media (max-width:1399.98px){.offcanvas-xxl.offcanvas-start{border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);left:0;top:0;-webkit-transform:translateX(-100%);transform:translateX(-100%);width:var(--bs-offcanvas-width)}.offcanvas-xxl.offcanvas-end{border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);right:0;top:0;-webkit-transform:translateX(100%);transform:translateX(100%);width:var(--bs-offcanvas-width)}.offcanvas-xxl.offcanvas-top{border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;-webkit-transform:translateY(-100%);transform:translateY(-100%)}.offcanvas-xxl.offcanvas-bottom,.offcanvas-xxl.offcanvas-top{height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0}.offcanvas-xxl.offcanvas-bottom{border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);-webkit-transform:translateY(100%);transform:translateY(100%)}.offcanvas-xxl.show:not(.hiding),.offcanvas-xxl.showing{-webkit-transform:none;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:initial!important}.offcanvas-xxl .offcanvas-header{display:none}.offcanvas-xxl .offcanvas-body{background-color:initial!important;display:flex;flex-grow:0;overflow-y:visible;padding:0}}.offcanvas{background-clip:padding-box;background-color:var(--bs-offcanvas-bg);bottom:0;color:var(--bs-offcanvas-color);display:flex;flex-direction:column;max-width:100%;outline:0;position:fixed;transition:var(--bs-offcanvas-transition);visibility:hidden;z-index:var(--bs-offcanvas-zindex)}@media (prefers-reduced-motion:reduce){.offcanvas{transition:none}}.offcanvas.offcanvas-start{border-right:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);left:0;top:0;-webkit-transform:translateX(-100%);transform:translateX(-100%);width:var(--bs-offcanvas-width)}.offcanvas.offcanvas-end{border-left:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);right:0;top:0;-webkit-transform:translateX(100%);transform:translateX(100%);width:var(--bs-offcanvas-width)}.offcanvas.offcanvas-top{border-bottom:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);top:0;-webkit-transform:translateY(-100%);transform:translateY(-100%)}.offcanvas.offcanvas-bottom,.offcanvas.offcanvas-top{height:var(--bs-offcanvas-height);left:0;max-height:100%;right:0}.offcanvas.offcanvas-bottom{border-top:var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);-webkit-transform:translateY(100%);transform:translateY(100%)}.offcanvas.show:not(.hiding),.offcanvas.showing{-webkit-transform:none;transform:none}.offcanvas.hiding,.offcanvas.show,.offcanvas.showing{visibility:visible}.offcanvas-backdrop{background-color:#000;height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:1040}.offcanvas-backdrop.fade{opacity:0}.offcanvas-backdrop.show{opacity:.5}.offcanvas-header{align-items:center;display:flex;justify-content:space-between;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.offcanvas-header .btn-close{margin-bottom:calc(var(--bs-offcanvas-padding-y)*-.5);margin-right:calc(var(--bs-offcanvas-padding-x)*-.5);margin-top:calc(var(--bs-offcanvas-padding-y)*-.5);padding:calc(var(--bs-offcanvas-padding-y)*.5) calc(var(--bs-offcanvas-padding-x)*.5)}.offcanvas-title{line-height:var(--bs-offcanvas-title-line-height);margin-bottom:0}.offcanvas-body{flex-grow:1;overflow-y:auto;padding:var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x)}.placeholder{background-color:currentcolor;cursor:wait;display:inline-block;min-height:1em;opacity:.5;vertical-align:middle}.placeholder.btn:before{content:"";display:inline-block}.placeholder-xs{min-height:.6em}.placeholder-sm{min-height:.8em}.placeholder-lg{min-height:1.2em}.placeholder-glow .placeholder{-webkit-animation:placeholder-glow 2s ease-in-out infinite;animation:placeholder-glow 2s ease-in-out infinite}@-webkit-keyframes placeholder-glow{50%{opacity:.2}}@keyframes placeholder-glow{50%{opacity:.2}}.placeholder-wave{-webkit-animation:placeholder-wave 2s linear infinite;animation:placeholder-wave 2s linear infinite;-webkit-mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,.8) 75%,#000 95%);mask-image:linear-gradient(130deg,#000 55%,rgba(0,0,0,.8) 75%,#000 95%);-webkit-mask-size:200% 100%;mask-size:200% 100%}@-webkit-keyframes placeholder-wave{to{-webkit-mask-position:-200% 0;mask-position:-200% 0}}@keyframes placeholder-wave{to{-webkit-mask-position:-200% 0;mask-position:-200% 0}}.clearfix:after{clear:both;content:"";display:block}.text-bg-primary{background-color:#0d6efd!important;background-color:RGBA(13,110,253,var(--bs-bg-opacity,1))!important;color:#fff!important}.text-bg-secondary{background-color:#6c757d!important;background-color:RGBA(108,117,125,var(--bs-bg-opacity,1))!important;color:#fff!important}.text-bg-success{background-color:#198754!important;background-color:RGBA(25,135,84,var(--bs-bg-opacity,1))!important;color:#fff!important}.text-bg-info{background-color:#0dcaf0!important;background-color:RGBA(13,202,240,var(--bs-bg-opacity,1))!important;color:#000!important}.text-bg-warning{background-color:#ffc107!important;background-color:RGBA(255,193,7,var(--bs-bg-opacity,1))!important;color:#000!important}.text-bg-danger{background-color:#dc3545!important;background-color:RGBA(220,53,69,var(--bs-bg-opacity,1))!important;color:#fff!important}.text-bg-light{background-color:#f8f9fa!important;background-color:RGBA(248,249,250,var(--bs-bg-opacity,1))!important;color:#000!important}.text-bg-dark{background-color:#212529!important;background-color:RGBA(33,37,41,var(--bs-bg-opacity,1))!important;color:#fff!important}.link-primary{color:#0d6efd!important;color:RGBA(var(--bs-primary-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:#0d6efd!important;text-decoration-color:RGBA(var(--bs-primary-rgb),var(--bs-link-underline-opacity,1))!important}.link-primary:focus,.link-primary:hover{color:#0a58ca!important;color:RGBA(10,88,202,var(--bs-link-opacity,1))!important;text-decoration-color:#0a58ca!important;text-decoration-color:RGBA(10,88,202,var(--bs-link-underline-opacity,1))!important}.link-secondary{color:#6c757d!important;color:RGBA(var(--bs-secondary-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:#6c757d!important;text-decoration-color:RGBA(var(--bs-secondary-rgb),var(--bs-link-underline-opacity,1))!important}.link-secondary:focus,.link-secondary:hover{color:#565e64!important;color:RGBA(86,94,100,var(--bs-link-opacity,1))!important;text-decoration-color:#565e64!important;text-decoration-color:RGBA(86,94,100,var(--bs-link-underline-opacity,1))!important}.link-success{color:#198754!important;color:RGBA(var(--bs-success-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:#198754!important;text-decoration-color:RGBA(var(--bs-success-rgb),var(--bs-link-underline-opacity,1))!important}.link-success:focus,.link-success:hover{color:#146c43!important;color:RGBA(20,108,67,var(--bs-link-opacity,1))!important;text-decoration-color:#146c43!important;text-decoration-color:RGBA(20,108,67,var(--bs-link-underline-opacity,1))!important}.link-info{color:#0dcaf0!important;color:RGBA(var(--bs-info-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:#0dcaf0!important;text-decoration-color:RGBA(var(--bs-info-rgb),var(--bs-link-underline-opacity,1))!important}.link-info:focus,.link-info:hover{color:#3dd5f3!important;color:RGBA(61,213,243,var(--bs-link-opacity,1))!important;text-decoration-color:#3dd5f3!important;text-decoration-color:RGBA(61,213,243,var(--bs-link-underline-opacity,1))!important}.link-warning{color:#ffc107!important;color:RGBA(var(--bs-warning-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:#ffc107!important;text-decoration-color:RGBA(var(--bs-warning-rgb),var(--bs-link-underline-opacity,1))!important}.link-warning:focus,.link-warning:hover{color:#ffcd39!important;color:RGBA(255,205,57,var(--bs-link-opacity,1))!important;text-decoration-color:#ffcd39!important;text-decoration-color:RGBA(255,205,57,var(--bs-link-underline-opacity,1))!important}.link-danger{color:#dc3545!important;color:RGBA(var(--bs-danger-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:#dc3545!important;text-decoration-color:RGBA(var(--bs-danger-rgb),var(--bs-link-underline-opacity,1))!important}.link-danger:focus,.link-danger:hover{color:#b02a37!important;color:RGBA(176,42,55,var(--bs-link-opacity,1))!important;text-decoration-color:#b02a37!important;text-decoration-color:RGBA(176,42,55,var(--bs-link-underline-opacity,1))!important}.link-light{color:#f8f9fa!important;color:RGBA(var(--bs-light-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:#f8f9fa!important;text-decoration-color:RGBA(var(--bs-light-rgb),var(--bs-link-underline-opacity,1))!important}.link-light:focus,.link-light:hover{color:#f9fafb!important;color:RGBA(249,250,251,var(--bs-link-opacity,1))!important;text-decoration-color:#f9fafb!important;text-decoration-color:RGBA(249,250,251,var(--bs-link-underline-opacity,1))!important}.link-dark{color:#212529!important;color:RGBA(var(--bs-dark-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:#212529!important;text-decoration-color:RGBA(var(--bs-dark-rgb),var(--bs-link-underline-opacity,1))!important}.link-dark:focus,.link-dark:hover{color:#1a1e21!important;color:RGBA(26,30,33,var(--bs-link-opacity,1))!important;text-decoration-color:#1a1e21!important;text-decoration-color:RGBA(26,30,33,var(--bs-link-underline-opacity,1))!important}.link-body-emphasis{color:#000!important;color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,1))!important;text-decoration-color:#000!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(0,0,0,.75)!important;color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-opacity,.75))!important;text-decoration-color:rgba(0,0,0,.75)!important;text-decoration-color:RGBA(var(--bs-emphasis-color-rgb),var(--bs-link-underline-opacity,.75))!important}.focus-ring:focus{box-shadow:0 0 0 .25rem rgba(13,110,253,.25);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);outline:0}.icon-link{align-items:center;-webkit-backface-visibility:hidden;backface-visibility:hidden;display:inline-flex;gap:.375rem;text-decoration-color:rgba(13,110,253,.5);text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-opacity,.5));text-underline-offset:.25em}.icon-link>.bi{fill:currentcolor;flex-shrink:0;height:1em;transition:transform .2s ease-in-out;width:1em}@media (prefers-reduced-motion:reduce){.icon-link>.bi{transition:none}}.icon-link-hover:focus-visible>.bi,.icon-link-hover:hover>.bi{-webkit-transform:translate3d(.25em,0,0);transform:translate3d(.25em,0,0);-webkit-transform:var(--bs-icon-link-transform,translate3d(.25em,0,0));transform:var(--bs-icon-link-transform,translate3d(.25em,0,0))}.ratio{position:relative;width:100%}.ratio:before{content:"";display:block;padding-top:var(--bs-aspect-ratio)}.ratio>*{height:100%;left:0;position:absolute;top:0;width: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{top:0}.fixed-bottom,.fixed-top{left:0;position:fixed;right:0;z-index:1030}.fixed-bottom{bottom:0}.sticky-top{top:0}.sticky-bottom,.sticky-top{position:-webkit-sticky;position:sticky;z-index:1020}.sticky-bottom{bottom:0}@media (min-width:576px){.sticky-sm-top{top:0}.sticky-sm-bottom,.sticky-sm-top{position:-webkit-sticky;position:sticky;z-index:1020}.sticky-sm-bottom{bottom:0}}@media (min-width:768px){.sticky-md-top{top:0}.sticky-md-bottom,.sticky-md-top{position:-webkit-sticky;position:sticky;z-index:1020}.sticky-md-bottom{bottom:0}}@media (min-width:992px){.sticky-lg-top{top:0}.sticky-lg-bottom,.sticky-lg-top{position:-webkit-sticky;position:sticky;z-index:1020}.sticky-lg-bottom{bottom:0}}@media (min-width:1200px){.sticky-xl-top{top:0}.sticky-xl-bottom,.sticky-xl-top{position:-webkit-sticky;position:sticky;z-index:1020}.sticky-xl-bottom{bottom:0}}@media (min-width:1400px){.sticky-xxl-top{top:0}.sticky-xxl-bottom,.sticky-xxl-top{position:-webkit-sticky;position:sticky;z-index:1020}.sticky-xxl-bottom{bottom:0}}.hstack{align-items:center;flex-direction:row}.hstack,.vstack{align-self:stretch;display:flex}.vstack{flex:1 1 auto;flex-direction:column}.visually-hidden,.visually-hidden-focusable:not(:focus):not(:focus-within){clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;white-space:nowrap!important;width:1px!important}.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption),.visually-hidden:not(caption){position:absolute!important}.stretched-link:after{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:1}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.vr{align-self:stretch;background-color:currentcolor;display:inline-block;min-height:1em;opacity:.25;width:1px}.align-baseline{vertical-align:initial!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{object-fit:contain!important}.object-fit-cover{object-fit:cover!important}.object-fit-fill{object-fit:fill!important}.object-fit-scale{object-fit:scale-down!important}.object-fit-none{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:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!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{-webkit-transform:translate(-50%,-50%)!important;transform:translate(-50%,-50%)!important}.translate-middle-x{-webkit-transform:translateX(-50%)!important;transform:translateX(-50%)!important}.translate-middle-y{-webkit-transform:translateY(-50%)!important;transform:translateY(-50%)!important}.border{border:1px solid #dee2e6!important;border:var(--bs-border-width) var(--bs-border-style) var(--bs-border-color)!important}.border-0{border:0!important}.border-top{border-top:1px solid #dee2e6!important;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:1px solid #dee2e6!important;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:1px solid #dee2e6!important;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:1px solid #dee2e6!important;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:#9ec5fe!important;border-color:var(--bs-primary-border-subtle)!important}.border-secondary-subtle{border-color:#c4c8cb!important;border-color:var(--bs-secondary-border-subtle)!important}.border-success-subtle{border-color:#a3cfbb!important;border-color:var(--bs-success-border-subtle)!important}.border-info-subtle{border-color:#9eeaf9!important;border-color:var(--bs-info-border-subtle)!important}.border-warning-subtle{border-color:#ffe69c!important;border-color:var(--bs-warning-border-subtle)!important}.border-danger-subtle{border-color:#f1aeb5!important;border-color:var(--bs-danger-border-subtle)!important}.border-light-subtle{border-color:#e9ecef!important;border-color:var(--bs-light-border-subtle)!important}.border-dark-subtle{border-color:#adb5bd!important;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-left:0!important;margin-right:0!important}.mx-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-3{margin-left:1rem!important;margin-right:1rem!important}.mx-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-5{margin-left:3rem!important;margin-right:3rem!important}.mx-auto{margin-left:auto!important;margin-right:auto!important}.my-0{margin-bottom:0!important;margin-top:0!important}.my-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.my-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.my-3{margin-bottom:1rem!important;margin-top:1rem!important}.my-4{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.my-5{margin-bottom:3rem!important;margin-top:3rem!important}.my-auto{margin-bottom:auto!important;margin-top: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-left:0!important;padding-right:0!important}.px-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-3{padding-left:1rem!important;padding-right:1rem!important}.px-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-5{padding-left:3rem!important;padding-right:3rem!important}.py-0{padding-bottom:0!important;padding-top:0!important}.py-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.py-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.py-3{padding-bottom:1rem!important;padding-top:1rem!important}.py-4{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.py-5{padding-bottom:3rem!important;padding-top: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{-webkit-column-gap:0!important;column-gap:0!important}.column-gap-1{-webkit-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-2{-webkit-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-3{-webkit-column-gap:1rem!important;column-gap:1rem!important}.column-gap-4{-webkit-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-5{-webkit-column-gap:3rem!important;column-gap:3rem!important}.font-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important;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(13,110,253,var(--bs-text-opacity))!important;color:rgba(var(--bs-primary-rgb),var(--bs-text-opacity))!important}.text-secondary{--bs-text-opacity:1;color:rgba(108,117,125,var(--bs-text-opacity))!important;color:rgba(var(--bs-secondary-rgb),var(--bs-text-opacity))!important}.text-success{--bs-text-opacity:1;color:rgba(25,135,84,var(--bs-text-opacity))!important;color:rgba(var(--bs-success-rgb),var(--bs-text-opacity))!important}.text-info{--bs-text-opacity:1;color:rgba(13,202,240,var(--bs-text-opacity))!important;color:rgba(var(--bs-info-rgb),var(--bs-text-opacity))!important}.text-warning{--bs-text-opacity:1;color:rgba(255,193,7,var(--bs-text-opacity))!important;color:rgba(var(--bs-warning-rgb),var(--bs-text-opacity))!important}.text-danger{--bs-text-opacity:1;color:rgba(220,53,69,var(--bs-text-opacity))!important;color:rgba(var(--bs-danger-rgb),var(--bs-text-opacity))!important}.text-light{--bs-text-opacity:1;color:rgba(248,249,250,var(--bs-text-opacity))!important;color:rgba(var(--bs-light-rgb),var(--bs-text-opacity))!important}.text-dark{--bs-text-opacity:1;color:rgba(33,37,41,var(--bs-text-opacity))!important;color:rgba(var(--bs-dark-rgb),var(--bs-text-opacity))!important}.text-black{--bs-text-opacity:1;color:rgba(0,0,0,var(--bs-text-opacity))!important;color:rgba(var(--bs-black-rgb),var(--bs-text-opacity))!important}.text-white{--bs-text-opacity:1;color:rgba(255,255,255,var(--bs-text-opacity))!important;color:rgba(var(--bs-white-rgb),var(--bs-text-opacity))!important}.text-body{--bs-text-opacity:1;color:rgba(33,37,41,var(--bs-text-opacity))!important;color:rgba(var(--bs-body-color-rgb),var(--bs-text-opacity))!important}.text-muted{--bs-text-opacity:1;color:rgba(33,37,41,.75)!important;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:hsla(0,0%,100%,.5)!important}.text-body-secondary{--bs-text-opacity:1;color:rgba(33,37,41,.75)!important;color:var(--bs-secondary-color)!important}.text-body-tertiary{--bs-text-opacity:1;color:rgba(33,37,41,.5)!important;color:var(--bs-tertiary-color)!important}.text-body-emphasis{--bs-text-opacity:1;color:#000!important;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:#052c65!important;color:var(--bs-primary-text-emphasis)!important}.text-secondary-emphasis{color:#2b2f32!important;color:var(--bs-secondary-text-emphasis)!important}.text-success-emphasis{color:#0a3622!important;color:var(--bs-success-text-emphasis)!important}.text-info-emphasis{color:#055160!important;color:var(--bs-info-text-emphasis)!important}.text-warning-emphasis{color:#664d03!important;color:var(--bs-warning-text-emphasis)!important}.text-danger-emphasis{color:#58151c!important;color:var(--bs-danger-text-emphasis)!important}.text-light-emphasis{color:#495057!important;color:var(--bs-light-text-emphasis)!important}.text-dark-emphasis{color:#495057!important;color:var(--bs-dark-text-emphasis)!important}.link-opacity-10,.link-opacity-10-hover:hover{--bs-link-opacity:0.1}.link-opacity-25,.link-opacity-25-hover:hover{--bs-link-opacity:0.25}.link-opacity-50,.link-opacity-50-hover:hover{--bs-link-opacity:0.5}.link-opacity-75,.link-opacity-75-hover:hover{--bs-link-opacity:0.75}.link-opacity-100,.link-opacity-100-hover:hover{--bs-link-opacity:1}.link-offset-1,.link-offset-1-hover:hover{text-underline-offset:.125em!important}.link-offset-2,.link-offset-2-hover:hover{text-underline-offset:.25em!important}.link-offset-3,.link-offset-3-hover:hover{text-underline-offset:.375em!important}.link-underline-primary{--bs-link-underline-opacity:1;text-decoration-color:rgba(13,110,253,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;text-decoration-color:rgba(108,117,125,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;text-decoration-color:rgba(25,135,84,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;text-decoration-color:rgba(13,202,240,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;text-decoration-color:rgba(255,193,7,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;text-decoration-color:rgba(220,53,69,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;text-decoration-color:rgba(248,249,250,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;text-decoration-color:rgba(33,37,41,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;text-decoration-color:#0d6efd!important;text-decoration-color:rgba(var(--bs-link-color-rgb),var(--bs-link-underline-opacity,1))!important}.link-underline-opacity-0,.link-underline-opacity-0-hover:hover{--bs-link-underline-opacity:0}.link-underline-opacity-10,.link-underline-opacity-10-hover:hover{--bs-link-underline-opacity:0.1}.link-underline-opacity-25,.link-underline-opacity-25-hover:hover{--bs-link-underline-opacity:0.25}.link-underline-opacity-50,.link-underline-opacity-50-hover:hover{--bs-link-underline-opacity:0.5}.link-underline-opacity-75,.link-underline-opacity-75-hover:hover{--bs-link-underline-opacity:0.75}.link-underline-opacity-100,.link-underline-opacity-100-hover:hover{--bs-link-underline-opacity:1}.bg-primary{--bs-bg-opacity:1;background-color:rgba(13,110,253,var(--bs-bg-opacity))!important;background-color:rgba(var(--bs-primary-rgb),var(--bs-bg-opacity))!important}.bg-secondary{--bs-bg-opacity:1;background-color:rgba(108,117,125,var(--bs-bg-opacity))!important;background-color:rgba(var(--bs-secondary-rgb),var(--bs-bg-opacity))!important}.bg-success{--bs-bg-opacity:1;background-color:rgba(25,135,84,var(--bs-bg-opacity))!important;background-color:rgba(var(--bs-success-rgb),var(--bs-bg-opacity))!important}.bg-info{--bs-bg-opacity:1;background-color:rgba(13,202,240,var(--bs-bg-opacity))!important;background-color:rgba(var(--bs-info-rgb),var(--bs-bg-opacity))!important}.bg-warning{--bs-bg-opacity:1;background-color:rgba(255,193,7,var(--bs-bg-opacity))!important;background-color:rgba(var(--bs-warning-rgb),var(--bs-bg-opacity))!important}.bg-danger{--bs-bg-opacity:1;background-color:rgba(220,53,69,var(--bs-bg-opacity))!important;background-color:rgba(var(--bs-danger-rgb),var(--bs-bg-opacity))!important}.bg-light{--bs-bg-opacity:1;background-color:rgba(248,249,250,var(--bs-bg-opacity))!important;background-color:rgba(var(--bs-light-rgb),var(--bs-bg-opacity))!important}.bg-dark{--bs-bg-opacity:1;background-color:rgba(33,37,41,var(--bs-bg-opacity))!important;background-color:rgba(var(--bs-dark-rgb),var(--bs-bg-opacity))!important}.bg-black{--bs-bg-opacity:1;background-color:rgba(0,0,0,var(--bs-bg-opacity))!important;background-color:rgba(var(--bs-black-rgb),var(--bs-bg-opacity))!important}.bg-white{--bs-bg-opacity:1;background-color:rgba(255,255,255,var(--bs-bg-opacity))!important;background-color:rgba(var(--bs-white-rgb),var(--bs-bg-opacity))!important}.bg-body{--bs-bg-opacity:1;background-color:rgba(255,255,255,var(--bs-bg-opacity))!important;background-color:rgba(var(--bs-body-bg-rgb),var(--bs-bg-opacity))!important}.bg-transparent{--bs-bg-opacity:1;background-color:initial!important}.bg-body-secondary{--bs-bg-opacity:1;background-color:rgba(233,236,239,var(--bs-bg-opacity))!important;background-color:rgba(var(--bs-secondary-bg-rgb),var(--bs-bg-opacity))!important}.bg-body-tertiary{--bs-bg-opacity:1;background-color:rgba(248,249,250,var(--bs-bg-opacity))!important;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:#cfe2ff!important;background-color:var(--bs-primary-bg-subtle)!important}.bg-secondary-subtle{background-color:#e2e3e5!important;background-color:var(--bs-secondary-bg-subtle)!important}.bg-success-subtle{background-color:#d1e7dd!important;background-color:var(--bs-success-bg-subtle)!important}.bg-info-subtle{background-color:#cff4fc!important;background-color:var(--bs-info-bg-subtle)!important}.bg-warning-subtle{background-color:#fff3cd!important;background-color:var(--bs-warning-bg-subtle)!important}.bg-danger-subtle{background-color:#f8d7da!important;background-color:var(--bs-danger-bg-subtle)!important}.bg-light-subtle{background-color:#fcfcfd!important;background-color:var(--bs-light-bg-subtle)!important}.bg-dark-subtle{background-color:#ced4da!important;background-color:var(--bs-dark-bg-subtle)!important}.bg-gradient{background-image:linear-gradient(180deg,hsla(0,0%,100%,.15),hsla(0,0%,100%,0))!important;background-image:var(--bs-gradient)!important}.user-select-all{-webkit-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;user-select:none!important}.pe-none{pointer-events:none!important}.pe-auto{pointer-events:auto!important}.rounded{border-radius:.375rem!important;border-radius:var(--bs-border-radius)!important}.rounded-0{border-radius:0!important}.rounded-1{border-radius:.25rem!important;border-radius:var(--bs-border-radius-sm)!important}.rounded-2{border-radius:.375rem!important;border-radius:var(--bs-border-radius)!important}.rounded-3{border-radius:.5rem!important;border-radius:var(--bs-border-radius-lg)!important}.rounded-4{border-radius:1rem!important;border-radius:var(--bs-border-radius-xl)!important}.rounded-5{border-radius:2rem!important;border-radius:var(--bs-border-radius-xxl)!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important;border-radius:var(--bs-border-radius-pill)!important}.rounded-top{border-top-left-radius:.375rem!important;border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:.375rem!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:.25rem!important;border-top-left-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:.25rem!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.rounded-top-2{border-top-left-radius:.375rem!important;border-top-left-radius:var(--bs-border-radius)!important;border-top-right-radius:.375rem!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-top-3{border-top-left-radius:.5rem!important;border-top-left-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:.5rem!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.rounded-top-4{border-top-left-radius:1rem!important;border-top-left-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:1rem!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.rounded-top-5{border-top-left-radius:2rem!important;border-top-left-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:2rem!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:50rem!important;border-top-left-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:50rem!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.rounded-end{border-bottom-right-radius:.375rem!important;border-bottom-right-radius:var(--bs-border-radius)!important;border-top-right-radius:.375rem!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-end-0{border-bottom-right-radius:0!important;border-top-right-radius:0!important}.rounded-end-1{border-bottom-right-radius:.25rem!important;border-bottom-right-radius:var(--bs-border-radius-sm)!important;border-top-right-radius:.25rem!important;border-top-right-radius:var(--bs-border-radius-sm)!important}.rounded-end-2{border-bottom-right-radius:.375rem!important;border-bottom-right-radius:var(--bs-border-radius)!important;border-top-right-radius:.375rem!important;border-top-right-radius:var(--bs-border-radius)!important}.rounded-end-3{border-bottom-right-radius:.5rem!important;border-bottom-right-radius:var(--bs-border-radius-lg)!important;border-top-right-radius:.5rem!important;border-top-right-radius:var(--bs-border-radius-lg)!important}.rounded-end-4{border-bottom-right-radius:1rem!important;border-bottom-right-radius:var(--bs-border-radius-xl)!important;border-top-right-radius:1rem!important;border-top-right-radius:var(--bs-border-radius-xl)!important}.rounded-end-5{border-bottom-right-radius:2rem!important;border-bottom-right-radius:var(--bs-border-radius-xxl)!important;border-top-right-radius:2rem!important;border-top-right-radius:var(--bs-border-radius-xxl)!important}.rounded-end-circle{border-bottom-right-radius:50%!important;border-top-right-radius:50%!important}.rounded-end-pill{border-bottom-right-radius:50rem!important;border-bottom-right-radius:var(--bs-border-radius-pill)!important;border-top-right-radius:50rem!important;border-top-right-radius:var(--bs-border-radius-pill)!important}.rounded-bottom{border-bottom-left-radius:.375rem!important;border-bottom-left-radius:var(--bs-border-radius)!important;border-bottom-right-radius:.375rem!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-bottom-0{border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.rounded-bottom-1{border-bottom-left-radius:.25rem!important;border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-bottom-right-radius:.25rem!important;border-bottom-right-radius:var(--bs-border-radius-sm)!important}.rounded-bottom-2{border-bottom-left-radius:.375rem!important;border-bottom-left-radius:var(--bs-border-radius)!important;border-bottom-right-radius:.375rem!important;border-bottom-right-radius:var(--bs-border-radius)!important}.rounded-bottom-3{border-bottom-left-radius:.5rem!important;border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-bottom-right-radius:.5rem!important;border-bottom-right-radius:var(--bs-border-radius-lg)!important}.rounded-bottom-4{border-bottom-left-radius:1rem!important;border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-bottom-right-radius:1rem!important;border-bottom-right-radius:var(--bs-border-radius-xl)!important}.rounded-bottom-5{border-bottom-left-radius:2rem!important;border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-bottom-right-radius:2rem!important;border-bottom-right-radius:var(--bs-border-radius-xxl)!important}.rounded-bottom-circle{border-bottom-left-radius:50%!important;border-bottom-right-radius:50%!important}.rounded-bottom-pill{border-bottom-left-radius:50rem!important;border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-bottom-right-radius:50rem!important;border-bottom-right-radius:var(--bs-border-radius-pill)!important}.rounded-start{border-bottom-left-radius:.375rem!important;border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:.375rem!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:.25rem!important;border-bottom-left-radius:var(--bs-border-radius-sm)!important;border-top-left-radius:.25rem!important;border-top-left-radius:var(--bs-border-radius-sm)!important}.rounded-start-2{border-bottom-left-radius:.375rem!important;border-bottom-left-radius:var(--bs-border-radius)!important;border-top-left-radius:.375rem!important;border-top-left-radius:var(--bs-border-radius)!important}.rounded-start-3{border-bottom-left-radius:.5rem!important;border-bottom-left-radius:var(--bs-border-radius-lg)!important;border-top-left-radius:.5rem!important;border-top-left-radius:var(--bs-border-radius-lg)!important}.rounded-start-4{border-bottom-left-radius:1rem!important;border-bottom-left-radius:var(--bs-border-radius-xl)!important;border-top-left-radius:1rem!important;border-top-left-radius:var(--bs-border-radius-xl)!important}.rounded-start-5{border-bottom-left-radius:2rem!important;border-bottom-left-radius:var(--bs-border-radius-xxl)!important;border-top-left-radius:2rem!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:50rem!important;border-bottom-left-radius:var(--bs-border-radius-pill)!important;border-top-left-radius:50rem!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{object-fit:contain!important}.object-fit-sm-cover{object-fit:cover!important}.object-fit-sm-fill{object-fit:fill!important}.object-fit-sm-scale{object-fit:scale-down!important}.object-fit-sm-none{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-left:0!important;margin-right:0!important}.mx-sm-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-sm-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-sm-3{margin-left:1rem!important;margin-right:1rem!important}.mx-sm-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-sm-5{margin-left:3rem!important;margin-right:3rem!important}.mx-sm-auto{margin-left:auto!important;margin-right:auto!important}.my-sm-0{margin-bottom:0!important;margin-top:0!important}.my-sm-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.my-sm-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.my-sm-3{margin-bottom:1rem!important;margin-top:1rem!important}.my-sm-4{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.my-sm-5{margin-bottom:3rem!important;margin-top:3rem!important}.my-sm-auto{margin-bottom:auto!important;margin-top: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-left:0!important;padding-right:0!important}.px-sm-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-sm-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-sm-3{padding-left:1rem!important;padding-right:1rem!important}.px-sm-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-sm-5{padding-left:3rem!important;padding-right:3rem!important}.py-sm-0{padding-bottom:0!important;padding-top:0!important}.py-sm-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.py-sm-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.py-sm-3{padding-bottom:1rem!important;padding-top:1rem!important}.py-sm-4{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.py-sm-5{padding-bottom:3rem!important;padding-top: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{-webkit-column-gap:0!important;column-gap:0!important}.column-gap-sm-1{-webkit-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-sm-2{-webkit-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-sm-3{-webkit-column-gap:1rem!important;column-gap:1rem!important}.column-gap-sm-4{-webkit-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-sm-5{-webkit-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{object-fit:contain!important}.object-fit-md-cover{object-fit:cover!important}.object-fit-md-fill{object-fit:fill!important}.object-fit-md-scale{object-fit:scale-down!important}.object-fit-md-none{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-left:0!important;margin-right:0!important}.mx-md-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-md-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-md-3{margin-left:1rem!important;margin-right:1rem!important}.mx-md-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-md-5{margin-left:3rem!important;margin-right:3rem!important}.mx-md-auto{margin-left:auto!important;margin-right:auto!important}.my-md-0{margin-bottom:0!important;margin-top:0!important}.my-md-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.my-md-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.my-md-3{margin-bottom:1rem!important;margin-top:1rem!important}.my-md-4{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.my-md-5{margin-bottom:3rem!important;margin-top:3rem!important}.my-md-auto{margin-bottom:auto!important;margin-top: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-left:0!important;padding-right:0!important}.px-md-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-md-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-md-3{padding-left:1rem!important;padding-right:1rem!important}.px-md-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-md-5{padding-left:3rem!important;padding-right:3rem!important}.py-md-0{padding-bottom:0!important;padding-top:0!important}.py-md-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.py-md-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.py-md-3{padding-bottom:1rem!important;padding-top:1rem!important}.py-md-4{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.py-md-5{padding-bottom:3rem!important;padding-top: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{-webkit-column-gap:0!important;column-gap:0!important}.column-gap-md-1{-webkit-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-md-2{-webkit-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-md-3{-webkit-column-gap:1rem!important;column-gap:1rem!important}.column-gap-md-4{-webkit-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-md-5{-webkit-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{object-fit:contain!important}.object-fit-lg-cover{object-fit:cover!important}.object-fit-lg-fill{object-fit:fill!important}.object-fit-lg-scale{object-fit:scale-down!important}.object-fit-lg-none{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-left:0!important;margin-right:0!important}.mx-lg-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-lg-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-lg-3{margin-left:1rem!important;margin-right:1rem!important}.mx-lg-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-lg-5{margin-left:3rem!important;margin-right:3rem!important}.mx-lg-auto{margin-left:auto!important;margin-right:auto!important}.my-lg-0{margin-bottom:0!important;margin-top:0!important}.my-lg-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.my-lg-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.my-lg-3{margin-bottom:1rem!important;margin-top:1rem!important}.my-lg-4{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.my-lg-5{margin-bottom:3rem!important;margin-top:3rem!important}.my-lg-auto{margin-bottom:auto!important;margin-top: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-left:0!important;padding-right:0!important}.px-lg-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-lg-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-lg-3{padding-left:1rem!important;padding-right:1rem!important}.px-lg-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-lg-5{padding-left:3rem!important;padding-right:3rem!important}.py-lg-0{padding-bottom:0!important;padding-top:0!important}.py-lg-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.py-lg-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.py-lg-3{padding-bottom:1rem!important;padding-top:1rem!important}.py-lg-4{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.py-lg-5{padding-bottom:3rem!important;padding-top: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{-webkit-column-gap:0!important;column-gap:0!important}.column-gap-lg-1{-webkit-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-lg-2{-webkit-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-lg-3{-webkit-column-gap:1rem!important;column-gap:1rem!important}.column-gap-lg-4{-webkit-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-lg-5{-webkit-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{object-fit:contain!important}.object-fit-xl-cover{object-fit:cover!important}.object-fit-xl-fill{object-fit:fill!important}.object-fit-xl-scale{object-fit:scale-down!important}.object-fit-xl-none{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-left:0!important;margin-right:0!important}.mx-xl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xl-auto{margin-left:auto!important;margin-right:auto!important}.my-xl-0{margin-bottom:0!important;margin-top:0!important}.my-xl-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.my-xl-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.my-xl-3{margin-bottom:1rem!important;margin-top:1rem!important}.my-xl-4{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.my-xl-5{margin-bottom:3rem!important;margin-top:3rem!important}.my-xl-auto{margin-bottom:auto!important;margin-top: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-left:0!important;padding-right:0!important}.px-xl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xl-0{padding-bottom:0!important;padding-top:0!important}.py-xl-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.py-xl-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.py-xl-3{padding-bottom:1rem!important;padding-top:1rem!important}.py-xl-4{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.py-xl-5{padding-bottom:3rem!important;padding-top: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{-webkit-column-gap:0!important;column-gap:0!important}.column-gap-xl-1{-webkit-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-xl-2{-webkit-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-xl-3{-webkit-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xl-4{-webkit-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xl-5{-webkit-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{object-fit:contain!important}.object-fit-xxl-cover{object-fit:cover!important}.object-fit-xxl-fill{object-fit:fill!important}.object-fit-xxl-scale{object-fit:scale-down!important}.object-fit-xxl-none{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-left:0!important;margin-right:0!important}.mx-xxl-1{margin-left:.25rem!important;margin-right:.25rem!important}.mx-xxl-2{margin-left:.5rem!important;margin-right:.5rem!important}.mx-xxl-3{margin-left:1rem!important;margin-right:1rem!important}.mx-xxl-4{margin-left:1.5rem!important;margin-right:1.5rem!important}.mx-xxl-5{margin-left:3rem!important;margin-right:3rem!important}.mx-xxl-auto{margin-left:auto!important;margin-right:auto!important}.my-xxl-0{margin-bottom:0!important;margin-top:0!important}.my-xxl-1{margin-bottom:.25rem!important;margin-top:.25rem!important}.my-xxl-2{margin-bottom:.5rem!important;margin-top:.5rem!important}.my-xxl-3{margin-bottom:1rem!important;margin-top:1rem!important}.my-xxl-4{margin-bottom:1.5rem!important;margin-top:1.5rem!important}.my-xxl-5{margin-bottom:3rem!important;margin-top:3rem!important}.my-xxl-auto{margin-bottom:auto!important;margin-top: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-left:0!important;padding-right:0!important}.px-xxl-1{padding-left:.25rem!important;padding-right:.25rem!important}.px-xxl-2{padding-left:.5rem!important;padding-right:.5rem!important}.px-xxl-3{padding-left:1rem!important;padding-right:1rem!important}.px-xxl-4{padding-left:1.5rem!important;padding-right:1.5rem!important}.px-xxl-5{padding-left:3rem!important;padding-right:3rem!important}.py-xxl-0{padding-bottom:0!important;padding-top:0!important}.py-xxl-1{padding-bottom:.25rem!important;padding-top:.25rem!important}.py-xxl-2{padding-bottom:.5rem!important;padding-top:.5rem!important}.py-xxl-3{padding-bottom:1rem!important;padding-top:1rem!important}.py-xxl-4{padding-bottom:1.5rem!important;padding-top:1.5rem!important}.py-xxl-5{padding-bottom:3rem!important;padding-top: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{-webkit-column-gap:0!important;column-gap:0!important}.column-gap-xxl-1{-webkit-column-gap:.25rem!important;column-gap:.25rem!important}.column-gap-xxl-2{-webkit-column-gap:.5rem!important;column-gap:.5rem!important}.column-gap-xxl-3{-webkit-column-gap:1rem!important;column-gap:1rem!important}.column-gap-xxl-4{-webkit-column-gap:1.5rem!important;column-gap:1.5rem!important}.column-gap-xxl-5{-webkit-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}} -/*# sourceMappingURL=main.bb4c518c.css.map*/ \ No newline at end of file diff --git a/neural_insights/web/app/static/css/main.bb4c518c.css.map b/neural_insights/web/app/static/css/main.bb4c518c.css.map deleted file mode 100644 index 931c1f164a2..00000000000 --- a/neural_insights/web/app/static/css/main.bb4c518c.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/css/main.bb4c518c.css","mappings":"AAgBI,gBAOF,CCHA,mGCWA,cACE,wBACA,CAFF,WAGE,yBAEA,gBADA,iBACA,yBAIF,6BACE,+CAGF,mBACE,+BAGF,gBAEE,CALA,WADF,YACE,kBAKA,gCAMA,mCACE,iCAGF,mCACE,6CAGF,kBACE,CADF,WACE,2CAMF,yBACE,4CAGF,yBACE,2CAGF,6BACE,6CAGF,yBACE,4CAGF,yBACE,6CAKF,yBACE,4CAIJ,yBACE,4CACA,6BAKF,2CAOF,qCACE,CACA,wBACA,iDAGF,mBAEE,yBACA,+BAGF,kCACE,CACA,kCACA,CAFA,oBAEA,uCAMA,+BACA,CAFF,oBAEE,+CACA,8KCtGA,2BACE,wBACA,WACA,yBACA,wBAIA,yCAGA,YADA,gBACA,yBAIA,wBACA,CACA,qBACA,CADA,YAHF,eAIE,wBASF,oEALE,qBACA,CACA,mBAGF,CAJE,YAYF,CARA,2BAKE,cAGF,qBAGE,wBAGF,CALE,YACA,gBAIF,4BAEE,aACA,qBACA,CAHA,cAGA,eAGF,CANE,WAMF,4BACE,YACA,CACA,mCAGF,4BAKA,qBAIA,qBARE,4BAIF,CAIA,aACE,uBAGA,6BAGF,CAJE,qBAIF,yBACE,WACA,sCAGF,SACE,6BAGA,cADA,cACA,CAGF,iBACE,CAJA,iBAIA,4BAIA,sBAGF,eACE,+BAIA,aACA,CAFA,aACA,CAIF,kBAHE,iBAGF,CACE,sBACA,cAIF,oBACE,8MC/GA,0BAGF,YAGE,kBAEA,4DAKF,0BAEE,oBACA,CAZA,WACA,CACA,YADA,iBAWA,mBAIF,wBAEE,kBACA,CAHF,WAKE,cAGF,CALE,WACA,kBACA,CAFA,UAKF,uBAIE,YAFA,cAEA,CAHA,iBACA,CAEA,gCAIA,wBAIF,CACE,YADF,UACE,CANF,cACE,gBAKA,+BACA,yLCxDJ,eACE,YAGF,WACE,aACA,eCNF,WAEE,sBACA,oBACA,eAHA,YAGA,CCIA,6ECCA,2ECuDF,WACE,uBACA,wEAIA,YACA,6FAKA,kCAIA,sEAIF,YACE,wBACA,8DAIA,oCACA,8DAKA,CAKA,mCClGA,8DAGA,uMVpBF,uBAeE,UACE,kBAIJ,WAGE,oCAFA,oBACA,gBAOA,CANA,kBAGF,WAGE,CW5BA;;;;ECDF,6BASI,oQAIA,sMAIA,iKAIA,sNAIA,iRAIA,iPAIA,iRAGF,2BACA,qBAMA,yMACA,mGACA,4EAOA,gDC2OI,yBDzOJ,0BACA,0BAKA,wBACA,6BACA,kBACA,6BAEA,yBACA,8BAEA,wCACA,kCACA,0BACA,kCAEA,sCACA,iCACA,yBACA,iCAGA,2BAEA,wBACA,+BACA,+BAEA,8BACA,oCAMA,wBACA,0BAGA,sBACA,wBACA,0BACA,+CAEA,4BACA,8BACA,6BACA,2BACA,4BACA,mDACA,8BAGA,8CACA,uDACA,gDACA,uDAIA,8BACA,6BACA,2CAIA,8BACA,qCACA,gCACA,uCE/GE,sBFwHA,uBACA,gCACA,qBACA,0BAEA,yBACA,oCAEA,2CACA,qCACA,0BACA,+BAEA,yCACA,oCACA,yBACA,8BAGE,iRAIA,iPAIA,iRAGF,2BAEA,wBACA,8BACA,gCACA,sCAEA,wBAEA,0BACA,kDAEA,8BACA,qCACA,gCACA,wCAhDA,iBGkDJ,kBCpKE,qBAeE,+CANJ,MAOM,sBAcN,OASE,6BACA,yCAFA,qBACA,CADA,kCACA,CAHA,aACA,CADA,0BACA,CALA,+KH6OI,CG7OJ,sCH6OI,eG3OJ,CH2OI,kCG3OJ,gBACA,CADA,sCACA,gBACA,CADA,sCACA,CALA,QACA,CAKA,oCAYF,CACE,GAEA,QACA,qBACA,CADA,uCACA,CAHA,aACA,CAFA,aACA,CAGA,WAUF,2CAOE,aAGF,CAHE,8BAFA,eACA,gBACA,CALA,mBAGA,CAJA,YASF,QHuMQ,gCA5JJ,2BG3CJ,OH8MQ,gBGzMR,SHkMQ,+BA5JJ,2BGtCJ,OHyMQ,cGpMR,SH6LQ,6BA5JJ,2BGjCJ,OHoMQ,iBG/LR,SHwLQ,+BA5JJ,2BG5BJ,OH+LQ,gBG1LR,SH+KM,iBG1KN,QH0KM,cG9JJ,GACA,mBADA,YAWF,aAEE,WACA,CAFA,yEACA,CACA,mEAMF,SAEE,iBACA,qBAFA,kBAQF,CD+HA,MC7HE,iBDmIF,CChIA,SAIE,mBADA,YAIF,yBAIE,eAGF,CACE,kBAKF,CACE,sBACA,cAMF,YACE,eD6HF,UCnHE,kBAQF,cH6EM,gBGtEN,YAEE,wBASF,CATE,wCADA,eAUF,SH2DM,eGvDJ,cACA,CAHA,iBHyDI,CGtDJ,sBAGF,KAAM,aACN,KAAM,SAMJ,gBACA,CADA,6DACA,0BAEA,SACE,kDAWF,6DAEE,aACA,qBDmGJ,mBCxFE,sFHeI,CGfJ,oCHeI,cGPN,KACE,aACA,CHKI,iBGJJ,kBACA,CAFA,YACA,CACA,aAKA,UAEE,aACA,CHLE,iBGIF,CACA,iBAIJ,MAGE,qBADA,aACA,CADA,0BACA,CHZI,gBGeJ,QACE,aAIJ,KAIE,wBCpSE,CDoSF,qCCpSE,sBDmSF,UACA,CADA,uBACA,CHxBI,gBGuBJ,CAFA,wBAMA,SH3BI,cG4BF,SAWJ,QACE,eAMF,SAEE,qBAQF,OAEE,yBADA,mBAIF,SAGE,wBACA,CADA,+BACA,CAFA,oBACA,CAFA,iBACA,CAEA,eAOF,CAEE,qBACA,gCDkEF,4BCvDE,eAFA,oBAUF,OACE,oBAMF,QAEE,eAQF,kCACE,SDoDF,uCCzCE,mBH3HI,kBG6HJ,qBAHA,QAOF,eAEE,mBAKF,eACE,cAGF,QAGE,gBAGA,iBACE,SAOJ,2IACE,sBDwCF,iDC5BE,yBDkCF,6GC9BM,cAON,oBAEE,kBADA,SAMF,UACE,eAUF,UAIE,SADA,QACA,CAHA,WACA,UAUF,QACE,UACA,CH9MM,+BGmNN,qBAHA,mBHhNM,CG+MN,SACA,CAFA,UH1WE,2BGwWJ,OHrMQ,gBG8MN,WACE,UD0BJ,gPCZE,SAGF,6BACE,WASF,eAEE,6BADA,mBAoBF,6BACE,uBAKF,gCACE,SAOF,8BAEE,0BADA,YADF,wBAEE,0BADA,YAMF,QACE,oBAKF,QACE,QAOF,SAEE,eADA,iBASF,UACE,sBAQF,UACE,sBEpkBF,OLmQM,iBKjQJ,gBAKA,YLgQM,gCK5PJ,gBACA,gBL+FA,2BKpGF,WLuQM,cKvQN,aLgQM,gCK5PJ,gBACA,gBL+FA,2BKpGF,WLuQM,gBKvQN,aLgQM,gCK5PJ,gBACA,gBL+FA,2BKpGF,WLuQM,cKvQN,aLgQM,gCK5PJ,gBACA,gBL+FA,2BKpGF,WLuQM,gBKvQN,aLgQM,gCK5PJ,gBACA,gBL+FA,2BKpGF,WLuQM,cKvQN,aLgQM,gCK5PJ,gBACA,gBL+FA,2BKpGF,WLuQM,gBK/OR,EAKA,4BC3DE,gBADA,cD+DF,mBACE,oBAEA,oCACE,kBAUJ,aL8MM,gBK5MJ,yBAIF,aLwMM,kBKvMJ,kBAGA,yBACE,eAIJ,oBAIE,cL2LI,gBK3LJ,CAFA,kBL6LI,CK9LJ,gBAKA,2BACE,YEhGJ,CAMA,0BCCE,YAHA,cDiBF,CAfA,eAEE,qBACA,CADA,kCACA,yBHGE,CGHF,0DHGE,sBIRF,CJQE,qCIRF,CDGA,cAcF,SAEE,oBAGF,aAEE,cADA,mBAIF,iBAEE,wBElCA,CFkCA,gCPuPI,gBSzRJ,oGCHA,oBACA,gBACA,CAIA,iBADA,iBACA,CAFA,wCACA,CAFA,yCACA,CAFA,UC0DE,0BF5CE,yBACE,eE2CJ,2BF5CE,uCACE,eE2CJ,2BF5CE,qDACE,eE2CJ,4BF5CE,mEACE,gBE2CJ,4BF5CE,kFACE,gBGhBR,QAEI,oJAKF,MCNA,oBACA,gBACA,aACA,eAEA,CAEA,yCADA,yCACA,CAFA,sCDIE,QCOF,aACA,CAIA,8BAHA,cACA,CACA,wCACA,CAFA,yCACA,CAHA,UAmDI,MACE,QAGF,kBApCJ,aACA,WAcA,eACE,aACA,WAFF,eACE,aACA,UAFF,eACE,aACA,qBAFF,eACE,aACA,UAFF,eACE,aACA,UAFF,eACE,aACA,qBA+BE,WAhDJ,aACA,WAqDQ,QAhEN,aACA,kBA+DM,QAhEN,aACA,mBA+DM,QAhEN,aACA,UA+DM,QAhEN,aACA,mBA+DM,QAhEN,aACA,mBA+DM,QAhEN,aACA,UA+DM,QAhEN,aACA,mBA+DM,QAhEN,aACA,mBA+DM,QAhEN,aACA,UA+DM,SAhEN,aACA,mBA+DM,SAhEN,aACA,mBA+DM,SAhEN,aACA,WAuEQ,WAxDV,uBAwDU,WAxDV,wBAwDU,WAxDV,eAwDU,WAxDV,wBAwDU,WAxDV,wBAwDU,WAxDV,eAwDU,WAxDV,wBAwDU,WAxDV,wBAwDU,WAxDV,eAwDU,YAxDV,wBAwDU,YAxDV,wBAmEM,YAEE,eAGF,YAEE,eAPF,YAEE,qBAGF,YAEE,qBAPF,YAEE,oBAGF,YAEE,oBAPF,YAEE,kBAGF,YAEE,kBAPF,YAEE,oBAGF,YAEE,oBAPF,YAEE,kBAGF,YAEE,kBF1DN,0BEUE,QACE,QAGF,qBApCJ,aACA,WAcA,kBACE,aACA,WAFF,kBACE,aACA,UAFF,kBACE,aACA,qBAFF,kBACE,aACA,UAFF,kBACE,aACA,UAFF,kBACE,aACA,qBA+BE,cAhDJ,aACA,WAqDQ,WAhEN,aACA,kBA+DM,WAhEN,aACA,mBA+DM,WAhEN,aACA,UA+DM,WAhEN,aACA,mBA+DM,WAhEN,aACA,mBA+DM,WAhEN,aACA,UA+DM,WAhEN,aACA,mBA+DM,WAhEN,aACA,mBA+DM,WAhEN,aACA,UA+DM,YAhEN,aACA,mBA+DM,YAhEN,aACA,mBA+DM,YAhEN,aACA,WAuEQ,cAxDV,aAwDU,cAxDV,uBAwDU,cAxDV,wBAwDU,cAxDV,eAwDU,cAxDV,wBAwDU,cAxDV,wBAwDU,cAxDV,eAwDU,cAxDV,wBAwDU,cAxDV,wBAwDU,cAxDV,eAwDU,eAxDV,wBAwDU,eAxDV,wBAmEM,kBAEE,eAGF,kBAEE,eAPF,kBAEE,qBAGF,kBAEE,qBAPF,kBAEE,oBAGF,kBAEE,oBAPF,kBAEE,kBAGF,kBAEE,kBAPF,kBAEE,oBAGF,kBAEE,oBAPF,kBAEE,kBAGF,kBAEE,kBF1DN,2BEUE,QACE,QAGF,qBApCJ,aACA,WAcA,kBACE,aACA,WAFF,kBACE,aACA,UAFF,kBACE,aACA,qBAFF,kBACE,aACA,UAFF,kBACE,aACA,UAFF,kBACE,aACA,qBA+BE,cAhDJ,aACA,WAqDQ,WAhEN,aACA,kBA+DM,WAhEN,aACA,mBA+DM,WAhEN,aACA,UA+DM,WAhEN,aACA,mBA+DM,WAhEN,aACA,mBA+DM,WAhEN,aACA,UA+DM,WAhEN,aACA,mBA+DM,WAhEN,aACA,mBA+DM,WAhEN,aACA,UA+DM,YAhEN,aACA,mBA+DM,YAhEN,aACA,mBA+DM,YAhEN,aACA,WAuEQ,cAxDV,aAwDU,cAxDV,uBAwDU,cAxDV,wBAwDU,cAxDV,eAwDU,cAxDV,wBAwDU,cAxDV,wBAwDU,cAxDV,eAwDU,cAxDV,wBAwDU,cAxDV,wBAwDU,cAxDV,eAwDU,eAxDV,wBAwDU,eAxDV,wBAmEM,kBAEE,eAGF,kBAEE,eAPF,kBAEE,qBAGF,kBAEE,qBAPF,kBAEE,oBAGF,kBAEE,oBAPF,kBAEE,kBAGF,kBAEE,kBAPF,kBAEE,oBAGF,kBAEE,oBAPF,kBAEE,kBAGF,kBAEE,kBF1DN,2BEUE,QACE,QAGF,qBApCJ,aACA,WAcA,kBACE,aACA,WAFF,kBACE,aACA,UAFF,kBACE,aACA,qBAFF,kBACE,aACA,UAFF,kBACE,aACA,UAFF,kBACE,aACA,qBA+BE,cAhDJ,aACA,WAqDQ,WAhEN,aACA,kBA+DM,WAhEN,aACA,mBA+DM,WAhEN,aACA,UA+DM,WAhEN,aACA,mBA+DM,WAhEN,aACA,mBA+DM,WAhEN,aACA,UA+DM,WAhEN,aACA,mBA+DM,WAhEN,aACA,mBA+DM,WAhEN,aACA,UA+DM,YAhEN,aACA,mBA+DM,YAhEN,aACA,mBA+DM,YAhEN,aACA,WAuEQ,cAxDV,aAwDU,cAxDV,uBAwDU,cAxDV,wBAwDU,cAxDV,eAwDU,cAxDV,wBAwDU,cAxDV,wBAwDU,cAxDV,eAwDU,cAxDV,wBAwDU,cAxDV,wBAwDU,cAxDV,eAwDU,eAxDV,wBAwDU,eAxDV,wBAmEM,kBAEE,eAGF,kBAEE,eAPF,kBAEE,qBAGF,kBAEE,qBAPF,kBAEE,oBAGF,kBAEE,oBAPF,kBAEE,kBAGF,kBAEE,kBAPF,kBAEE,oBAGF,kBAEE,oBAPF,kBAEE,kBAGF,kBAEE,kBF1DN,4BEUE,QACE,QAGF,qBApCJ,aACA,WAcA,kBACE,aACA,WAFF,kBACE,aACA,UAFF,kBACE,aACA,qBAFF,kBACE,aACA,UAFF,kBACE,aACA,UAFF,kBACE,aACA,qBA+BE,cAhDJ,aACA,WAqDQ,WAhEN,aACA,kBA+DM,WAhEN,aACA,mBA+DM,WAhEN,aACA,UA+DM,WAhEN,aACA,mBA+DM,WAhEN,aACA,mBA+DM,WAhEN,aACA,UA+DM,WAhEN,aACA,mBA+DM,WAhEN,aACA,mBA+DM,WAhEN,aACA,UA+DM,YAhEN,aACA,mBA+DM,YAhEN,aACA,mBA+DM,YAhEN,aACA,WAuEQ,cAxDV,aAwDU,cAxDV,uBAwDU,cAxDV,wBAwDU,cAxDV,eAwDU,cAxDV,wBAwDU,cAxDV,wBAwDU,cAxDV,eAwDU,cAxDV,wBAwDU,cAxDV,wBAwDU,cAxDV,eAwDU,eAxDV,wBAwDU,eAxDV,wBAmEM,kBAEE,eAGF,kBAEE,eAPF,kBAEE,qBAGF,kBAEE,qBAPF,kBAEE,oBAGF,kBAEE,oBAPF,kBAEE,kBAGF,kBAEE,kBAPF,kBAEE,oBAGF,kBAEE,oBAPF,kBAEE,kBAGF,kBAEE,kBF1DN,4BEUE,SACE,QAGF,sBApCJ,aACA,WAcA,mBACE,aACA,WAFF,mBACE,aACA,UAFF,mBACE,aACA,qBAFF,mBACE,aACA,UAFF,mBACE,aACA,UAFF,mBACE,aACA,qBA+BE,eAhDJ,aACA,WAqDQ,YAhEN,aACA,kBA+DM,YAhEN,aACA,mBA+DM,YAhEN,aACA,UA+DM,YAhEN,aACA,mBA+DM,YAhEN,aACA,mBA+DM,YAhEN,aACA,UA+DM,YAhEN,aACA,mBA+DM,YAhEN,aACA,mBA+DM,YAhEN,aACA,UA+DM,aAhEN,aACA,mBA+DM,aAhEN,aACA,mBA+DM,aAhEN,aACA,WAuEQ,eAxDV,aAwDU,eAxDV,uBAwDU,eAxDV,wBAwDU,eAxDV,eAwDU,eAxDV,wBAwDU,eAxDV,wBAwDU,eAxDV,eAwDU,eAxDV,wBAwDU,eAxDV,wBAwDU,eAxDV,eAwDU,gBAxDV,wBAwDU,gBAxDV,wBAmEM,oBAEE,eAGF,oBAEE,eAPF,oBAEE,qBAGF,oBAEE,qBAPF,oBAEE,oBAGF,oBAEE,oBAPF,oBAEE,kBAGF,oBAEE,kBAPF,oBAEE,oBAGF,oBAEE,oBAPF,oBAEE,kBAGF,oBAEE,kBCrHV,SAEE,6BACA,2BACA,+BACA,4BAEA,sCACA,gCACA,+CACA,iCACA,8CACA,sCACA,6CACA,oCACA,4CACA,qCAEA,CAGA,0CAFA,kBACA,mBACA,CAHA,UAUA,0BAIE,mCACA,wBACA,CADA,0CACA,wDAGF,CAHE,yGAHA,2BACA,CADA,kFACA,CAHA,aAQF,cACE,sBAGF,cACE,qBAIJ,sBACE,oBAOF,CAPE,+CAOF,cACE,gBAUA,6BACE,cAeF,iCACE,kBAGA,CAHA,qCAGA,mCACE,kBAOJ,CAPI,qCAOJ,qCACE,qBAGF,sCACE,kBAUF,CAQA,kGACE,mDACA,8CAQJ,eACE,mDACA,8CAQA,+BACE,kDACA,6CC5IF,gBAOE,qBACA,sBACA,gCACA,8BACA,8BACA,6BACA,6BACA,4BACA,4BAfF,iCAkBE,0CADA,2BAjBF,kBAOE,qBACA,sBACA,gCACA,8BACA,8BACA,6BACA,6BACA,4BACA,4BAfF,gBAOE,qBACA,sBACA,gCACA,8BACA,8BACA,6BACA,6BACA,4BACA,4BAfF,4BAkBE,0CADA,2BAjBF,aAOE,qBACA,sBACA,gCACA,8BACA,8BACA,6BACA,6BACA,4BACA,4BAfF,gBAOE,qBACA,sBACA,gCACA,8BACA,8BACA,6BACA,6BACA,4BACA,4BAfF,8BAkBE,0CADA,2BAjBF,eAOE,qBACA,sBACA,gCACA,8BACA,8BACA,6BACA,6BACA,4BACA,4BAfF,cAOE,qBACA,sBACA,gCACA,8BACA,8BACA,6BACA,6BACA,4BACA,4BAfF,0BAkBE,0CADA,2BDkJA,CCnKF,YAOE,qBACA,sBACA,gCACA,8BACA,8BACA,6BACA,6BACA,4BACA,4BDoJA,mBAEE,iCADA,eH1FF,6BGyFA,qBAEE,iCADA,eH1FF,8BGyFA,qBAEE,iCADA,eH1FF,8BGyFA,qBAEE,iCADA,eH1FF,+BGyFA,qBAEE,iCADA,eH1FF,+BGyFA,sBAEE,iCADA,eElKN,cACE,mBASF,iBhBiRM,iBgB1QJ,iBAJA,ehB8QI,CgB/QJ,kCACA,CADA,qDACA,CAFA,+BACA,CADA,kDAUF,oBhBsQM,kBgBpQJ,gChBoQI,CgBpQJ,mDhBoQI,CgBrQJ,6BACA,CADA,gDAKF,oBhBgQM,kBgB9PJ,iChB8PI,CgB9PJ,oDhB8PI,CgB/PJ,8BACA,CADA,iDC5BF,YAKE,wBCLF,CDKE,gCjBsRI,gBiBtRJ,CAJA,iBCDF,eAYE,uCdGE,CcLF,2BACA,CAFA,qBACA,CADA,kCACA,CACA,wBACA,CADA,0DACA,CdGE,qBeHE,CfGF,qCeHE,CDJJ,aACA,CADA,0BACA,CARA,aACA,ClByRI,ckBrRJ,gBACA,gBACA,CALA,sBlBwRI,CmB/QA,qEDVJ,UCcI,wCDhBN,cCiBQ,eDGN,2BACE,eAEA,yDACE,cAKJ,qBAEE,qBACA,CADA,kCACA,qBACA,CAKE,6CARF,aACA,CADA,0BACA,CAEA,SASF,4CAYE,YAKA,UAXA,cAgBF,sCACE,aACA,UAIF,0CACE,wBAEA,CAFA,+BAEA,UAQF,CAXA,2BACE,wBAEA,CAFA,+BAEA,UAQF,wBAEE,wBAGA,CAHA,uCAGA,UAIF,2CAGE,0BE7FF,wBFgGE,CEhGF,sCFgGE,CAGA,cACA,CAHA,oBACA,CAEA,2BACA,CADA,8CACA,gBCzFE,CDkFF,aE9FF,CF8FE,0BE9FF,CF4FE,uBACA,yBACA,CAHA,sBACA,CAIA,mBACA,CCrFE,qID8EJ,CC9EI,6HD8EJ,qCAGE,0BE7FF,wBFgGE,CEhGF,sCFgGE,CAGA,cACA,CAHA,oBACA,CAEA,2BACA,CADA,8CACA,gBCzFE,CDkFF,aE9FF,CF8FE,0BE9FF,CF4FE,uBACA,yBACA,CAHA,sBACA,CAIA,mBACA,CCrFE,6HAIA,wCD0EJ,0CCzEM,uBDyEN,CCzEM,eDyEN,qCCzEM,eDwFN,iFACE,wBADF,CACE,uCADF,0EACE,wBASJ,CATI,uCASJ,yBAOE,wBACA,CACA,wBAEA,CAFA,kBAEA,CAFA,sCAHA,aACA,CADA,0BACA,CANA,aACA,CAGA,eACA,CAFA,eACA,CAFA,iBACA,CAFA,UASA,+BACE,SAGF,iFAGE,eADA,eAYJ,kBdjII,oBcuIF,CdvIE,yCJ4QE,iBI5QF,CckIF,oCACA,CADA,yDACA,qBAIA,8CAGE,yBADA,qBACA,yBAFA,oBADF,wCAGE,yBADA,qBACA,yBAFA,oBAMJ,kBd9II,mBcoJF,CdpJE,yCJ4QE,iBI5QF,Cc+IF,mCACA,CADA,wDACA,mBAIA,8CAGE,wBADA,mBACA,wBAFA,kBADF,wCAGE,wBADA,mBACA,wBAFA,kBAUF,uBACE,qCAGF,CAHE,0DAGF,0BACE,oCAGF,CAHE,yDAGF,0BACE,mCAKJ,CALI,wDAKJ,qBAEE,iCACA,CADA,sDACA,iBAFA,UAIA,oDACE,cAGF,wCACE,kBdvLA,sBc2LF,Cd3LE,qCc2LF,2CACE,kBd5LA,sBcgMF,CdhME,qCcgMF,qCAAoB,gCACpB,CADoB,qDACpB,qCAAoB,+BG/MtB,CH+MsB,oDG/MtB,cACE,qQAWA,CAqBA,wCAnBA,wDACA,mDACA,iFjBFE,CeHE,wCfGF,2BeHE,0BESJ,oFApBF,sBAsBE,sCACE,CAXF,aACA,4BADA,oGAWE,oEAUF,CArBA,UAqBA,wCAGE,aAGF,oCAEE,iEAKF,CALE,SAKF,CACE,0DACA,qBAKF,CALE,oBAKF,uBACA,wBACA,wCjBzCE,wEiB+CF,uCAEA,iBAOE,6DACE,CjBzDF,iBiBwDA,CjBxDA,yCJ4QE,kBqBnNA,iBCrEJ,mBACA,yCAGE,CALF,iBACA,CAHF,oBACE,kBACA,CDsEI,iBCjEF,mCAKJ,qQAmBE,0BACA,sBACA,CADA,oCACA,+BACA,UACA,wCACA,0FACA,YACA,cADA,mBACA,uDAGA,CAqBE,uBAEA,iBAjBA,wCAGF,+CACE,CAGF,uBAEE,CALA,2BAGF,CAEE,uBACA,oFAKA,ClB/CA,2BkB8BF,CAmBE,gCAII,0BAvBN,mBAJA,SA2BM,kCAIJ,kDAII,yEAKN,uBACE,yBACA,oBAKE,kFAIJ,wBACE,qBACA,0CAQA,oQAwBA,uCACA,4KAIA,gDAIA,8PAiBE,CApBA,6CAoBA,4BAOJ,mBAGF,YACE,WACA,CANA,mBAMA,4FAMI,yBACA,gCACA,gCAOF,oLC5KF,0CAOE,wCAA0B,CAP5B,mBAO4B,+CAC1B,CARF,SAQE,wCAA0B,qFAG5B,0KJNI,+MAIA,CAJA,wBAIA,iCACE,eIKN,mBJLM,mDCjBN,cGiCE,mBHjCF,oBGsCA,sCACE,YAEA,kBACA,CACA,oBAHA,iBAGA,oDnB5BA,mBmBkCF,yBALE,mBAKF,+EnBlCE,0LeHE,aIqCJ,uCJhCM,CADF,wBIiCJ,CAQE,aJzCE,WAJA,UAKE,4BI0CJ,yCH3DF,2DGiEE,qCAGA,2DACA,+BACA,2CCvEF,wCD+EE,iCACE,oBAHF,8BAEA,CACE,8GAIA,uGCpFJ,CD4EA,UC5EA,0EAGE,kFACA,oEAIF,wBAEE,uCAIA,yBACA,mBACA,CAXA,iBAGF,gBAJE,YACA,CADA,UAYA,+BLHE,gBKMF,wBACA,6BAFA,WACA,CACA,2GLPE,wGKKF,ULLE,0FAIA,uDACE,wBKON,+BtBwiFF,4GsBxiFE,iBAEE,etBsiFJ,CsBxiFE,uBtBwiFF,sBsBniFM,mBtBmiFN,+EsBniFM,2CtB2iFN,wPAMA,wEsBtiFM,CtBojFN,iBsBpjFM,6BAIJ,mDtBgjFF,sBsBtiFM,4BACA,iDtBqiFN,uDsBtiFM,oBtBsiFN,yDsBtiFM,CtBsiFN,MsBriFM,sHtBqjFN,6JsBtjFM,mBtBsiFN,SAgBA,wCsBjjFQ,qBAEA,eACA,sEpB/CJ,8IoBwDE,gHACA,sNAcA,uBADF,oBACE,uGC/EJ,uBAHA,oBAGA,mDAGE,CAHF,oBAGE,oLAiBA,wBAGA,yCAYJ,mEzBiPM,2DyB1OJ,4MvBioFF,oHuB/mFE,CrBpDE,UFmqFJ,CEnqFI,gCqBsCF,iBrBtCE,WqBoDF,qDrBpDE,iEF4qFJ,8HE5qFI,gEqBkEJ,sEAEE,avBonFF,ibAOA,+HE/qFI,wBACA,uCqBsFF,gJACE,CvBulFJ,gKuBvlFI,mHAIF,oNC5FA,oBAHE,yCAIA,C1B2PE,iB0B/PF,CAHA,oBAOA,2DAKA,kBACA,CAiBE,iqBAWE,6BADF,yBACE,2IAWA,4BADA,wBACA,CA3EJ,4DA2EI,wHAOF,2BAGE,mKAEE,wBACA,mCACA,4DACA,CAHA,WAFF,aAEE,mCAFF,mCAEE,CAFF,oCAKE,+HAKF,wEA/FJ,wQAiHE,yDACE,CADF,4BACE,2DAGF,CArBE,sGAqBF,uEACE,+GAGF,mIAOA,6EAhIF,CA+HA,kCA/HA,yV1ByRE,gRI5QF,6DFk0FJ,uEEl0FI,sBFk0FJ,qEwB/0FI,mEAqDE,oGAIE,uEACA,2BACA,mEACA,oBAGF,kIACE,wBACA,2HAjEJ,2CA0EI,wDACA,uGA3EJ,aAkFE,uFAGE,mWAIE,SACA,mBAIJ,iDAJI,6BAIJ,CAJI,4BAIJ,kBAEE,0DAhGJ,4DAwGI,CARA,WADA,aACA,mCADA,cACA,sBADA,oCASA,+IAOF,4EAMA,qUAWA,CAhIF,yDAgIE,2BAhIF,6DAiHE,qEACE,mCAlHJ,mPCAF,+EAIA,6EAGA,C3BkRI,kC2BlRJ,6DAEA,qEACA,qOAIA,6UAgBA,6DvBjBE,sEeHE,CQoBJ,sBRpBI,8IQZN,4CAuCI,uDAEA,2EAMA,2BACA,uEAIF,oBACE,iDPrDF,uFO6DI,wBAIJ,8CACE,mFAUF,kGAKE,2GAIA,aAGA,0cA8BF,SCtGA,gCAEA,6BACA,8CACA,yBACA,yBACA,oCACA,wBACA,6CACA,kCACA,+CACA,wCACA,iFAXA,+BACA,gFAGA,CACA,kCAJA,kEAEA,0CAEA,CAKA,yBACA,CD0FA,cCtGA,CAKA,oBACA,CACA,qCAEA,mCACA,2EACA,CALA,uDACA,CAKA,iBACA,sBAPA,6HAIA,CAVA,wBACA,iBACA,CAWA,qBAHA,wCACA,oBACA,aACA,uCAbA,8CAEA,CAUA,+BAVA,uBAEA,iCACA,wCACA,CAHA,yBAGA,oBAEA,uCACA,8CACA,0CACA,CAJA,+BACA,CAEA,SACA,+BACA,6CACA,CDyFA,yCCrGA,CDqGA,SCrGA,oGAKA,wCACA,+CAEA,CAJA,gCAIA,0KAIA,yCAbA,oDAKA,0CACA,iDACA,CALA,kCAEA,CAGA,sCAEA,CALA,mBAKA,iCACA,4EACA,0BACA,oCACA,qCAbA,2BACA,2BACA,qCAEA,wDAEA,0DACA,uCAEA,mCACA,4EACA,0BACA,oCACA,sCAbA,2BACA,CACA,+DAEA,wDAEA,8BACA,4BACA,uCACA,iCACA,mDACA,mDACA,oCACA,qCAYA,2BACA,2BACA,qCACA,wDAEA,6BACA,6BACA,uCACA,8BACA,kDACA,2BACA,6DACA,qCD2FA,2BCvGA,2BACA,qCACA,wDAEA,6BACA,6BACA,uCACA,CACA,oDACA,wDACA,0BACA,oCACA,oCACA,2BD0FA,2BCvGA,qCAEA,wDAEA,6BACA,oEAEA,gCACA,kDACA,oDACA,oCACA,oCACA,2BACA,2BAbA,qCACA,wDAEA,6BACA,6BACA,uCACA,YACA,uCACA,8BACA,oDACA,oCACA,sCACA,4BACA,0BD0FA,qCCtGA,wDAEA,6BACA,6BACA,uCACA,8BACA,qBACA,uDACA,8DACA,mCACA,2BACA,2BACA,qCAbA,wDAEA,6BACA,6BACA,uCACA,sBACA,sBACA,8BACA,oDACA,yEACA,CACA,qDACA,qCACA,CD0FA,uDCtGA,gCACA,iCAEA,uCACA,2CACA,sBACA,8BACA,oDACA,0EAEA,sDACA,qCD2FA,wDCtGA,gCACA,iCAEA,uCACA,yCACA,sBACA,8BACA,0BACA,8DACA,oCACA,2BACA,gEDuGF,wDAEE,gCAEA,iCACA,0DACA,yCACA,wDACA,0BACA,oCACA,qCACA,2BACA,gEAYA,wDAIA,gCACE,iCC7HF,uCACA,mB5B8NI,sB4B5NJ,oDDyIF,0BC5IE,0BACA,oC5B8NI,oC4B5NJ,4BCnEF,0BVgBM,qCAIA,wDUhBF,gCAOA,iCAMF,uCVGI,wCULN,sBVMQ,8BUDN,0BVJI,2BAIA,uEUAJ,CVCM,0BjB2yGR,gE4BzzGE,wDC4BE,gCACE,iCAEA,uCApCJ,mBACA,0CAEA,+BA0DE,mDD7CJ,oCAGE,sCACA,2BACA,2BACA,qC9BuQI,wD8BpQJ,gCACA,wEACA,4DACA,+BACA,0HACA,2BACA,gEACA,wDACA,gCACA,wEACA,mBACA,mCACA,qCACA,yGAEA,wCACA,iDACA,yCACA,gCAIA,2CAEA,oEACA,mD9B2OI,0C8BxOJ,+BACA,4BAEA,iDACA,2BACA,8E1BzCE,2B0B6CF,qDAGE,kDAwBA,OACE,8BAEA,wCAMF,qBACE,mBAEA,2CAEE,anB1CJ,wBmB4BA,4BACE,wCAEA,YACE,eACA,EAIJ,gCAGE,uCAFA,OAEA,CACE,uCnBzCJ,gCmB6BE,gBAEA,uEAMF,iBACE,kBAEA,0CAPE,eAIJ,mCAGE,CATA,mCAEE,CAJF,qBAEA,CAFA,WAaE,oBnB1CJ,mBmB4BA,sBAYE,8BACE,aACA,gBnB1CJ,yBmB4BA,8BACE,0BAEA,+BAEE,8BAKF,6BAEA,yCAEE,CnB1CJ,kCmB4BA,8DAGE,oDAMF,kDAGE,yFAcF,4DClFA,sCACE,uDAGA,8CA7BJ,oDAEA,kDAmDE,qCDiEF,qCAGE,2DAEA,kCClGA,qCAEE,mCAEA,oCAtBJ,sCACA,CAmBI,2BACA,CAHF,sCAEE,CACA,4EAgBA,+CACE,CD8FJ,8BACA,CCvFA,aDkFF,sCAIE,CClHA,gBD8GF,SClFE,sCD2EA,kEAOF,CC/HA,iBACA,CDmIE,eCnHA,CAhBF,iCAoCM,gCAEA,MACA,qCAnCN,CAkCM,QAlCN,sBACA,mBACA,sCAsCE,qCACE,iBD2FF,oCAQJ,UAPM,OAON,0BAEE,2CACA,yCACA,iBACA,uBAMF,iBAEE,uCACA,oEAEA,mBACA,yCAEA,OADA,UACA,uBACA,iBACA,uC1BrKE,oE0ByKF,4DVxLA,OU0LE,UV1LF,+EUiME,UAFF,OAEE,oDACA,mBVlMF,yCUsMA,yDAEE,uCACA,SACA,CADA,OACA,4BAMJ,yBACE,mBAIF,0CAEE,0DACA,wCAEA,0DAMA,YACA,wCADA,YACA,CAFF,QAEE,gCASA,2DACA,CAFA,mCACA,CAFA,YACA,CADA,WANA,uCAIF,sBAKE,sCACA,aACA,yCACA,+CACA,CADA,6BACA,iCAIA,oCEtPF,uBAEE,CFoPA,eADA,iCACA,CADA,WAFA,uCACA,sBElPA,uCAEA,a9B6nHF,iD8B1nHI,2C9BooHJ,0O8BhnHE,oCAEA,CAJA,uBAEA,C9BgnHF,iC8BlnHE,C9BknHF,yE8B9mHE,yC5BXE,cF+oHJ,mCE/oHI,gBF+oHJ,mB8BznHI,mD9BynHJ,qD8BznHI,U9B8nHJ,C8B9nHI,e9B8nHJ,gBAMA,uGE3nHI,CFqnHJ,8CEnoHI,CFmoHJ,0GEnoHI,mBFyoHJ,wCANA,UErnHI,2C4B4BF,kDAHA,yCAGA,6CAMA,kDAKF,CAXE,0CAMA,qBAKF,iDAKA,yBAJE,4CAIF,yCACE,+BA0BA,qC9BwlHF,C8BjnHE,aAoBF,CAKE,kCALF,+EAKE,C9BwlHF,uC8BjlHI,mC9BqlHJ,CAJA,yFAIA,uIE3qHI,2BACA,iCF+qHJ,gGE7rHI,gD6BrBF,qCAEA,qCACA,0CACA,mCACA,gCAGA,mBACA,CAJA,iBAGA,CACA,qBAEA,0CAMA,cADA,iBACA,mXASA,mCAEE,0CAIF,2BAEE,2CAIF,sCACE,sFAYF,4DACA,sJAGA,6BADA,yBACA,8GAEA,4EAGA,qJAIE,uD7B5CA,wF6B+CA,qB7B9CA,qB6B8CA,0EAIE,mBAGF,CAHE,oBAGF,2CAEE,CAFF,sBAEE,sBACA,yD/B+sHN,uG+BvsHI,0DACA,sH7BjEA,2B6BiFJ,C7BlFI,4B6BkFJ,qFAGE,wBACA,0BAGA,kC7BlGE,+B6BqGA,qEACE,CACA,oDACA,uDAIJ,aAEE,gBb7HF,gBa6HE,eb7HF,Ca6HE,cb7HF,WagJA,cACE,SACA,CAJF,8BAEA,CbhJA,aauIF,CAGE,sCACA,2CAGA,CAPF,iEAGE,CAMA,qBAEE,iGAGA,kDAEE,iDAIJ,6DAGE,4CACA,CADA,SACA,2D/BqrHJ,C+BxqHI,c/B8qHJ,CANA,mBAMA,4D+BvqHI,kDAQF,oDACE,2GCzLF,yDAEA,+CACA,uGACA,oFAEA,qBAEA,wDACA,wDACA,yDACA,CALA,sDAKA,qDAEA,uDACA,CAFA,iBAEA,2DAEA,kDADA,uCACA,CACA,8DAEA,2GAMA,CAPA,0CAOA,0BAEA,wBAMA,2BAPA,mDAOA,4IACE,CACA,qBACA,+CAqBJ,+BAEE,iDACA,CAFA,uCAEA,wDAEA,mDAIA,ClCsNI,2CkCtNJ,2CAEE,yCAUJ,8DAKE,gCACA,0BACA,oEACA,CADA,eADA,eAEA,+DAIA,2BAEA,CACA,+DASA,2BAUF,CAdM,+CAIJ,CANE,eAgBJ,yCAEE,aACA,mBAEA,8DAGE,+BAaJ,iEASA,kCACE,+ElCyII,6BkCvIJ,0DAEA,+D9BvIE,C8BwIF,+Hf3II,wEAIA,oCACE,6De8IN,mEAGE,sCAMJ,sCAEE,sCAEA,sCACA,qRAyBM,yEAII,0DAIA,oGAKJ,CAIA,mBAJA,YACE,gBAGF,6BACE,8DAKA,CAVF,iBAUE,4JAWA,kBACA,CADA,+BACA,6BACA,eAaE,kCvB5LR,CuBwLM,0CAIE,CAPA,8CAGF,CAJA,+CACE,CANF,4CAKA,CvBpLN,oBuBsIA,CAEI,kBACA,yCAEA,wCAGE,uCACE,8BAGF,4BACE,kGAKJ,6DAIA,mCACE,CAIF,gBAHE,gBADA,cAIF,yDAIA,mCAIE,4BACA,eACA,cAEA,4BACA,CAFA,oBACA,CADA,iBAEA,0DACA,mCAKA,kBACE,kBAGF,CAJA,2BAIA,iBA7CF,wBACE,CAEA,yEAKE,qDACA,CAXJ,4BAEA,CvB3IJ,4CuBwII,cACA,CA+CE,6EvBxLN,CuBoJQ,8CAIJ,wCACE,gBAGF,uCACE,oBACA,uBAOF,qDAGE,CANA,SAGF,CAJA,oBAOE,sBAKA,iDACA,CACA,wBADA,2BACA,qBf9NJ,CeyNI,oBACA,aACA,sBACA,CAFA,Wf1NJ,oBemOI,uDAIA,0CACE,kBAEA,gBACA,2BvB5LR,+BuBwII,kBACA,8CAEA,iBACE,yCAMA,gDACE,CALF,iDAKE,sCACA,oDAIJ,sBACE,gBAGF,mCACE,0CAaA,kCACA,mBACA,CAXF,WACE,CAGF,qBAEE,CANF,gBAWE,gCACA,yBACA,gBACA,CARA,4BAEA,CAPA,oBAGF,CAJA,YAcE,4Df9NJ,8CemOI,wBACE,CAGF,mBAHE,SAGF,2BACE,kBAEA,gBACA,2BvB5LR,+BuBsIA,kBAGI,8CAEA,iBACE,yCAMA,gDACE,CALF,iDAKE,sCACA,oDAIJ,sCACE,mCAGF,YACE,8BAYA,kCAEA,mBACA,CAXF,WACE,CAGF,qBAEE,CATA,eAGF,CAWE,gCACA,yCACA,CAPA,4BAEA,CAPA,oBAGF,CAJA,YAaE,gDACA,0DAKA,yBACE,kBAGF,CAHE,SAGF,6CAEE,gBACA,2BArDR,+BAGI,gEAGE,iBAEA,yCAKE,gDACA,CALA,iDAKA,sDAIJ,oCACE,sBAGF,mDAEE,YAGF,8BAUE,kCAEA,oBARF,WAEE,CACA,qBAEA,CARA,eAGF,CAQE,gCACA,yBACA,iBALA,4BACA,CAJA,oBACA,CAHF,YAUE,gDAKA,0DAIA,yBACE,kBACA,CAFF,SAGE,4BACA,kBAiBZ,2CAGE,+BACA,gEACA,0DAGA,gDACA,CAHA,iDAGA,sCACA,0EAME,mDACE,0CCpRJ,kCAEA,oBALA,WACA,CACA,sBDqRI,eCvRJ,CAKA,gCACA,0CAJA,4BACA,CAFA,oBACA,CAFA,YAMA,CACA,2DACA,8CACA,qDACA,+CACA,gBACA,2DACA,kBACA,+CAEA,iBACA,0CAKA,gDAGA,CAPA,iDAOA,uCACA,qDAEA,sCACA,oCACA,2CAUE,kCAGA,oB/B9BA,Y+BsBA,qBACA,CANF,e/BjBE,C+B8BA,gC/BrBA,0C+BcA,4BAIA,C/B3BA,oB+BsBA,C/BtBA,YASA,iDACA,2D+B0BE,Y/BbF,0EACA,uD+BmBF,6DAEE,iBAOF,sCAEA,gDAIA,CALA,iDAKA,mCACA,gBAGF,iCACE,sCACA,gCACA,uCAsBA,kCACA,mBACA,CAZA,WACE,sBAQJ,CAjBE,eAQA,CAYA,gCACA,yCACA,CALF,4BACE,CATE,qBADF,YAcA,oG/B3FE,+F+BkGJ,qCACE,4CACA,+CAEA,8F/BtGE,oD+B0HA,oF/B1HA,uR+B8IJ,8BAMA,wB/B3II,wDACA,yE+B+IJ,0D/BlII,gDACA,4GOoBA,+BwBgIA,6BAGA,qDAMI,sBACA,mBAKA,iD/B1KJ,mCF65IF,gCAIA,qBiC5uIU,uBAIJ,CjCwuIN,kCiC5uIU,CAIJ,oE/B3KJ,2CF25IF,CARA,yCAJA,mCiC7uIU,4BjCivIV,CAJA,WiC7uIU,CjC6uIV,iBAYA,yDiC1uIU,qBjC8uIV,CAJA,kBAIA,wFiCzuIU,2DClOV,ClC28IA,kBkC38IA,8BAEA,2HADA,qBACA,+DACA,wBAEA,2BAFA,aACA,wDACA,aACA,iCADA,2CACA,gBAEA,mCACA,CAHA,kDAGA,sCADA,eAEA,0DACA,cAGA,kHACA,CAFA,8BACA,CADA,gBAFA,iEAIA,0BACA,uFACA,cAGA,+GAKF,CANE,8BACA,CAHA,iEAQF,yBAEE,uFAGA,mBAOA,ejB3BI,CiBsBJ,mDAEA,mDAGA,CAPA,mDjBpBI,oCAIA,wEiB0BJ,oBAEE,kDACA,CAHF,mDAGE,mBAEA,gDACE,CAHF,0DAEA,CAFA,+BAGE,0CACA,4FAKJ,2DAEE,4BAGA,4DAEA,CAJA,6DAIA,mBACA,mEjBlDE,2CAIA,4BiBsCJ,wCAYA,aACE,CADF,aACE,oCAKA,6BADA,yBACA,kGAOF,yBAIA,qGAEA,iEhC7DE,4BgC+DF,wBhC/DE,oGgCkEA,wBhClEA,uGACA,2BgCsEF,sDAKA,oChC9DE,gRACA,qDgCsEA,0FhCtEA,uEgC6EF,2FASA,sTAaI,sChC3HF,kDgCsIE,+DACA,4TChJJ,qHAKA,sCACC,CAAD,8FAEA,qDjCCE,mBiCMF,mBAKI,2CACA,SACA,iBAJF,mCAEE,CjCXF,YiCMF,CAGE,eAIE,qBAPJ,2EAGE,CjCTA,kBiCWE,gBAEA,yCAKF,CAZF,UAYE,0DCnCF,mDtC6RI,8CsC1RJ,gGAGA,CALA,sCAKA,6FACA,yDACA,iDACA,yBAGA,6CACA,+EAEA,CAHA,WAFA,cACA,yCACA,kBAGA,kDACA,CANA,wCAMA,wCACA,uCACA,4DACA,uDhCjBA,oDgC0BA,ChC1BA,UgCiBA,SASA,mBACA,gCtCgQI,uCsC9PJ,+EAEA,CAJA,+BAIA,+BACA,kHnBpBI,+GAIA,gEmBqBF,qCAEA,0CAIF,2DAEE,CANA,4DAMA,0DAMF,iEAGE,CAPA,kEAOA,kDAKF,2DAEE,ClB7DF,4DkB6DE,8FAGA,qDAKF,iCACE,8BADF,cACE,8CAKE,yDlC9BF,gIAdA,6DACA,qTJ2PE,6TuC/QJ,wCvC+QI,4BuC7QJ,wDAEA,gCACA,wDnCFE,kGmCiBF,CCxBA,yFACA,CDuBA,YChCF,eAEE,CAKA,wCACA,iBAHA,gDAEA,CALA,qEAOA,mCACA,gDAIA,0CAEA,wCACA,YACA,yCpCHE,CoCAF,4DpCAE,yBoCQJ,4CAOE,aACA,iCAQF,mCACE,CAGA,+BACE,0CAIA,qCASA,oDACA,oDACA,sDACA,uDAJF,+CACE,0DAEA,uDACA,oHAFA,oEACA,4CACA,yDAHA,mDACA,6DACA,cACA,gBADA,cACA,oDAJF,iFAEE,CACA,gCACA,CAJF,aACE,CACA,wCACA,CAFA,qEACA,CAEA,iBAJF,CAIE,qBAFA,6HAFF,wCACE,0BACA,mBACA,8CACA,qDAHA,CAEA,uCADA,SADA,kBAEA,+CACA,gDC5DF,CD0DE,sCACA,UACA,CAHA,SCzDF,qFAMF,sDzCqRM,CyC1RG,uCADP,CACO,SzC0RH,0CyC/QJ,iDACA,wDAEA,CAJA,yCACA,oBAGA,yCACA,gBAGA,4CAEA,mCrCNE,4DqCaJ,CzC+PM,yDyC/PN,kCAKE,6DAGA,CANA,0DAMA,gDtBxBI,kCAIA,2FsBwBN,CrBAE,qLqBEA,mFAGF,2BAIA,uEAKE,CCpDA,2CACA,CDmDA,2BAKM,CALN,oBACE,oCAGE,wCAJJ,eACE,4DAII,iBC3DR,CAEE,uBAFF,kBAGE,CACA,uDACA,oEACA,wDACA,yBACA,oCACA,4EACA,iDACA,+BAGA,mCACA,0EAEA,CAHA,4BADA,2CACA,CAFA,2DACA,CAFA,iBAMA,8BACA,4CAIA,CAJA,eAIA,oBAGA,kBACA,+BAIF,oBACE,CtChBE,yBsCeJ,CtCfI,MsCeJ,SACE,gBACA,gDAEA,0CAEE,wDAUJ,sDAGE,kBAGA,8FAGE,0DAEA,wDAGF,gBACE,gDACA,kGAUF,sDACA,0DACA,uCAEA,qDACA,mEAEA,gDtCtDE,0CsC0DF,wDtC5CE,sDsCgDF,8DAEE,yCAEA,uDAIF,qDAEE,cACA,8CACA,8FAKA,oDAGE,0DACA,4FAiBE,4FtCvDJ,+BAZA,gCsCwEI,oFtCxEJ,wEsC6EI,oDACE,oDAGF,6BACE,6BACA,6CAEA,CAEE,qFAxBR,CAsBM,aACE,sCACA,CAFF,gCACE,gBAvBR,etCnDA,0CsC4DI,CALA,kCtCvDJ,CsCoDE,kCAGE,wCtCvDJ,kBsC4DI,6CtC5DJ,kBsC4DI,wCtCxEJ,qDAYA,qKsCsEM,oEAGA,6BACE,2DACA,2FAxBR,kDAII,+DtCvDJ,mDAZA,0CsCwEI,yFtCxEJ,oDsC6EI,sDACE,oCAGF,sCACE,uDACA,4DAEA,sDACE,yDACA,wDAxBR,yDAII,8CtCvDJ,oEAZA,4CsCwEI,CtCxEJ,gDAYA,CsC4DI,mCtCxEJ,gBsCwEI,ctC5DJ,sBsCiEI,wFAIA,kCACE,mDACA,uCAEA,oBAFA,UAEA,6D/BpFN,qD+B+DE,CAuBM,kE/BtFR,C+BqFQ,SAnBJ,gCtCvDJ,uDsCuDI,8CtCnEJ,kBAYA,wCsCiEI,iFAIA,CtCjFJ,gCAYA,CsC4DI,6FtCxEJ,kBsCwEI,CtC5DJ,oBsCqEI,8BACE,8BACA,gCAEA,6BACE,kCADF,kCACE,qDAvBR,iDAII,CAoBI,yCAxBR,oBAII,yBtCvDJ,+CAZA,sDsCwEI,CALA,uCtCvDJ,CsCuDI,SAKA,mCtCxEJ,4DsC6EI,kDAIA,CtCrEJ,qDsCqEI,0CACE,sEAGA,sFACE,sEAkBV,4BAjBU,0DAiBV,gDACE,YAEA,0DAeA,oBAdE,kDAcF,iEAGA,oDADA,sDACA,0BACA,6CACA,wEACA,4DACA,mGAEA,2BAVF,CASE,0DATF,mDACE,yEAEA,mBACA,CADA,kDACA,oEAEA,oDADA,sDACA,2BACA,4CACA,yEACA,4DACA,mGARA,2BACA,CAFA,0DAEA,+DACA,6DACA,mBACA,CADA,kDACA,oEAEA,mDACA,CAFA,sDAEA,qDACA,2FATA,4DACA,mGAGA,4BADA,0DACA,mDACA,yEAEA,oBADA,kDACA,oEAEA,mDATA,CASA,sDATA,sDACA,2FAEA,4DACA,mGAEA,4BADA,0DACA,mDACA,YACA,6DACA,mBAVF,CAUE,kDAVF,oEAGE,mDACA,CAFA,sDAEA,yEACA,0EACA,4DACA,oGAGA,4BADA,0DACA,oDAVF,YACE,8DAEA,oBADA,kDACA,qEAEA,mDACA,CAFA,sDAEA,mCACA,sFACA,+CACA,+CACA,qDAVF,+CACE,6DACA,4DACA,CACA,+DACA,6DACA,iEACA,yDACA,0DACA,oEACA,mFCzLF,gHAEA,4DACA,kEAEA,6DACA,mEAKA,2DAGA,kIAGA,0BAIE,qDAEA,+CAGF,6DAEE,4DAIF,gEAGE,6DACA,iEAKF,yDASE,0DATF,oEC/CA,uBACA,kDAEA,4CACA,0DAGA,4DACA,6DACA,6DACA,8DAEA,sDACA,uDACA,iEAGA,+EAGA,+CACA,CACA,4DACA,4DACA,gExCPE,6DwCeF,iEAMA,yDAIA,0DAEA,oEAGE,yBAIJ,oDAGE,0GAEA,4DAEA,4HxChCE,gEACA,iHwCmCA,mEACA,wBAKF,mDC7DF,6CAGE,2DAGA,4DAEA,8DACA,6DACA,+DACA,uDACA,wDACA,kEAEA,yEACA,4CACA,0DAEA,4DAEA,6DACA,6DAKA,8DAIA,sDAYF,uDAGE,iE1BvCI,yX0BsDF,6DAIJ,+DAGE,+BACE,qCAIF,uEAMA,CAMF,uEAME,+BACA,CAbA,kBACA,CACA,WAWA,mCACA,CAZA,cADA,SAaA,6BAZA,+BzCvEE,CyCmFF,iBAEA,yCzCrFE,CyCqFF,oBzCrFE,6DyC+FF,0CACA,CzChGE,SyCgGF,yCC5GA,4CACA,CANA,mBAGA,0CAGA,CDoHF,iDAGE,+CAEA,wCACA,iHzCtGE,yDACA,kEyCyGA,0GACA,8IAKJ,sDAEE,kEAUA,CAUA,2BACA,CADA,oCACA,sEACA,4CzC1HE,CyC0HF,sCAJA,2BACA,CAJA,mCAGA,CAJF,cACE,CAIA,mBACA,CAVA,+BzC9GE,4CACA,qDyCsIF,cACE,oBACA,CzCxIA,iByC+HF,CACE,yBlC5GA,mBkC2GF,8BASE,yEAKA,eACA,kBACA,ClC3HA,2BkC4IA,CANA,0ClCtIA,CkC4IA,oFAgBE,0F3C+zKN,2F2CnzKQ,ClCxKJ,kCkCoIF,CAXE,YACA,CACA,2DA6CI,0BAhBF,qCAIA,ClC/IF,gDkC+IE,aACE,oBzCzMJ,CyCwME,iCzCxMF,8BF2hLF,wEE3hLE,mByCmNE,gCACE,2DAlBJ,+CAIE,oDAGE,0D3Cs2KN,yF2C51KI,iClC1JF,iCkCyIA,oCAEE,sDAIA,sD3C23KJ,qFEnkLE,sDyCoNI,sDAlBJ,CAME,yBAJA,OzCpMF,SFulLF,C2C/4KI,iBAEE,gBzC1MJ,CyCkMA,cACE,OAKA,WAJA,8B3Cm5KJ,gEEvlLE,CFulLF,4B2Cp4KI,2BAXA,mCACE,4BzCzMJ,CyCmNE,yClC1JF,kCkCyIA,iEzClMA,wCF2mLF,qE2Cx5KI,qCACE,mCEpON,6BACA,sBACA,0BACA,4C/CyRI,yC+CtRJ,+BACA,sCACA,uCACA,mBADA,YACA,iDAEA,gBCbA,mLDkBA,2BClBA,CDgBA,kCAEA,CClBA,8BDaA,iBAGA,CAEA,UClBA,iBAEA,yBACA,sBAEA,0BACA,CAKA,sCAEA,CAHA,YACA,CAJA,MACA,CAFA,cACA,OAEA,WACA,CAFA,iCAKA,sBACA,+BhDgRI,kC+CrQJ,eAGS,mBAIP,2FAIE,2DAQN,6DAhBE,0BAAS,8BAGP,uCAaJ,0BAGE,4IAEE,CALJ,2FAKI,cACA,6CAKJ,CANI,eAMJ,0DACE,CADF,iBACE,eACA,mBAGA,2CAGE,6DAMJ,CAPI,8DACA,CAHF,wFAEE,CANF,2BACA,uCACA,sEAWF,qFACE,gCAEA,mEACE,gBACA,CAFF,iBACE,CADF,+BAEE,gFACA,kDAKJ,qDACE,qBADF,0BACE,kCACA,wBACA,CADA,WACA,iEAEA,0FAEE,mHACA,yBADA,WACA,iFAwBF,sDACA,6CAEA,0B3CjGE,oC2CiGF,W3CjGE,0C6ChBF,wBjD4RI,CiD5RJ,WjD4RI,iFiDzRJ,sDACA,6CACA,0BACA,qBADA,cACA,CADA,WACA,kDACA,iBADA,WACA,iFAEA,sDjDmRI,eiDjRJ,yDAEA,qBADA,cACA,CADA,WACA,0CAEA,qHAGA,sDAGA,8CAEA,2BDzBA,oCCyBA,WDzBA,yNAGA,eACA,WACA,wBACA,6BAEA,8BACA,+BAEA,sBACA,gCAEA,qChDgRI,yCiD9PJ,mDACA,yBACA,iE7ChBE,C6CyCA,qB7CzCA,a6CoBF,CAEE,+KAQE,sCAEA,CASF,sCATE,iBAMJ,iBACE,sBAEA,gBAHF,gBAlBA,+BAEE,CAmBA,UAHF,qDACE,sCAEA,mBAFA,kBAEA,oB7CzCA,gC6CyCA,uFAEE,sCAFF,mCAEE,gCAGF,oKAKA,wJASF,qCACE,CADF,qFAPI,QAQF,8FAIA,qCAFA,4CAEA,iJAEE,uCAGF,CALA,2HAEE,CAFF,UAKA,kGAEE,2CAGF,gHAUF,yCATI,oFASJ,CATI,WASJ,+FAGE,qCAFA,6CAEA,kJAKA,uCAHE,2HAGF,CAHE,SAGF,gBAKA,qCACE,8CACA,CAFF,8BALA,qCAEE,gEAGF,kBAEE,kCAKJ,+FACE,iDAIA,6DACA,sDAEA,2FAMF,yFACE,wEACA,kCACA,8CAEA,uOAEE,CjD8IA,oBiDzGJ,CACA,4BADA,qCACA,2EACA,8C7C5JE,C6CqHE,6LAQF,uCA2BF,qCjD2GI,CiDtIF,kCAyBJ,qBACE,gBACA,CA3BE,gBARE,sCAQF,eACE,sCACA,qCAuBN,CACE,yDAlCI,gC7CrHF,sCACA,sC6C+JA,C7C/JA,mC6C+JA,8DC9KF,0BAGF,CDgLE,UACA,CADA,+BChLF,4FAOE,iFAIF,CACE,gN/BbI,oFAIA,0GjBu5LN,+CAMA,CANA,QAMA,wGAKA,qCgDn4LE,ChDm4LF,qCgDn4LE,8FhD64LF,qCgDn4LI,+EhDm4LJ,0PiB56LM,2HACE,4G+ByEN,iDAGA,CAJA,MAIA,0GhDq4LA,wCiBl9LI,mCjBk9LJ,kGAMF,8EgD73LI,6NAoBF,oFAYA,gHAWF,kDAIE,CAJF,KAIE,8GAUA,wCAGE,CAHF,kCAGE,kH/B3JE,8E+BwJJ,C/BxJI,W+BoKF,aAEA,CAHA,QACA,CAGA,mD/BvKE,C+BkKF,iBACA,OAGA,mCAdF,+FhDi6LF,qCgDj4LE,gFAKA,qChD43LF,uNgD32LI,2HhDs3LJ,6GgD93LI,iDhD83LJ,OgD93LI,2GAGF,sCAIA,CAJA,oCAIA,iBCrNA,4CACA,kFAGA,4HALA,oCACA,CjDwlMF,4CiDzlME,CDuNE,ehDk4LJ,CgDn4LE,6ECjNA,mCAIF,eACO,mCADP,yEACO,uEAIP,iBAGE,eACA,CAFA,iBACA,WACA,uBACA,sBADA,aACA,gBAKA,6DACA,CALA,YACA,8BAGA,CAJA,kBAKA,4CAKA,qCACA,uEAYE,CAtBF,UAsBG,CAAD,sDAGA,eACA,gEAJA,sFAIA,kCAOF,2BACA,yEAEA,mCACA,4BAGA,+BAIF,UAEE,sBAIA,gBANF,2BAME,kJC5EF,wGAKE,mCACA,CAFA,SAEA,wCACA,oFAEA,+DAEA,mBAEA,wBAFA,SACA,WADA,mCACA,CACA,UzC6DE,CyC9DF,UAFA,kBAEA,iBACA,CAHA,KACA,CzC+DE,4ByC5CF,CAlBA,UADA,SAmBA,wCAII,8CAEA,qIAKA,WjC3BA,qBiC2BA,oBjC3BA,wBAIA,8FiC+BE,wBAHF,2BAGE,0BACA,CzCwBJ,qByC5BE,YzC4BF,UyCxBI,mTASA,oTAaF,sBAGE,SAEA,oCADA,OACA,mBACA,gBADA,2BAHA,iBACA,SACA,SAEA,uCAQF,2BzCzBF,CyCyBE,sBzCzBF,SyCkCI,oCACA,CzCnCJ,iCyCkCI,CAjBA,kBAGF,CAKA,eALA,yBAEE,eAGF,CAHE,gBAGF,CAUE,WAfF,SAEE,CAGF,mBAUE,2BACA,CAhBF,UAgBE,wCAEA,sCAIA,eACE,+BAGA,4BAEA,czCnCN,CyCzCE,UACA,CzCwCF,SyC5CF,sBAGI,CzCyCF,mByC5CF,CA+EQ,4BA3EJ,wGAIA,uCAEA,gCACA,sDjC3BA,qBAIA,uRiCiCE,uEAGF,0IAIE,qBACA,kGAMA,UACA,+BAGA,oGAOA,6FACA,CARA,kBAFA,oBACA,gFACA,CADA,6BASA,CACA,oEAGF,oDAEE,kCAGF,iEAGE,yBzC5BJ,qCyCkCI,iCACA,mCACA,2CAEA,gCAKE,4CAGA,CAHA,6DAGA,oBAEA,gDzCnCN,gCyC1CE,iCAEA,6BACA,mBACA,cACA,uBACA,yCAEA,gDACA,qCjC3BA,sDAIA,8DACE,mCRuDJ,yCyC3BI,CACA,6BACA,UACA,0GACA,+DAGF,oFAIE,sDACA,sFAGF,0CAIE,oCAEA,kHACA,8DAIA,qDAGA,qCACA,2CASF,4BAHE,uCAGF,CARE,SAGF,+BAEE,CALA,kCAGF,gBAKA,SAGE,CAZA,cACA,CAWA,yCA3DN,CAqDM,kBALA,kCAhDN,kEAkEM,cACA,6CAEA,8BAME,oFzC/BN,CyC6BI,azC7BJ,mCyC1CE,4BAEA,CAqEE,+BArEF,6BAGA,mFAGA,CALA,OACA,CADA,MAKA,kCACA,2BjC3BA,CiCsBA,+BjCtBA,6BiCgBJ,qFAgBI,CjC5BA,MiC6BE,mCAEA,4BACA,4DjChCF,wDiCYJ,CjCZI,OiCwCE,CARA,+BACA,kFAMA,mCACA,kFACA,oGAMA,kBACA,2BACA,cACA,2FACA,4EAOA,kCACA,CALF,YAEE,YACA,mBACA,CADA,SAEA,4CASF,4BAHE,uCAGF,CATE,QACA,CAGF,+BAEE,CALA,kCAGF,gBAKA,SAGE,CAZA,eAYA,yCzC5BJ,CyCsBI,kBALA,kCzCjBJ,CyC/BF,iEAkEM,cACA,6CAEA,8BAME,oFzC/BN,CyC6BI,azC7BJ,mCyC5CF,4BAII,CAqEE,+BArEF,6BAGA,mFAGA,CALA,QADA,KACA,CAKA,kCACA,2BjC3BA,CiCqBA,+BjCrBA,6BAIA,qFiC4BA,CjChCA,KAIA,CiC4BA,mCAGE,4BACA,4DjChCF,gEiCwCE,CARA,+BACA,kFAKA,CACA,kCACA,kFACA,oGAKA,kBAEA,yCACA,0BACA,iEACA,4EAMA,kCAEA,CALF,wBAEE,CACA,mBADA,SAGA,4CASF,4BAHE,uCAGF,CATE,SAIF,gCAHE,kCAGF,gBAKA,UATE,eASF,yCzCzBF,CyCoBE,iBAEE,CANA,kCzChBJ,kEyCmCI,6BACA,4DAMA,oFAME,CATA,OADF,KACE,CASA,mCA7EJ,4BAEA,CAkEI,+BAlEJ,6BAIA,mFAEA,CAJA,QADA,KACA,CAKA,kCACA,2BjC5BA,CiCsBA,+BjCtBA,6BiCgCA,qFAIE,CjChCF,MiCgCE,+DACA,4DjCjCF,iCACE,CADF,OACE,eiC2BF,CjC5BA,OiCyCE,CARA,+BAMA,kFACA,mCACA,kFAGF,sBAGE,eACA,+DAEA,qFACA,iEAIA,iCAEA,2CAEA,kCACA,CADA,qDACA,6CN5EN,2BAEA,CMgHF,uCNlHE,CM+EI,SAKA,+BAGE,CANA,kCAGF,gBNjFJ,UM4EI,eN5EJ,yCAIA,CMgFM,iBA2BR,CAnCM,kCNxEJ,mEM+GF,cACE,eACA,+BACA,8BACA,oFAGE,CAHF,aAGE,mCACA,6BAJF,+BAIE,6BACA,mFAMF,CANE,cAMF,kCACA,2BAGF,CAVI,+BAUJ,6BAGE,qFC5IA,CD2IA,MC3IA,mCACA,4BAGA,4DDuIA,wDACA,CADA,OCjHE,CAtBF,+BAYA,kFAUE,qHAIJ,sBACE,eAKF,CANA,8DAOE,uJACA,8CACA,gEAGF,CAHE,wBAGF,CAHE,4BAGF,+BAEI,eC5CA,2BACA,CCAA,uCDDA,CD4CA,wCE7CA,CF4CF,YACE,sCC3CA,UD2CA,eC3CA,0CCFA,iBAEA,CF2CA,kCC3CA,mEADA,eACA,6EAFF,oFAEE,6EAFF,CAEE,+BAFF,8BAEE,mFAFF,CAEE,cADA,kCACA,yFADA,qFACA,0CAFF,4BACE,8DACA,iCAFF,CAEE,OAFF,eACE,CACA,QADA,gCACA,yMEFA,uGACA,wJAGE,kCAGE,4CACA,mCADA,wBACA,0CAPJ,4BADA,uCACA,CAOI,SARJ,gCADF,YACE,sCACA,UAOI,eAPJ,0CADA,kBAQI,kCAPJ,mDAGE,4CAGE,oFACA,CADA,aACA,gEADA,+BACA,0BAPJ,oFAFF,OACE,CADF,MAEE,mCAGE,0BAHF,CADA,+BACA,0BAGE,qFAGE,CANJ,MAMI,mCACA,kFAPJ,iCAGE,CAHF,OAGE,gBAHF,QAOI,4BATN,kFACE,mCACA,uKAMI,uCACA,mCADA,uCACA,CADA,YACA,0FATN,kBACE,CAQI,YATN,CACE,iGACA,8BAMI,qDACA,CAJF,oDAGE,CANJ,kDAGE,CAHF,qFAOI,gHARJ,gBAQI,mEARJ,cACA,0CADA,mCACA,0GAGE,+CAGE,2HACA,wFATN,cACE,gEAIE,qDAGE,+CAPJ,+EACA,oGAGE,oBAGE,qCACA,oHARJ,6FACA,sGADA,oBACA,oBAGE,kCAGE,oEACA,CAJF,oBAIE,sHAQN,CARM,oBAQN,oHACA,CADA,oBACA,sHAKI,CALJ,oBAKI,qHACA,CADA,oBCzBN,CD0BM,qHCvBJ,CDuBI,oBCvBJ,6KCFA,qEAGA,uIAEA,gEAIE,yDvCME,wCAIA,mFuCAF,wCACE,gNCfJ,6CAEE,uBAKA,yDASF,wCACE,kGCrBJ,uBAIE,qEAQA,wCAUI,+FAOA,yCjDgCF,uBiDvCE,yDAKF,wCAEE,mFAPA,mCAKF,kEAGE,wCARA,4FAMA,mCAEA,uBATF,0DAEE,CACA,uCAIA,oFAPF,eACE,uBAEA,qEAIA,wCC3BJ,+FAQA,yCCPF,iFCKE,wCAEA,oFAGA,cACA,uB7DogOF,4G8D9gOE,8FCDF,uCCCE,uBCJA,yDAGA,wCC8DM,mFAOI,aAPJ,0FAOI,oSAPJ,qFAOI,YAPJ,iIAOI,4FAPJ,mCAOI,8NAPJ,oBAOI,4EAPJ,2IAOI,qDAPJ,6JAOI,wGAPJ,+DAOI,+IAPJ,CAOI,SAPJ,YAVA,kBACE,mCADF,2BACE,CAgBE,oBAjBJ,YACE,qLADF,CACE,yBADF,oCACE,iEADF,eACE,uRADF,iBACE,0BASF,WATE,gDASF,UAOI,YAPJ,OAOI,kBAPJ,gBAOI,YAPJ,sBAOI,iCAPJ,aAOI,wBAPJ,6CAOI,iEAPJ,OAOI,kFAPJ,uBAOI,gBAPJ,CAOI,kFAPJ,yDAOI,CAPJ,eAOI,cAPJ,kBAOI,mCAPJ,eAOI,uCAPJ,uBAOI,6LAPJ,CAOI,0BAPJ,2CAOI,2FAPJ,CAOI,0BAPJ,CAOI,2BAPJ,gBAOI,4WAPJ,CAOI,kBAPJ,CAOI,oBAPJ,CAOI,oEAPJ,4BAOI,CAPJ,yHAOI,kDAHI,SAGJ,WAHI,OAGJ,iBAPJ,QAIQ,CAJR,MAIQ,SAGJ,iGAPJ,6BAOI,sBAPJ,eAOI,4JAHI,8CAGJ,wHAPJ,oBAIQ,YAGJ,oJAPJ,kBAIQ,yBAGJ,4HAPJ,kCAIQ,aAGJ,uDAPJ,aAOI,4EAHI,yBAGJ,mIAPJ,oBAIQ,2BAGJ,iDAPJ,CAOI,yFAHI,oBAGJ,8JAPJ,iBAOI,8FAPJ,gBAOI,iMAPJ,6BAOI,yFAPJ,YAOI,uoBAhBF,oBADF,4KAUA,kBAOI,qKAPJ,oBAOI,uHAPJ,0BAOI,QAPJ,eAOI,0BAPJ,CAOI,2BAPJ,WAOI,8BAPJ,oBAOI,aAPJ,qBAOI,0BAPJ,6BAOI,+BAPJ,yBAOI,4BAPJ,8BAOI,iIAPJ,4CAOI,qCAPJ,qBAOI,iFAPJ,2CAOI,sFAPJ,WAOI,+JAPJ,qCAOI,wLAPJ,gBAOI,sIAPJ,kBAOI,yBAPJ,sDAOI,mIAPJ,iBAOI,qBAPJ,CAOI,2EAPJ,mBAOI,sBAPJ,8FAOI,+GAPJ,qBAOI,+GAPJ,4EAOI,gHAPJ,eAOI,uaAPJ,wBAOI,+GAPJ,uFAOI,sDAPJ,uDAOI,mDAPJ,oDAOI,sDAPJ,uDAOI,qYAPJ,WAOI,gXAPJ,OAOI,sHAPJ,qBAOI,6CAPJ,oBAOI,iHAPJ,CAOI,+LAPJ,+BAOI,CAPJ,kBAOI,qVAPJ,wDAOI,qHAPJ,gCAOI,CAPJ,yBAOI,sGAPJ,yBAOI,0DAPJ,kDAOI,+EAPJ,uBAOI,iFAPJ,sBAOI,mKAPJ,qCAOI,6PAPJ,oBAOI,oMAPJ,iBAOI,2BAPJ,UAOI,oFAPJ,iBAOI,qDAPJ,4BAOI,MAPJ,qBAOI,6BAPJ,MAOI,8BAPJ,qBAOI,8BAPJ,CAOI,wBAPJ,mCAOI,iEAPJ,4BAOI,+JAPJ,CAOI,2BAPJ,oCAOI,mCAPJ,yBAOI,8BAPJ,8BAOI,mCAPJ,6BAOI,CAPJ,0BAOI,kGAPJ,mCAOI,4FAPJ,CAOI,yBAPJ,6BAOI,mEAHI,gCAGJ,4GAPJ,wBAIQ,OAGJ,sIAPJ,OAIQ,2BAGJ,8IAHI,OAGJ,0IAHI,8BAGJ,6GAPJ,4BAOI,4HAPJ,6BAOI,qHAHI,CAGJ,yBAHI,OAGJ,8BAHI,8BAGJ,mCAPJ,CAOI,6BAPJ,OAOI,4BAPJ,4BAOI,0EAHI,2BAGJ,4HAHI,CAGJ,4BAHI,OAGJ,+BAHI,2BAGJ,CAPJ,MAOI,+DAHI,+BAGJ,iEAPJ,CAOI,0BAPJ,OAIQ,uBAGJ,mCAPJ,kCAOI,iCAPJ,mCAIQ,OAGJ,+FAPJ,OAIQ,6BAGJ,wEAPJ,mCAOI,uEAPJ,OAIQ,8BAGJ,oCAhBF,yGADF,OACE,6BASF,oCAOI,qEAPJ,OAOI,8EAPJ,2BAOI,8DAPJ,mBAOI,8EAPJ,uBAOI,sEAPJ,kCAOI,oEAPJ,eAOI,+DAPJ,iDAOI,0CAjBJ,iCAKE,yCACE,mCALF,4BAIA,gDALF,0BACE,iBAIA,+IALF,OACE,0CAIA,OACE,yCAWA,8CAKF,gDAOI,OAnBN,2BAOI,+BAKF,wCAOI,wCAZF,0CAKF,oCAOI,qCAnBN,YAIQ,0BAGJ,iLAPJ,mCAIQ,+BAGJ,yKAPJ,4BAIQ,mCAGJ,qEAPJ,CAOI,qGAPJ,kBAIQ,mCAGJ,4KAPJ,mBAIQ,wDAGJ,gKAPJ,qEAOI,4JAPJ,YAIQ,2EAGJ,yJAHI,mEAGJ,iCAPJ,CAOI,wHAHI,gCAGJ,sIAjBJ,yEAKE,gEALF,aACE,sEAIA,CACE,gEALF,gCAIA,yDACE,iEALF,YAIA,yEALF,sEAKE,gCACE,mCANJ,0CAKE,kEACE,CAIJ,eAIQ,mBAGJ,yJAHI,qBAGJ,sIAPJ,qBAIQ,yCAGJ,kHAHI,qBAGJ,+TAHI,gDAGJ,iHAPJ,uBAOI,6IAPJ,sBAOI,8JAHI,CAGJ,kHAHI,sBAGJ,qEAPJ,8CAOI,2FAHI,0CAGJ,sCAHI,CAGJ,gFAPJ,0CAOI,8KAjBJ,6FACE,2BADF,6BAUA,mFAOI,qJAPJ,CAOI,mMAPJ,6BAOI,kFAPJ,0FAOI,yBAPJ,6BAOI,8KAPJ,wBAOI,kcAPJ,6BAOI,2LAPJ,6BAOI,gfAPJ,+BAOI,0sBAPJ,UAOI,kaAPJ,2EAOI,WAPJ,iBAOI,q4CAPJ,oBAOI,0MAPJ,oBAOI,yFAPJ,CAOI,mNAPJ,mBAOI,kNAPJ,kCAOI,kEAPJ,wFAOI,gEAPJ,iCAOI,6CAPJ,kCAOI,yLAPJ,yCAOI,8LAPJ,+BAOI,yvBAPJ,gBAOI,yMAPJ,gBAOI,uTAPJ,CAOI,qNAPJ,uCAOI,+KAPJ,uCAOI,gsBAPJ,2CAOI,sLAPJ,yGAOI,CzDVR,yCyDUQ,oLAPJ,CAOI,oGAPJ,yHAOI,8NAPJ,uCAOI,CAPJ,6DAOI,kOAPJ,CAOI,uCAPJ,uLAOI,2GAPJ,kBAOI,sCAPJ,sCAOI,6DAPJ,gEAOI,2GAPJ,mBAOI,2CAPJ,6DAOI,4CAPJ,6DAOI,iSAPJ,+DAOI,6HAPJ,wCAOI,gEAPJ,CAOI,0GAPJ,gEAOI,wCAPJ,CAOI,8DAPJ,4GAOI,kEAPJ,gBAOI,2CAPJ,qGAOI,+lBAPJ,yCAOI,4NAPJ,iKAOI,kBAPJ,wCAOI,gEAPJ,mGAOI,iKAPJ,iEAOI,2IAPJ,YAOI,2BAPJ,OAOI,oBAPJ,yBAOI,kDAPJ,yBAOI,8JAPJ,kDAOI,wEAPJ,sBAOI,6EAPJ,CAOI,uIAPJ,sBAOI,8KAPJ,YAOI,uHAPJ,uBAOI,2CAPJ,gBAOI,qDAPJ,oCAOI,sGAPJ,iBAOI,iKAPJ,0BAOI,6MAPJ,gCAOI,kKAPJ,6DAOI,qDAPJ,8BAOI,oDAPJ,CAOI,6GAPJ,4IAOI,8BAPJ,2BAOI,8HAPJ,+BAOI,8CAPJ,sBAOI,mDAPJ,6BAOI,kDAPJ,yBAOI,qDAPJ,4BAOI,gDAPJ,iBAOI,4DAPJ,8BAOI,4DAPJ,gBAOI,iBAPJ,SAOI,2BAPJ,uBAOI,+BzDVR,8ByDGI,SAOI,uBAPJ,SAOI,qBAPJ,YAOI,qBAPJ,UAOI,uBAPJ,mCAOI,6BAPJ,6BAOI,UAPJ,2BAOI,iEAPJ,kEAOI,mEAPJ,2BAOI,uCAPJ,CAOI,2BAPJ,mCAOI,+DAPJ,CAOI,2BAPJ,uCAOI,mIAPJ,CAOI,2BAPJ,UAOI,mEAPJ,4BAOI,0DAPJ,qCAOI,CAPJ,mCAOI,UAPJ,yBAOI,UAPJ,2BAOI,2GAPJ,uCAOI,UAPJ,4BAOI,qCAPJ,uCAOI,qCAPJ,aAOI,2BAPJ,mCAOI,wCAPJ,uCAOI,sCAPJ,UAOI,wCAPJ,4BAOI,yCAPJ,UAOI,uBAPJ,sCAOI,qCAPJ,UAOI,0BAPJ,sCAOI,oCAPJ,CAOI,sCAPJ,4BAOI,iCAPJ,gCAOI,+BAPJ,iCAOI,+BAPJ,UAOI,wBAPJ,CAOI,yBAPJ,UAOI,8BAPJ,8BAOI,UAPJ,4BAOI,mEAPJ,oEAOI,yCAPJ,2BAOI,kEAPJ,uBAOI,gFAPJ,kGAOI,4KAPJ,uBAOI,UAPJ,sCAOI,sLAPJ,8BAOI,uCAPJ,UAOI,oHAPJ,0BAOI,yCAPJ,UAOI,wHAPJ,6BAOI,kCAPJ,UAOI,+LAPJ,eAOI,yHAPJ,WAOI,mBAPJ,cAOI,0DAPJ,eAOI,uBAPJ,eAOI,sBAPJ,eAOI,wBAPJ,eAOI,sBAPJ,kBAOI,qDAPJ,kBAOI,+DAPJ,kBAOI,0IAPJ,kBAOI,4IAPJ,CAOI,2RAPJ,kDAOI,wEAPJ,sBAOI,6EAPJ,CAOI,uIAPJ,sBAOI,8KAPJ,YAOI,uHAPJ,uBAOI,2CAPJ,gBAOI,qDAPJ,oCAOI,sGAPJ,iBAOI,iKAPJ,0BAOI,6MAPJ,gCAOI,kKAPJ,6DAOI,qDAPJ,8BAOI,oDAPJ,CAOI,6GAPJ,4IAOI,8BAPJ,2BAOI,8HAPJ,+BAOI,8CAPJ,sBAOI,mDAPJ,6BAOI,kDAPJ,yBAOI,qDAPJ,4BAOI,gDAPJ,iBAOI,4DAPJ,8BAOI,4DAPJ,gBAOI,iBAPJ,SAOI,2BAPJ,uBAOI,+BzDVR,8ByDGI,SAOI,uBAPJ,SAOI,qBAPJ,YAOI,qBAPJ,UAOI,uBAPJ,mCAOI,6BAPJ,6BAOI,UAPJ,2BAOI,iEAPJ,kEAOI,mEAPJ,2BAOI,uCAPJ,CAOI,2BAPJ,mCAOI,+DAPJ,CAOI,2BAPJ,uCAOI,mIAPJ,CAOI,2BAPJ,UAOI,mEAPJ,4BAOI,0DAPJ,qCAOI,CAPJ,mCAOI,UAPJ,yBAOI,UAPJ,2BAOI,2GAPJ,uCAOI,UAPJ,4BAOI,qCAPJ,uCAOI,qCAPJ,aAOI,2BAPJ,mCAOI,wCAPJ,uCAOI,sCAPJ,UAOI,wCAPJ,4BAOI,yCAPJ,UAOI,uBAPJ,sCAOI,qCAPJ,UAOI,0BAPJ,sCAOI,oCAPJ,CAOI,sCAPJ,4BAOI,iCAPJ,gCAOI,+BAPJ,iCAOI,+BAPJ,UAOI,wBAPJ,CAOI,yBAPJ,UAOI,8BAPJ,8BAOI,UAPJ,4BAOI,mEAPJ,oEAOI,yCAPJ,2BAOI,kEAPJ,uBAOI,gFAPJ,kGAOI,4KAPJ,uBAOI,UAPJ,sCAOI,sLAPJ,8BAOI,uCAPJ,UAOI,oHAPJ,0BAOI,yCAPJ,UAOI,wHAPJ,6BAOI,kCAPJ,UAOI,+LAPJ,eAOI,yHAPJ,WAOI,mBAPJ,cAOI,0DAPJ,eAOI,uBAPJ,eAOI,sBAPJ,eAOI,wBAPJ,eAOI,sBAPJ,kBAOI,qDAPJ,kBAOI,+DAPJ,kBAOI,0IAPJ,kBAOI,4IAPJ,CAOI,2RAPJ,kDAOI,wEAPJ,sBAOI,6EAPJ,CAOI,uIAPJ,sBAOI,8KAPJ,YAOI,uHAPJ,uBAOI,2CAPJ,gBAOI,qDAPJ,oCAOI,sGAPJ,iBAOI,iKAPJ,0BAOI,6MAPJ,gCAOI,kKAPJ,6DAOI,qDAPJ,8BAOI,oDAPJ,CAOI,6GAPJ,4IAOI,8BAPJ,2BAOI,8HAPJ,+BAOI,8CAPJ,sBAOI,mDAPJ,6BAOI,kDAPJ,yBAOI,qDAPJ,4BAOI,gDAPJ,iBAOI,4DAPJ,8BAOI,4DAPJ,gBAOI,iBAPJ,SAOI,2BAPJ,uBAOI,+BzDVR,8ByDGI,SAOI,uBAPJ,SAOI,qBAPJ,2CAOI,uBAPJ,mCAOI,6BAPJ,6BAOI,UAPJ,2BAOI,iEAPJ,kEAOI,mEAPJ,2BAOI,uCAPJ,CAOI,2BAPJ,mCAOI,+DAPJ,CAOI,2BAPJ,uCAOI,mIAPJ,CAOI,2BAPJ,UAOI,4BAPJ,0BAOI,aAPJ,4BAOI,2DAPJ,oCAOI,UAPJ,0BAOI,UAPJ,yBAOI,gJAPJ,uCAOI,UAPJ,4BAOI,qCAPJ,uCAOI,qCAPJ,aAOI,2BAPJ,mCAOI,wCAPJ,uCAOI,sCAPJ,UAOI,wCAPJ,4BAOI,yCAPJ,UAOI,uBAPJ,sCAOI,qCAPJ,UAOI,0BAPJ,sCAOI,oCAPJ,aAOI,0BAPJ,4BAOI,iCAPJ,gCAOI,+BAPJ,iCAOI,+BAPJ,UAOI,wBAPJ,CAOI,yBAPJ,UAOI,8BAPJ,8BAOI,UAPJ,4BAOI,mEAPJ,oEAOI,CAPJ,8BAOI,UAPJ,2BAOI,kEAPJ,uBAOI,gFAPJ,kGAOI,0BAPJ,CAOI,iJAPJ,uBAOI,UAPJ,sCAOI,sLAPJ,8BAOI,uCAPJ,UAOI,wLAPJ,uCAOI,0FAPJ,6BAOI,kCAPJ,UAOI,+LAPJ,eAOI,yHAPJ,WAOI,4FAPJ,cAOI,uBAPJ,eAOI,sBAPJ,eAOI,wBAPJ,eAOI,sBAPJ,kBAOI,qDAPJ,kBAOI,+DAPJ,kBAOI,6DAPJ,CAOI,4EAPJ,kBAOI,4IAPJ,gBAOI,6QAPJ,kDAOI,wEAPJ,sBAOI,6EAPJ,CAOI,uIAPJ,sBAOI,8KAPJ,YAOI,uHAPJ,uBAOI,2CAPJ,gBAOI,qDAPJ,oCAOI,sGAPJ,iBAOI,iKAPJ,0BAOI,6MAPJ,gCAOI,kKAPJ,6DAOI,qDAPJ,8BAOI,oDAPJ,CAOI,6GAPJ,4IAOI,8BAPJ,2BAOI,8HAPJ,+BAOI,8CAPJ,sBAOI,mDAPJ,6BAOI,kDAPJ,yBAOI,qDAPJ,4BAOI,gDAPJ,iBAOI,4DAPJ,8BAOI,4DAPJ,gBAOI,iBAPJ,SAOI,2BAPJ,uBAOI,+BzDVR,8ByDGI,SAOI,uBAPJ,SAOI,qBAPJ,iCAOI,iCAPJ,mCAOI,4BAPJ,+BAOI,SAPJ,2BAOI,iEAPJ,CAOI,2BAPJ,sCAOI,CAPJ,6BAOI,oCAPJ,CAOI,2BAPJ,uCAOI,+DAPJ,+DAOI,mEAPJ,CAOI,0BAPJ,CAOI,SAPJ,4BAOI,2BAPJ,SAOI,+BAPJ,2BAOI,gEAPJ,aAOI,4BAPJ,0DAOI,qCAPJ,UAOI,0BAPJ,UAOI,yBAPJ,qCAOI,CAPJ,kCAOI,aAPJ,yBAOI,yEAPJ,UAOI,4BAPJ,qCAOI,uCAPJ,qCAOI,aAPJ,2BAOI,mCAPJ,wCAOI,uCAPJ,sCAOI,wCAPJ,UAOI,yCAPJ,4BAOI,iCAPJ,UAOI,6BAPJ,oCAOI,oCAPJ,UAOI,4BAPJ,oCAOI,uCAPJ,SAOI,oDAPJ,SAOI,gCAPJ,sBAOI,iCAPJ,+BAOI,UAPJ,wBAOI,oCAPJ,6BAOI,yCAPJ,4BAOI,+BAPJ,SAOI,2BAPJ,oEAOI,yCAPJ,2BAOI,kEAPJ,uBAOI,UAPJ,wKAOI,0BAPJ,UAOI,yKAPJ,4BAOI,UAPJ,yEAOI,4LAPJ,4BAOI,wCAPJ,CAOI,4HAPJ,8BAOI,uCAPJ,UAOI,+LAPJ,2BAOI,uCAPJ,UAOI,qDAPJ,WAOI,mDAPJ,4BAOI,0CAPJ,kBAOI,eAPJ,mBAOI,sDAPJ,uBAOI,eAPJ,sBAOI,eAPJ,wBAOI,eAPJ,sBAOI,kBAPJ,qDAOI,kBAPJ,mCAOI,8CAPJ,kCAOI,CAPJ,0BAOI,kBAPJ,iCAOI,4CAPJ,+DAOI,kBAPJ,2DAOI,gBAPJ,yBAOI,cAPJ,0BAOI,iBAPJ,2BAOI,6CAPJ,oBAOI,sDAPJ,oBAOI,yBAPJ,4BAOI,iDAPJ,sBAOI,qGAPJ,yBAOI,eAPJ,wBAOI,CAPJ,oBAOI,4CAPJ,uBAOI,uDAPJ,6BAOI,qCAPJ,kBAOI,8CAPJ,4BAOI,6KAPJ,4BAOI,4GAPJ,0BAOI,uCAPJ,kBAOI,4DAPJ,oBAOI,2CAPJ,uBAOI,gBAPJ,wBAOI,6CAPJ,uBAOI,4DAPJ,8DAOI,+FAPJ,CAOI,6BAPJ,uCAOI,CAPJ,4BAOI,qNAPJ,yBAOI,uDAPJ,8BAOI,2KAPJ,CAOI,0BAPJ,+FAOI,2BAPJ,+FAOI,+CAPJ,uBAOI,oDAPJ,6BAOI,wBAPJ,2BAOI,6GAPJ,mCAOI,6CAPJ,+BAOI,gDAPJ,+BAOI,iEAPJ,UAOI,6DAPJ,sBAOI,gEAPJ,UAOI,kCCtDZ,qBD+CQ,WAOI,iDAPJ,sCC5BR,CDmCY,6BCnCZ,WDmCY,2BAPJ,CC5BR,4BD4BQ,WAOI,6FAPJ,CAOI,6BAPJ,qCAOI,oEAPJ,uCAOI,yFAPJ,CAOI,2BAPJ,WAOI","sources":["components/Profiling/Profiling.scss","index.scss","App.scss","components/Diagnosis/Diagnosis.scss","components/Graph/Graph.scss","components/OpDetails/OpDetails.scss","components/Histogram/Histogram.scss","components/Workloads/Workloads.scss","components/WorkloadDetails/WorkloadDetails.scss","variables.scss","components/ModelSummary/ModelSummary.scss","../node_modules/bootstrap/scss/mixins/_banner.scss","../node_modules/bootstrap/scss/_root.scss","../node_modules/bootstrap/scss/vendor/_rfs.scss","../node_modules/bootstrap/scss/mixins/_color-mode.scss","../node_modules/bootstrap/dist/css/dist/css/bootstrap.css","../node_modules/bootstrap/scss/_reboot.scss","../node_modules/bootstrap/scss/mixins/_border-radius.scss","../node_modules/bootstrap/scss/_type.scss","../node_modules/bootstrap/scss/mixins/_lists.scss","../node_modules/bootstrap/scss/_images.scss","../node_modules/bootstrap/scss/mixins/_image.scss","../node_modules/bootstrap/scss/_containers.scss","../node_modules/bootstrap/scss/mixins/_container.scss","../node_modules/bootstrap/scss/mixins/_breakpoints.scss","../node_modules/bootstrap/scss/_grid.scss","../node_modules/bootstrap/scss/mixins/_grid.scss","../node_modules/bootstrap/scss/_tables.scss","../node_modules/bootstrap/scss/mixins/_table-variants.scss","../node_modules/bootstrap/scss/forms/_labels.scss","../node_modules/bootstrap/scss/forms/_form-text.scss","../node_modules/bootstrap/scss/forms/_form-control.scss","../node_modules/bootstrap/scss/mixins/_transition.scss","../node_modules/bootstrap/scss/mixins/_gradients.scss","../node_modules/bootstrap/scss/forms/_form-select.scss","../node_modules/bootstrap/scss/forms/_form-check.scss","../node_modules/bootstrap/scss/forms/_form-range.scss","../node_modules/bootstrap/scss/forms/_floating-labels.scss","../node_modules/bootstrap/scss/forms/_input-group.scss","../node_modules/bootstrap/scss/mixins/_forms.scss","../node_modules/bootstrap/scss/_buttons.scss","../node_modules/bootstrap/scss/mixins/_buttons.scss","../node_modules/bootstrap/scss/_transitions.scss","../node_modules/bootstrap/scss/_dropdown.scss","../node_modules/bootstrap/scss/mixins/_caret.scss","../node_modules/bootstrap/scss/_button-group.scss","../node_modules/bootstrap/scss/_nav.scss","../node_modules/bootstrap/scss/_navbar.scss","../node_modules/bootstrap/scss/_card.scss","../node_modules/bootstrap/scss/_accordion.scss","../node_modules/bootstrap/scss/_breadcrumb.scss","../node_modules/bootstrap/scss/_pagination.scss","../node_modules/bootstrap/scss/_badge.scss","../node_modules/bootstrap/scss/_alert.scss","../node_modules/bootstrap/scss/_progress.scss","../node_modules/bootstrap/scss/_list-group.scss","../node_modules/bootstrap/scss/_close.scss","../node_modules/bootstrap/scss/_toasts.scss","../node_modules/bootstrap/scss/_modal.scss","../node_modules/bootstrap/scss/mixins/_backdrop.scss","../node_modules/bootstrap/scss/_tooltip.scss","../node_modules/bootstrap/scss/mixins/_reset-text.scss","../node_modules/bootstrap/scss/_popover.scss","../node_modules/bootstrap/scss/_carousel.scss","../node_modules/bootstrap/scss/_spinners.scss","../node_modules/bootstrap/scss/_offcanvas.scss","../node_modules/bootstrap/scss/_placeholders.scss","../node_modules/bootstrap/scss/helpers/_color-bg.scss","../node_modules/bootstrap/scss/mixins/_clearfix.scss","../node_modules/bootstrap/scss/helpers/_colored-links.scss","../node_modules/bootstrap/scss/helpers/_focus-ring.scss","../node_modules/bootstrap/scss/helpers/_icon-link.scss","../node_modules/bootstrap/scss/helpers/_ratio.scss","../node_modules/bootstrap/scss/helpers/_position.scss","../node_modules/bootstrap/scss/helpers/_stacks.scss","../node_modules/bootstrap/scss/helpers/_visually-hidden.scss","../node_modules/bootstrap/scss/mixins/_visually-hidden.scss","../node_modules/bootstrap/scss/helpers/_stretched-link.scss","../node_modules/bootstrap/scss/helpers/_text-truncation.scss","../node_modules/bootstrap/scss/mixins/_text-truncate.scss","../node_modules/bootstrap/scss/helpers/_vr.scss","../node_modules/bootstrap/scss/mixins/_utilities.scss","../node_modules/bootstrap/scss/utilities/_api.scss"],"sourcesContent":["// -* - coding: utf - 8 -* -\n// Copyright(c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n.Profiling {\n .data-panel {\n width: 100%;\n }\n}\n\n.ascending::after {\n content: '\\2191';\n display: inline-block;\n margin-left: 1em;\n}\n\n.descending::after {\n content: '\\2193';\n display: inline-block;\n margin-left: 1em;\n}","// -* - coding: utf - 8 -* -\n// Copyright(c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n@import './variables.scss';\n\nbody {\n margin: 0;\n font-family: IntelClearRg;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}","// -* - coding: utf - 8 -* -\n// Copyright(c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n@import './variables.scss';\n\ntable.rounded {\n margin: auto;\n border-collapse: collapse;\n\n tr.header {\n text-align: center;\n font-weight: bold;\n }\n\n th.header {\n background: $accent-yellow;\n color: black;\n vertical-align: middle;\n }\n\n td.header {\n background: $accent-yellow;\n padding: 10px;\n color: black;\n text-align: center;\n border-bottom: 1px solid #fafafa;\n border-radius: 0px;\n }\n\n tr:nth-child(even) {\n background-color: rgba(182, 182, 182, 0.13);\n }\n\n tr:nth-child(odd) {\n background-color: rgba(231, 231, 231, 0.13);\n }\n\n tr.cell,\n td.cell {\n padding: 5px;\n border-bottom: none;\n }\n\n tr:last-child {\n\n td:last-child {\n border-radius: 0 0 0.5rem 0;\n }\n\n td:first-child {\n border-radius: 0 0 0 0.5rem;\n }\n\n td:only-child {\n border-radius: 0 0 0.5rem 0.5rem;\n }\n }\n\n tr:first-child {\n\n th:first-child {\n border-radius: 0.5rem 0 0 0;\n }\n\n th:last-child {\n border-radius: 0 0.5rem 0 0;\n }\n\n td:first-child {\n border-radius: 0.5rem 0 0 0;\n }\n\n td:last-child {\n border-radius: 0 0.5rem 0 0;\n }\n\n td:only-child {\n border-radius: 0.5rem 0.5rem 0 0;\n }\n }\n\n tr:only-child {\n td:only-child {\n border-radius: 0.5rem 0.5rem 0.5rem 0.5rem;\n }\n }\n\n tr.active {\n background-color: #ffe07ab6 !important;\n color: black;\n }\n}\n\n.right {\n text-align: right;\n}\n\n.center {\n text-align: center;\n}\n\n.btn-primary {\n background-color: $accent-yellow !important;\n color: black !important;\n border: 2px solid $accent-yellow !important;\n}\n\n.btn-primary:hover,\n.btn-primary:focus {\n color: black !important;\n border: 2px solid black !important;\n}\n\n.btn-secondary {\n background-color: white !important;\n color: black !important;\n border-color: $accent-yellow !important;\n margin-bottom: 4px;\n width: 100%;\n}\n\n.btn-secondary:hover {\n background-color: $lighter-yellow !important;\n color: black !important;\n border-color: $accent-yellow !important;\n}","// -* - coding: utf - 8 -* -\n// Copyright(c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n@import './../../variables.scss';\n\n.Diagnosis {\n\n .property-table {\n border-collapse: collapse;\n width: 100%;\n }\n\n .table-title {\n font-family: IntelClearBd;\n text-align: center;\n }\n\n .table-key {\n text-align: right;\n padding: 5px;\n }\n\n .table-value {\n text-align: left;\n background-color: $light-gray;\n padding: 5px;\n border: 2px white solid;\n }\n\n .data-panel {\n background-color: white;\n padding: 10px;\n border-radius: 0.5rem;\n margin-bottom: 6px;\n }\n\n .data-panel-top {\n background-color: white;\n padding: 10px;\n border-radius: 0.5rem;\n margin-top: 6px;\n }\n\n .flexbox {\n display: flex;\n max-height: 99vh;\n background-color: $light-gray;\n }\n\n .flexbox-inside {\n flex-shrink: 0;\n padding: 3px;\n display: flex;\n flex-direction: column;\n max-height: 90vh;\n }\n \n .workloads-flex {\n display: flex;\n flex-direction: column;\n overflow: auto;\n }\n\n .overflow-table {\n max-height: calc(90vh - 96px);\n background-color: white;\n border-radius: 0.5rem;\n overflow: auto;\n }\n\n .flex-item {\n padding: 3px;\n width: 98%;\n max-width: calc(100vw - 370px);\n }\n\n .flex-bigger {\n padding: 3px;\n width: 98%;\n }\n\n .accuracy-table {\n width: 98%;\n }\n\n .accuracy-number {\n font-size: 200%;\n color: $energy-blue;\n text-align: center;\n padding-left: 20px;\n }\n\n .accuracy-title {\n font-family: IntelOneRg;\n font-size: 120%;\n }\n\n .accuracy-subtitle {\n font-size: 80%;\n color: $dark-gray;\n text-align: center;\n padding-left: 20px;\n }\n\n .clickable {\n cursor: pointer;\n }\n\n .nowrap {\n white-space: nowrap;\n }\n\n .alert {\n position: fixed;\n top: 40vh;\n left: 25vw;\n margin: auto;\n width: 50vw;\n z-index: 100;\n }\n\n .spinner-container {\n width: 50px;\n margin: auto;\n padding: 20px;\n }\n\n .spinner {\n color: #5B69FF;\n }\n}","// -* - coding: utf - 8 -* -\n// Copyright(c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n@import './../../variables.scss';\n\n* {\n font-family: IntelClearRg;\n}\n\n.Graph {\n #cy {\n height: 90vh;\n position: relative;\n margin: auto;\n background: #fafafa;\n background-image: radial-gradient(#bebebe 1px, transparent 0);\n background-size: 18px 18px;\n border-radius: 0.5rem;\n }\n\n .plus-sign {\n color: white;\n background-color: #5B69FF;\n border-radius: 50%;\n width: 25px;\n height: 25px;\n text-align: center;\n cursor: pointer;\n }\n\n .graph-buttons {\n position: absolute;\n margin-top: 6px;\n z-index: 10;\n float: right;\n }\n\n .graph-button {\n cursor: pointer;\n margin-left: 6px;\n background-color: $accent-yellow;\n color: black;\n border: none;\n }\n\n .nodes-table-container {\n position: absolute;\n top: 50px;\n left: 5px;\n background-color: rgba(182, 182, 182, 0.13);\n }\n\n .nodes-table {\n font-family: IntelClearRg;\n width: 200px;\n }\n\n .header {\n font-family: IntelClearBd;\n text-align: left;\n }\n}","// -* - coding: utf - 8 -* -\n// Copyright(c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n.histogram-btn {\n float: right;\n}\n\n#opDetails {\n height: 560px;\n max-width: 40vw;\n}","// -* - coding: utf - 8 -* -\n// Copyright(c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n.Histogram {\n padding: 10px;\n background-color: white;\n border-radius: 0.5rem;\n min-width: 60vw;\n}","// -* - coding: utf - 8 -* -\n// Copyright(c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n@import './../../variables.scss';\n\n.active {\n background-color: $accent-yellow !important;\n}\n\n.date {\n color: $dark-gray;\n font-size: 80%;\n}\n","// -* - coding: utf - 8 -* -\n// Copyright(c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n@import './../../variables.scss';\n\n.details-list {\n width: 100%;\n}\n\n.delete-button {\n float: right;\n width: 25px;\n height: 25px;\n}","// Copyright (c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//== Core Intel Colors\n//\n//## Colors defined in the corporate brand guidelines.\n//## https://brandportal.intel.com/us/en/style/color\n\n$red: #ed1c24; // Intel red\n$dark-orange: #fc4c02;\n$orange: #FFA300; // Intel orange\n$yellow: #F3D54E; // Intel yellow\n\n$dark-blue: #005B85; // Intel dark blue\n$classic-blue5: #00285A;\n$classic-blue4: #004A86;\n$classic-blue3: #0068B5;\n$blue: #0095CA; // Intel blue\n$energy-blue: #00C7FD;\n$light-blue: #7BDEFF; // Intel light blue\n$pale-blue: #B4F0FF; // Intel pale blue\n$accent-yellow: #FEC91B;\n\n$green: #8BAE46; // Intel green\n$light-green: #D7F3A2;\n$dark-green: #515A3D;\n\n$light-gray: #ececec; // no change\n$gray: #939598; // no change\n$dark-gray: #53565a; // no change\n\n$loop_color_good: #a6ce39;\n$loop_color_neutral: #fdb813;\n$loop_color_bad: #ed1b24;\n\n//== Extended Intel Colors\n//\n//## Color not included in the brand guidelines but approved for internal usage.\n\n$white: #ffffff;\n$black: #000000;\n\n$lighter-red-selected: #d2b1ac;\n$lighter-red: #ffe1dd;\n$light-red: #ff6450;\n$dark-red: #931c1a;\n$hover-red: $light-red;\n$tapped-red: $dark-red;\n\n$lighter-yellow: #fff2d0;\n\n$lighter-blue: $pale-blue;\n$hover-blue: $light-blue;\n$tapped-blue: $dark-blue;\n\n$lighter-gray1: #f7f8f9;\n$lighter-gray2: #edeff0;\n$lighter-gray3: #e1e5e7;\n$lighter-gray3-5: #CCCCCC;\n$lighter-gray4: #737373;\n$lighter-gray: $lighter-gray2;\n$darker-gray: #333;\n$darkest-gray: #111;\n$hover-gray: $lighter-gray;\n$tapped-gray: $light-gray;\n\n/* Intel Clear font */\n\n@font-face {\n font-family: IntelOneRg;\n src: url('/assets/fonts/intelone-display-regular.ttf');\n}\n\n@font-face {\n font-family: IntelOneLt;\n src: url('/assets/fonts/intelone-display-light.ttf');\n}\n\n@font-face {\n font-family: IntelOneBd;\n src: url('/assets/fonts/intelone-display-bold.ttf');\n}\n\n@font-face {\n font-family: IntelClearRg;\n src: url('/assets/fonts/IntelClear_Rg.ttf');\n}\n\n@font-face {\n font-family: IntelClearLt;\n src: url('/assets/fonts/IntelClear_Lt.ttf');\n}\n\n@font-face {\n font-family: IntelClearBd;\n src: url('/assets/fonts/IntelClear_Bd.ttf');\n}\n\n@font-face {\n font-family: IntelClearBd;\n src: url('/assets/fonts/IntelClear_Bd.ttf');\n}\n\n@font-face {\n font-family: IntelOneMono;\n src: url('/assets/fonts/intelone-mono-font-family-regular.ttf');\n}","// -* - coding: utf - 8 -* -\n// Copyright(c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n@import './../../variables.scss';\n\n.summary {\n font-family: IntelOneMono;\n white-space: pre;\n overflow: auto;\n max-height: 90vh;\n}","@mixin bsBanner($file) {\n /*!\n * Bootstrap #{$file} v5.3.0 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n}\n",":root,\n[data-bs-theme=\"light\"] {\n // Note: Custom variable values only support SassScript inside `#{}`.\n\n // Colors\n //\n // Generate palettes for full colors, grays, and theme colors.\n\n @each $color, $value in $colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $grays {\n --#{$prefix}gray-#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors {\n --#{$prefix}#{$color}: #{$value};\n }\n\n @each $color, $value in $theme-colors-rgb {\n --#{$prefix}#{$color}-rgb: #{$value};\n }\n\n @each $color, $value in $theme-colors-text {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}white-rgb: #{to-rgb($white)};\n --#{$prefix}black-rgb: #{to-rgb($black)};\n\n // Fonts\n\n // Note: Use `inspect` for lists so that quoted items keep the quotes.\n // See https://github.com/sass/sass/issues/2383#issuecomment-336349172\n --#{$prefix}font-sans-serif: #{inspect($font-family-sans-serif)};\n --#{$prefix}font-monospace: #{inspect($font-family-monospace)};\n --#{$prefix}gradient: #{$gradient};\n\n // Root and body\n // scss-docs-start root-body-variables\n @if $font-size-root != null {\n --#{$prefix}root-font-size: #{$font-size-root};\n }\n --#{$prefix}body-font-family: #{inspect($font-family-base)};\n @include rfs($font-size-base, --#{$prefix}body-font-size);\n --#{$prefix}body-font-weight: #{$font-weight-base};\n --#{$prefix}body-line-height: #{$line-height-base};\n @if $body-text-align != null {\n --#{$prefix}body-text-align: #{$body-text-align};\n }\n\n --#{$prefix}body-color: #{$body-color};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color)};\n --#{$prefix}body-bg: #{$body-bg};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg)};\n // scss-docs-end root-body-variables\n\n --#{$prefix}heading-color: #{$headings-color};\n\n --#{$prefix}link-color: #{$link-color};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color)};\n --#{$prefix}link-decoration: #{$link-decoration};\n\n --#{$prefix}link-hover-color: #{$link-hover-color};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color)};\n\n @if $link-hover-decoration != null {\n --#{$prefix}link-hover-decoration: #{$link-hover-decoration};\n }\n\n --#{$prefix}code-color: #{$code-color};\n --#{$prefix}highlight-bg: #{$mark-bg};\n\n // scss-docs-start root-border-var\n --#{$prefix}border-width: #{$border-width};\n --#{$prefix}border-style: #{$border-style};\n --#{$prefix}border-color: #{$border-color};\n --#{$prefix}border-color-translucent: #{$border-color-translucent};\n\n --#{$prefix}border-radius: #{$border-radius};\n --#{$prefix}border-radius-sm: #{$border-radius-sm};\n --#{$prefix}border-radius-lg: #{$border-radius-lg};\n --#{$prefix}border-radius-xl: #{$border-radius-xl};\n --#{$prefix}border-radius-xxl: #{$border-radius-xxl};\n --#{$prefix}border-radius-2xl: var(--#{$prefix}border-radius-xxl); // Deprecated in v5.3.0 for consistency\n --#{$prefix}border-radius-pill: #{$border-radius-pill};\n // scss-docs-end root-border-var\n\n --#{$prefix}box-shadow: #{$box-shadow};\n --#{$prefix}box-shadow-sm: #{$box-shadow-sm};\n --#{$prefix}box-shadow-lg: #{$box-shadow-lg};\n --#{$prefix}box-shadow-inset: #{$box-shadow-inset};\n\n // Focus styles\n // scss-docs-start root-focus-variables\n --#{$prefix}focus-ring-width: #{$focus-ring-width};\n --#{$prefix}focus-ring-opacity: #{$focus-ring-opacity};\n --#{$prefix}focus-ring-color: #{$focus-ring-color};\n // scss-docs-end root-focus-variables\n\n // scss-docs-start root-form-validation-variables\n --#{$prefix}form-valid-color: #{$form-valid-color};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color};\n --#{$prefix}form-invalid-color: #{$form-invalid-color};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color};\n // scss-docs-end root-form-validation-variables\n}\n\n@if $enable-dark-mode {\n @include color-mode(dark, true) {\n color-scheme: dark;\n\n // scss-docs-start root-dark-mode-vars\n --#{$prefix}body-color: #{$body-color-dark};\n --#{$prefix}body-color-rgb: #{to-rgb($body-color-dark)};\n --#{$prefix}body-bg: #{$body-bg-dark};\n --#{$prefix}body-bg-rgb: #{to-rgb($body-bg-dark)};\n\n --#{$prefix}emphasis-color: #{$body-emphasis-color-dark};\n --#{$prefix}emphasis-color-rgb: #{to-rgb($body-emphasis-color-dark)};\n\n --#{$prefix}secondary-color: #{$body-secondary-color-dark};\n --#{$prefix}secondary-color-rgb: #{to-rgb($body-secondary-color-dark)};\n --#{$prefix}secondary-bg: #{$body-secondary-bg-dark};\n --#{$prefix}secondary-bg-rgb: #{to-rgb($body-secondary-bg-dark)};\n\n --#{$prefix}tertiary-color: #{$body-tertiary-color-dark};\n --#{$prefix}tertiary-color-rgb: #{to-rgb($body-tertiary-color-dark)};\n --#{$prefix}tertiary-bg: #{$body-tertiary-bg-dark};\n --#{$prefix}tertiary-bg-rgb: #{to-rgb($body-tertiary-bg-dark)};\n\n @each $color, $value in $theme-colors-text-dark {\n --#{$prefix}#{$color}-text-emphasis: #{$value};\n }\n\n @each $color, $value in $theme-colors-bg-subtle-dark {\n --#{$prefix}#{$color}-bg-subtle: #{$value};\n }\n\n @each $color, $value in $theme-colors-border-subtle-dark {\n --#{$prefix}#{$color}-border-subtle: #{$value};\n }\n\n --#{$prefix}heading-color: #{$headings-color-dark};\n\n --#{$prefix}link-color: #{$link-color-dark};\n --#{$prefix}link-hover-color: #{$link-hover-color-dark};\n --#{$prefix}link-color-rgb: #{to-rgb($link-color-dark)};\n --#{$prefix}link-hover-color-rgb: #{to-rgb($link-hover-color-dark)};\n\n --#{$prefix}code-color: #{$code-color-dark};\n\n --#{$prefix}border-color: #{$border-color-dark};\n --#{$prefix}border-color-translucent: #{$border-color-translucent-dark};\n\n --#{$prefix}form-valid-color: #{$form-valid-color-dark};\n --#{$prefix}form-valid-border-color: #{$form-valid-border-color-dark};\n --#{$prefix}form-invalid-color: #{$form-invalid-color-dark};\n --#{$prefix}form-invalid-border-color: #{$form-invalid-border-color-dark};\n // scss-docs-end root-dark-mode-vars\n }\n}\n","// stylelint-disable scss/dimension-no-non-numeric-values\n\n// SCSS RFS mixin\n//\n// Automated responsive values for font sizes, paddings, margins and much more\n//\n// Licensed under MIT (https://github.com/twbs/rfs/blob/main/LICENSE)\n\n// Configuration\n\n// Base value\n$rfs-base-value: 1.25rem !default;\n$rfs-unit: rem !default;\n\n@if $rfs-unit != rem and $rfs-unit != px {\n @error \"`#{$rfs-unit}` is not a valid unit for $rfs-unit. Use `px` or `rem`.\";\n}\n\n// Breakpoint at where values start decreasing if screen width is smaller\n$rfs-breakpoint: 1200px !default;\n$rfs-breakpoint-unit: px !default;\n\n@if $rfs-breakpoint-unit != px and $rfs-breakpoint-unit != em and $rfs-breakpoint-unit != rem {\n @error \"`#{$rfs-breakpoint-unit}` is not a valid unit for $rfs-breakpoint-unit. Use `px`, `em` or `rem`.\";\n}\n\n// Resize values based on screen height and width\n$rfs-two-dimensional: false !default;\n\n// Factor of decrease\n$rfs-factor: 10 !default;\n\n@if type-of($rfs-factor) != number or $rfs-factor <= 1 {\n @error \"`#{$rfs-factor}` is not a valid $rfs-factor, it must be greater than 1.\";\n}\n\n// Mode. Possibilities: \"min-media-query\", \"max-media-query\"\n$rfs-mode: min-media-query !default;\n\n// Generate enable or disable classes. Possibilities: false, \"enable\" or \"disable\"\n$rfs-class: false !default;\n\n// 1 rem = $rfs-rem-value px\n$rfs-rem-value: 16 !default;\n\n// Safari iframe resize bug: https://github.com/twbs/rfs/issues/14\n$rfs-safari-iframe-resize-bug-fix: false !default;\n\n// Disable RFS by setting $enable-rfs to false\n$enable-rfs: true !default;\n\n// Cache $rfs-base-value unit\n$rfs-base-value-unit: unit($rfs-base-value);\n\n@function divide($dividend, $divisor, $precision: 10) {\n $sign: if($dividend > 0 and $divisor > 0 or $dividend < 0 and $divisor < 0, 1, -1);\n $dividend: abs($dividend);\n $divisor: abs($divisor);\n @if $dividend == 0 {\n @return 0;\n }\n @if $divisor == 0 {\n @error \"Cannot divide by 0\";\n }\n $remainder: $dividend;\n $result: 0;\n $factor: 10;\n @while ($remainder > 0 and $precision >= 0) {\n $quotient: 0;\n @while ($remainder >= $divisor) {\n $remainder: $remainder - $divisor;\n $quotient: $quotient + 1;\n }\n $result: $result * 10 + $quotient;\n $factor: $factor * .1;\n $remainder: $remainder * 10;\n $precision: $precision - 1;\n @if ($precision < 0 and $remainder >= $divisor * 5) {\n $result: $result + 1;\n }\n }\n $result: $result * $factor * $sign;\n $dividend-unit: unit($dividend);\n $divisor-unit: unit($divisor);\n $unit-map: (\n \"px\": 1px,\n \"rem\": 1rem,\n \"em\": 1em,\n \"%\": 1%\n );\n @if ($dividend-unit != $divisor-unit and map-has-key($unit-map, $dividend-unit)) {\n $result: $result * map-get($unit-map, $dividend-unit);\n }\n @return $result;\n}\n\n// Remove px-unit from $rfs-base-value for calculations\n@if $rfs-base-value-unit == px {\n $rfs-base-value: divide($rfs-base-value, $rfs-base-value * 0 + 1);\n}\n@else if $rfs-base-value-unit == rem {\n $rfs-base-value: divide($rfs-base-value, divide($rfs-base-value * 0 + 1, $rfs-rem-value));\n}\n\n// Cache $rfs-breakpoint unit to prevent multiple calls\n$rfs-breakpoint-unit-cache: unit($rfs-breakpoint);\n\n// Remove unit from $rfs-breakpoint for calculations\n@if $rfs-breakpoint-unit-cache == px {\n $rfs-breakpoint: divide($rfs-breakpoint, $rfs-breakpoint * 0 + 1);\n}\n@else if $rfs-breakpoint-unit-cache == rem or $rfs-breakpoint-unit-cache == \"em\" {\n $rfs-breakpoint: divide($rfs-breakpoint, divide($rfs-breakpoint * 0 + 1, $rfs-rem-value));\n}\n\n// Calculate the media query value\n$rfs-mq-value: if($rfs-breakpoint-unit == px, #{$rfs-breakpoint}px, #{divide($rfs-breakpoint, $rfs-rem-value)}#{$rfs-breakpoint-unit});\n$rfs-mq-property-width: if($rfs-mode == max-media-query, max-width, min-width);\n$rfs-mq-property-height: if($rfs-mode == max-media-query, max-height, min-height);\n\n// Internal mixin used to determine which media query needs to be used\n@mixin _rfs-media-query {\n @if $rfs-two-dimensional {\n @if $rfs-mode == max-media-query {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}), (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) and (#{$rfs-mq-property-height}: #{$rfs-mq-value}) {\n @content;\n }\n }\n }\n @else {\n @media (#{$rfs-mq-property-width}: #{$rfs-mq-value}) {\n @content;\n }\n }\n}\n\n// Internal mixin that adds disable classes to the selector if needed.\n@mixin _rfs-rule {\n @if $rfs-class == disable and $rfs-mode == max-media-query {\n // Adding an extra class increases specificity, which prevents the media query to override the property\n &,\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @else if $rfs-class == enable and $rfs-mode == min-media-query {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n } @else {\n @content;\n }\n}\n\n// Internal mixin that adds enable classes to the selector if needed.\n@mixin _rfs-media-query-rule {\n\n @if $rfs-class == enable {\n @if $rfs-mode == min-media-query {\n @content;\n }\n\n @include _rfs-media-query () {\n .enable-rfs &,\n &.enable-rfs {\n @content;\n }\n }\n }\n @else {\n @if $rfs-class == disable and $rfs-mode == min-media-query {\n .disable-rfs &,\n &.disable-rfs {\n @content;\n }\n }\n @include _rfs-media-query () {\n @content;\n }\n }\n}\n\n// Helper function to get the formatted non-responsive value\n@function rfs-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n }\n @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n @if $unit == px {\n // Convert to rem if needed\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $value * 0 + $rfs-rem-value)}rem, $value);\n }\n @else if $unit == rem {\n // Convert to px if needed\n $val: $val + \" \" + if($rfs-unit == px, #{divide($value, $value * 0 + 1) * $rfs-rem-value}px, $value);\n } @else {\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n $val: $val + \" \" + $value;\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// Helper function to get the responsive value calculated by RFS\n@function rfs-fluid-value($values) {\n // Convert to list\n $values: if(type-of($values) != list, ($values,), $values);\n\n $val: \"\";\n\n // Loop over each value and calculate value\n @each $value in $values {\n @if $value == 0 {\n $val: $val + \" 0\";\n } @else {\n // Cache $value unit\n $unit: if(type-of($value) == \"number\", unit($value), false);\n\n // If $value isn't a number (like inherit) or $value has a unit (not px or rem, like 1.5em) or $ is 0, just print the value\n @if not $unit or $unit != px and $unit != rem {\n $val: $val + \" \" + $value;\n } @else {\n // Remove unit from $value for calculations\n $value: divide($value, $value * 0 + if($unit == px, 1, divide(1, $rfs-rem-value)));\n\n // Only add the media query if the value is greater than the minimum value\n @if abs($value) <= $rfs-base-value or not $enable-rfs {\n $val: $val + \" \" + if($rfs-unit == rem, #{divide($value, $rfs-rem-value)}rem, #{$value}px);\n }\n @else {\n // Calculate the minimum value\n $value-min: $rfs-base-value + divide(abs($value) - $rfs-base-value, $rfs-factor);\n\n // Calculate difference between $value and the minimum value\n $value-diff: abs($value) - $value-min;\n\n // Base value formatting\n $min-width: if($rfs-unit == rem, #{divide($value-min, $rfs-rem-value)}rem, #{$value-min}px);\n\n // Use negative value if needed\n $min-width: if($value < 0, -$min-width, $min-width);\n\n // Use `vmin` if two-dimensional is enabled\n $variable-unit: if($rfs-two-dimensional, vmin, vw);\n\n // Calculate the variable width between 0 and $rfs-breakpoint\n $variable-width: #{divide($value-diff * 100, $rfs-breakpoint)}#{$variable-unit};\n\n // Return the calculated value\n $val: $val + \" calc(\" + $min-width + if($value < 0, \" - \", \" + \") + $variable-width + \")\";\n }\n }\n }\n }\n\n // Remove first space\n @return unquote(str-slice($val, 2));\n}\n\n// RFS mixin\n@mixin rfs($values, $property: font-size) {\n @if $values != null {\n $val: rfs-value($values);\n $fluid-val: rfs-fluid-value($values);\n\n // Do not print the media query if responsive & non-responsive values are the same\n @if $val == $fluid-val {\n #{$property}: $val;\n }\n @else {\n @include _rfs-rule () {\n #{$property}: if($rfs-mode == max-media-query, $val, $fluid-val);\n\n // Include safari iframe resize fix if needed\n min-width: if($rfs-safari-iframe-resize-bug-fix, (0 * 1vw), null);\n }\n\n @include _rfs-media-query-rule () {\n #{$property}: if($rfs-mode == max-media-query, $fluid-val, $val);\n }\n }\n }\n}\n\n// Shorthand helper mixins\n@mixin font-size($value) {\n @include rfs($value);\n}\n\n@mixin padding($value) {\n @include rfs($value, padding);\n}\n\n@mixin padding-top($value) {\n @include rfs($value, padding-top);\n}\n\n@mixin padding-right($value) {\n @include rfs($value, padding-right);\n}\n\n@mixin padding-bottom($value) {\n @include rfs($value, padding-bottom);\n}\n\n@mixin padding-left($value) {\n @include rfs($value, padding-left);\n}\n\n@mixin margin($value) {\n @include rfs($value, margin);\n}\n\n@mixin margin-top($value) {\n @include rfs($value, margin-top);\n}\n\n@mixin margin-right($value) {\n @include rfs($value, margin-right);\n}\n\n@mixin margin-bottom($value) {\n @include rfs($value, margin-bottom);\n}\n\n@mixin margin-left($value) {\n @include rfs($value, margin-left);\n}\n","// scss-docs-start color-mode-mixin\n@mixin color-mode($mode: light, $root: false) {\n @if $color-mode-type == \"media-query\" {\n @if $root == true {\n @media (prefers-color-scheme: $mode) {\n :root {\n @content;\n }\n }\n } @else {\n @media (prefers-color-scheme: $mode) {\n @content;\n }\n }\n } @else {\n [data-bs-theme=\"#{$mode}\"] {\n @content;\n }\n }\n}\n// scss-docs-end color-mode-mixin\n","@charset \"UTF-8\";\n/*!\n * Bootstrap v5.3.0 (https://getbootstrap.com/)\n * Copyright 2011-2023 The Bootstrap Authors\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n:root,\n[data-bs-theme=light] {\n --bs-blue: #0d6efd;\n --bs-indigo: #6610f2;\n --bs-purple: #6f42c1;\n --bs-pink: #d63384;\n --bs-red: #dc3545;\n --bs-orange: #fd7e14;\n --bs-yellow: #ffc107;\n --bs-green: #198754;\n --bs-teal: #20c997;\n --bs-cyan: #0dcaf0;\n --bs-black: #000;\n --bs-white: #fff;\n --bs-gray: #6c757d;\n --bs-gray-dark: #343a40;\n --bs-gray-100: #f8f9fa;\n --bs-gray-200: #e9ecef;\n --bs-gray-300: #dee2e6;\n --bs-gray-400: #ced4da;\n --bs-gray-500: #adb5bd;\n --bs-gray-600: #6c757d;\n --bs-gray-700: #495057;\n --bs-gray-800: #343a40;\n --bs-gray-900: #212529;\n --bs-primary: #0d6efd;\n --bs-secondary: #6c757d;\n --bs-success: #198754;\n --bs-info: #0dcaf0;\n --bs-warning: #ffc107;\n --bs-danger: #dc3545;\n --bs-light: #f8f9fa;\n --bs-dark: #212529;\n --bs-primary-rgb: 13, 110, 253;\n --bs-secondary-rgb: 108, 117, 125;\n --bs-success-rgb: 25, 135, 84;\n --bs-info-rgb: 13, 202, 240;\n --bs-warning-rgb: 255, 193, 7;\n --bs-danger-rgb: 220, 53, 69;\n --bs-light-rgb: 248, 249, 250;\n --bs-dark-rgb: 33, 37, 41;\n --bs-primary-text-emphasis: #052c65;\n --bs-secondary-text-emphasis: #2b2f32;\n --bs-success-text-emphasis: #0a3622;\n --bs-info-text-emphasis: #055160;\n --bs-warning-text-emphasis: #664d03;\n --bs-danger-text-emphasis: #58151c;\n --bs-light-text-emphasis: #495057;\n --bs-dark-text-emphasis: #495057;\n --bs-primary-bg-subtle: #cfe2ff;\n --bs-secondary-bg-subtle: #e2e3e5;\n --bs-success-bg-subtle: #d1e7dd;\n --bs-info-bg-subtle: #cff4fc;\n --bs-warning-bg-subtle: #fff3cd;\n --bs-danger-bg-subtle: #f8d7da;\n --bs-light-bg-subtle: #fcfcfd;\n --bs-dark-bg-subtle: #ced4da;\n --bs-primary-border-subtle: #9ec5fe;\n --bs-secondary-border-subtle: #c4c8cb;\n --bs-success-border-subtle: #a3cfbb;\n --bs-info-border-subtle: #9eeaf9;\n --bs-warning-border-subtle: #ffe69c;\n --bs-danger-border-subtle: #f1aeb5;\n --bs-light-border-subtle: #e9ecef;\n --bs-dark-border-subtle: #adb5bd;\n --bs-white-rgb: 255, 255, 255;\n --bs-black-rgb: 0, 0, 0;\n --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\";\n --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\n --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0));\n --bs-body-font-family: var(--bs-font-sans-serif);\n --bs-body-font-size: 1rem;\n --bs-body-font-weight: 400;\n --bs-body-line-height: 1.5;\n --bs-body-color: #212529;\n --bs-body-color-rgb: 33, 37, 41;\n --bs-body-bg: #fff;\n --bs-body-bg-rgb: 255, 255, 255;\n --bs-emphasis-color: #000;\n --bs-emphasis-color-rgb: 0, 0, 0;\n --bs-secondary-color: rgba(33, 37, 41, 0.75);\n --bs-secondary-color-rgb: 33, 37, 41;\n --bs-secondary-bg: #e9ecef;\n --bs-secondary-bg-rgb: 233, 236, 239;\n --bs-tertiary-color: rgba(33, 37, 41, 0.5);\n --bs-tertiary-color-rgb: 33, 37, 41;\n --bs-tertiary-bg: #f8f9fa;\n --bs-tertiary-bg-rgb: 248, 249, 250;\n --bs-heading-color: inherit;\n --bs-link-color: #0d6efd;\n --bs-link-color-rgb: 13, 110, 253;\n --bs-link-decoration: underline;\n --bs-link-hover-color: #0a58ca;\n --bs-link-hover-color-rgb: 10, 88, 202;\n --bs-code-color: #d63384;\n --bs-highlight-bg: #fff3cd;\n --bs-border-width: 1px;\n --bs-border-style: solid;\n --bs-border-color: #dee2e6;\n --bs-border-color-translucent: rgba(0, 0, 0, 0.175);\n --bs-border-radius: 0.375rem;\n --bs-border-radius-sm: 0.25rem;\n --bs-border-radius-lg: 0.5rem;\n --bs-border-radius-xl: 1rem;\n --bs-border-radius-xxl: 2rem;\n --bs-border-radius-2xl: var(--bs-border-radius-xxl);\n --bs-border-radius-pill: 50rem;\n --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);\n --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175);\n --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075);\n --bs-focus-ring-width: 0.25rem;\n --bs-focus-ring-opacity: 0.25;\n --bs-focus-ring-color: rgba(13, 110, 253, 0.25);\n --bs-form-valid-color: #198754;\n --bs-form-valid-border-color: #198754;\n --bs-form-invalid-color: #dc3545;\n --bs-form-invalid-border-color: #dc3545;\n}\n\n[data-bs-theme=dark] {\n color-scheme: dark;\n --bs-body-color: #adb5bd;\n --bs-body-color-rgb: 173, 181, 189;\n --bs-body-bg: #212529;\n --bs-body-bg-rgb: 33, 37, 41;\n --bs-emphasis-color: #fff;\n --bs-emphasis-color-rgb: 255, 255, 255;\n --bs-secondary-color: rgba(173, 181, 189, 0.75);\n --bs-secondary-color-rgb: 173, 181, 189;\n --bs-secondary-bg: #343a40;\n --bs-secondary-bg-rgb: 52, 58, 64;\n --bs-tertiary-color: rgba(173, 181, 189, 0.5);\n --bs-tertiary-color-rgb: 173, 181, 189;\n --bs-tertiary-bg: #2b3035;\n --bs-tertiary-bg-rgb: 43, 48, 53;\n --bs-primary-text-emphasis: #6ea8fe;\n --bs-secondary-text-emphasis: #a7acb1;\n --bs-success-text-emphasis: #75b798;\n --bs-info-text-emphasis: #6edff6;\n --bs-warning-text-emphasis: #ffda6a;\n --bs-danger-text-emphasis: #ea868f;\n --bs-light-text-emphasis: #f8f9fa;\n --bs-dark-text-emphasis: #dee2e6;\n --bs-primary-bg-subtle: #031633;\n --bs-secondary-bg-subtle: #161719;\n --bs-success-bg-subtle: #051b11;\n --bs-info-bg-subtle: #032830;\n --bs-warning-bg-subtle: #332701;\n --bs-danger-bg-subtle: #2c0b0e;\n --bs-light-bg-subtle: #343a40;\n --bs-dark-bg-subtle: #1a1d20;\n --bs-primary-border-subtle: #084298;\n --bs-secondary-border-subtle: #41464b;\n --bs-success-border-subtle: #0f5132;\n --bs-info-border-subtle: #087990;\n --bs-warning-border-subtle: #997404;\n --bs-danger-border-subtle: #842029;\n --bs-light-border-subtle: #495057;\n --bs-dark-border-subtle: #343a40;\n --bs-heading-color: inherit;\n --bs-link-color: #6ea8fe;\n --bs-link-hover-color: #8bb9fe;\n --bs-link-color-rgb: 110, 168, 254;\n --bs-link-hover-color-rgb: 139, 185, 254;\n --bs-code-color: #e685b5;\n --bs-border-color: #495057;\n --bs-border-color-translucent: rgba(255, 255, 255, 0.15);\n --bs-form-valid-color: #75b798;\n --bs-form-valid-border-color: #75b798;\n --bs-form-invalid-color: #ea868f;\n --bs-form-invalid-border-color: #ea868f;\n}\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n :root {\n scroll-behavior: smooth;\n }\n}\n\nbody {\n margin: 0;\n font-family: var(--bs-body-font-family);\n font-size: var(--bs-body-font-size);\n font-weight: var(--bs-body-font-weight);\n line-height: var(--bs-body-line-height);\n color: var(--bs-body-color);\n text-align: var(--bs-body-text-align);\n background-color: var(--bs-body-bg);\n -webkit-text-size-adjust: 100%;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\n\nhr {\n margin: 1rem 0;\n color: inherit;\n border: 0;\n border-top: var(--bs-border-width) solid;\n opacity: 0.25;\n}\n\nh6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 {\n margin-top: 0;\n margin-bottom: 0.5rem;\n font-weight: 500;\n line-height: 1.2;\n color: var(--bs-heading-color);\n}\n\nh1, .h1 {\n font-size: calc(1.375rem + 1.5vw);\n}\n@media (min-width: 1200px) {\n h1, .h1 {\n font-size: 2.5rem;\n }\n}\n\nh2, .h2 {\n font-size: calc(1.325rem + 0.9vw);\n}\n@media (min-width: 1200px) {\n h2, .h2 {\n font-size: 2rem;\n }\n}\n\nh3, .h3 {\n font-size: calc(1.3rem + 0.6vw);\n}\n@media (min-width: 1200px) {\n h3, .h3 {\n font-size: 1.75rem;\n }\n}\n\nh4, .h4 {\n font-size: calc(1.275rem + 0.3vw);\n}\n@media (min-width: 1200px) {\n h4, .h4 {\n font-size: 1.5rem;\n }\n}\n\nh5, .h5 {\n font-size: 1.25rem;\n}\n\nh6, .h6 {\n font-size: 1rem;\n}\n\np {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nabbr[title] {\n -webkit-text-decoration: underline dotted;\n text-decoration: underline dotted;\n cursor: help;\n -webkit-text-decoration-skip-ink: none;\n text-decoration-skip-ink: none;\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: 700;\n}\n\ndd {\n margin-bottom: 0.5rem;\n margin-left: 0;\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\nb,\nstrong {\n font-weight: bolder;\n}\n\nsmall, .small {\n font-size: 0.875em;\n}\n\nmark, .mark {\n padding: 0.1875em;\n background-color: var(--bs-highlight-bg);\n}\n\nsub,\nsup {\n position: relative;\n font-size: 0.75em;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\na {\n color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1));\n text-decoration: underline;\n}\na:hover {\n --bs-link-color-rgb: var(--bs-link-hover-color-rgb);\n}\n\na:not([href]):not([class]), a:not([href]):not([class]):hover {\n color: inherit;\n text-decoration: none;\n}\n\npre,\ncode,\nkbd,\nsamp {\n font-family: var(--bs-font-monospace);\n font-size: 1em;\n}\n\npre {\n display: block;\n margin-top: 0;\n margin-bottom: 1rem;\n overflow: auto;\n font-size: 0.875em;\n}\npre code {\n font-size: inherit;\n color: inherit;\n word-break: normal;\n}\n\ncode {\n font-size: 0.875em;\n color: var(--bs-code-color);\n word-wrap: break-word;\n}\na > code {\n color: inherit;\n}\n\nkbd {\n padding: 0.1875rem 0.375rem;\n font-size: 0.875em;\n color: var(--bs-body-bg);\n background-color: var(--bs-body-color);\n border-radius: 0.25rem;\n}\nkbd kbd {\n padding: 0;\n font-size: 1em;\n}\n\nfigure {\n margin: 0 0 1rem;\n}\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n color: var(--bs-secondary-color);\n text-align: left;\n}\n\nth {\n text-align: inherit;\n text-align: -webkit-match-parent;\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\nlabel {\n display: inline-block;\n}\n\nbutton {\n border-radius: 0;\n}\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0;\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\nbutton,\nselect {\n text-transform: none;\n}\n\n[role=button] {\n cursor: pointer;\n}\n\nselect {\n word-wrap: normal;\n}\nselect:disabled {\n opacity: 1;\n}\n\n[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator {\n display: none !important;\n}\n\nbutton,\n[type=button],\n[type=reset],\n[type=submit] {\n -webkit-appearance: button;\n}\nbutton:not(:disabled),\n[type=button]:not(:disabled),\n[type=reset]:not(:disabled),\n[type=submit]:not(:disabled) {\n cursor: pointer;\n}\n\n::-moz-focus-inner {\n padding: 0;\n border-style: none;\n}\n\ntextarea {\n resize: vertical;\n}\n\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\n\nlegend {\n float: left;\n width: 100%;\n padding: 0;\n margin-bottom: 0.5rem;\n font-size: calc(1.275rem + 0.3vw);\n line-height: inherit;\n}\n@media (min-width: 1200px) {\n legend {\n font-size: 1.5rem;\n }\n}\nlegend + * {\n clear: left;\n}\n\n::-webkit-datetime-edit-fields-wrapper,\n::-webkit-datetime-edit-text,\n::-webkit-datetime-edit-minute,\n::-webkit-datetime-edit-hour-field,\n::-webkit-datetime-edit-day-field,\n::-webkit-datetime-edit-month-field,\n::-webkit-datetime-edit-year-field {\n padding: 0;\n}\n\n::-webkit-inner-spin-button {\n height: auto;\n}\n\n[type=search] {\n outline-offset: -2px;\n -webkit-appearance: textfield;\n}\n\n/* rtl:raw:\n[type=\"tel\"],\n[type=\"url\"],\n[type=\"email\"],\n[type=\"number\"] {\n direction: ltr;\n}\n*/\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n::-webkit-color-swatch-wrapper {\n padding: 0;\n}\n\n::-webkit-file-upload-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\n::file-selector-button {\n font: inherit;\n -webkit-appearance: button;\n}\n\noutput {\n display: inline-block;\n}\n\niframe {\n border: 0;\n}\n\nsummary {\n display: list-item;\n cursor: pointer;\n}\n\nprogress {\n vertical-align: baseline;\n}\n\n[hidden] {\n display: none !important;\n}\n\n.lead {\n font-size: 1.25rem;\n font-weight: 300;\n}\n\n.display-1 {\n font-size: calc(1.625rem + 4.5vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-1 {\n font-size: 5rem;\n }\n}\n\n.display-2 {\n font-size: calc(1.575rem + 3.9vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-2 {\n font-size: 4.5rem;\n }\n}\n\n.display-3 {\n font-size: calc(1.525rem + 3.3vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-3 {\n font-size: 4rem;\n }\n}\n\n.display-4 {\n font-size: calc(1.475rem + 2.7vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-4 {\n font-size: 3.5rem;\n }\n}\n\n.display-5 {\n font-size: calc(1.425rem + 2.1vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-5 {\n font-size: 3rem;\n }\n}\n\n.display-6 {\n font-size: calc(1.375rem + 1.5vw);\n font-weight: 300;\n line-height: 1.2;\n}\n@media (min-width: 1200px) {\n .display-6 {\n font-size: 2.5rem;\n }\n}\n\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline {\n padding-left: 0;\n list-style: none;\n}\n\n.list-inline-item {\n display: inline-block;\n}\n.list-inline-item:not(:last-child) {\n margin-right: 0.5rem;\n}\n\n.initialism {\n font-size: 0.875em;\n text-transform: uppercase;\n}\n\n.blockquote {\n margin-bottom: 1rem;\n font-size: 1.25rem;\n}\n.blockquote > :last-child {\n margin-bottom: 0;\n}\n\n.blockquote-footer {\n margin-top: -1rem;\n margin-bottom: 1rem;\n font-size: 0.875em;\n color: #6c757d;\n}\n.blockquote-footer::before {\n content: \"— \";\n}\n\n.img-fluid {\n max-width: 100%;\n height: auto;\n}\n\n.img-thumbnail {\n padding: 0.25rem;\n background-color: var(--bs-body-bg);\n border: var(--bs-border-width) solid var(--bs-border-color);\n border-radius: var(--bs-border-radius);\n max-width: 100%;\n height: auto;\n}\n\n.figure {\n display: inline-block;\n}\n\n.figure-img {\n margin-bottom: 0.5rem;\n line-height: 1;\n}\n\n.figure-caption {\n font-size: 0.875em;\n color: var(--bs-secondary-color);\n}\n\n.container,\n.container-fluid,\n.container-xxl,\n.container-xl,\n.container-lg,\n.container-md,\n.container-sm {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-right: auto;\n margin-left: auto;\n}\n\n@media (min-width: 576px) {\n .container-sm, .container {\n max-width: 540px;\n }\n}\n@media (min-width: 768px) {\n .container-md, .container-sm, .container {\n max-width: 720px;\n }\n}\n@media (min-width: 992px) {\n .container-lg, .container-md, .container-sm, .container {\n max-width: 960px;\n }\n}\n@media (min-width: 1200px) {\n .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1140px;\n }\n}\n@media (min-width: 1400px) {\n .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container {\n max-width: 1320px;\n }\n}\n:root {\n --bs-breakpoint-xs: 0;\n --bs-breakpoint-sm: 576px;\n --bs-breakpoint-md: 768px;\n --bs-breakpoint-lg: 992px;\n --bs-breakpoint-xl: 1200px;\n --bs-breakpoint-xxl: 1400px;\n}\n\n.row {\n --bs-gutter-x: 1.5rem;\n --bs-gutter-y: 0;\n display: flex;\n flex-wrap: wrap;\n margin-top: calc(-1 * var(--bs-gutter-y));\n margin-right: calc(-0.5 * var(--bs-gutter-x));\n margin-left: calc(-0.5 * var(--bs-gutter-x));\n}\n.row > * {\n flex-shrink: 0;\n width: 100%;\n max-width: 100%;\n padding-right: calc(var(--bs-gutter-x) * 0.5);\n padding-left: calc(var(--bs-gutter-x) * 0.5);\n margin-top: var(--bs-gutter-y);\n}\n\n.col {\n flex: 1 0 0%;\n}\n\n.row-cols-auto > * {\n flex: 0 0 auto;\n width: auto;\n}\n\n.row-cols-1 > * {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.row-cols-2 > * {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.row-cols-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n}\n\n.row-cols-4 > * {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.row-cols-5 > * {\n flex: 0 0 auto;\n width: 20%;\n}\n\n.row-cols-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n}\n\n.col-auto {\n flex: 0 0 auto;\n width: auto;\n}\n\n.col-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n}\n\n.col-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n}\n\n.col-3 {\n flex: 0 0 auto;\n width: 25%;\n}\n\n.col-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n}\n\n.col-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n}\n\n.col-6 {\n flex: 0 0 auto;\n width: 50%;\n}\n\n.col-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n}\n\n.col-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n}\n\n.col-9 {\n flex: 0 0 auto;\n width: 75%;\n}\n\n.col-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n}\n\n.col-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n}\n\n.col-12 {\n flex: 0 0 auto;\n width: 100%;\n}\n\n.offset-1 {\n margin-left: 8.33333333%;\n}\n\n.offset-2 {\n margin-left: 16.66666667%;\n}\n\n.offset-3 {\n margin-left: 25%;\n}\n\n.offset-4 {\n margin-left: 33.33333333%;\n}\n\n.offset-5 {\n margin-left: 41.66666667%;\n}\n\n.offset-6 {\n margin-left: 50%;\n}\n\n.offset-7 {\n margin-left: 58.33333333%;\n}\n\n.offset-8 {\n margin-left: 66.66666667%;\n}\n\n.offset-9 {\n margin-left: 75%;\n}\n\n.offset-10 {\n margin-left: 83.33333333%;\n}\n\n.offset-11 {\n margin-left: 91.66666667%;\n}\n\n.g-0,\n.gx-0 {\n --bs-gutter-x: 0;\n}\n\n.g-0,\n.gy-0 {\n --bs-gutter-y: 0;\n}\n\n.g-1,\n.gx-1 {\n --bs-gutter-x: 0.25rem;\n}\n\n.g-1,\n.gy-1 {\n --bs-gutter-y: 0.25rem;\n}\n\n.g-2,\n.gx-2 {\n --bs-gutter-x: 0.5rem;\n}\n\n.g-2,\n.gy-2 {\n --bs-gutter-y: 0.5rem;\n}\n\n.g-3,\n.gx-3 {\n --bs-gutter-x: 1rem;\n}\n\n.g-3,\n.gy-3 {\n --bs-gutter-y: 1rem;\n}\n\n.g-4,\n.gx-4 {\n --bs-gutter-x: 1.5rem;\n}\n\n.g-4,\n.gy-4 {\n --bs-gutter-y: 1.5rem;\n}\n\n.g-5,\n.gx-5 {\n --bs-gutter-x: 3rem;\n}\n\n.g-5,\n.gy-5 {\n --bs-gutter-y: 3rem;\n}\n\n@media (min-width: 576px) {\n .col-sm {\n flex: 1 0 0%;\n }\n .row-cols-sm-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-sm-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-sm-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-sm-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-sm-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-sm-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-sm-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-sm-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-sm-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-sm-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-sm-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-sm-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-sm-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-sm-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-sm-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-sm-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-sm-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-sm-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-sm-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-sm-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-sm-0 {\n margin-left: 0;\n }\n .offset-sm-1 {\n margin-left: 8.33333333%;\n }\n .offset-sm-2 {\n margin-left: 16.66666667%;\n }\n .offset-sm-3 {\n margin-left: 25%;\n }\n .offset-sm-4 {\n margin-left: 33.33333333%;\n }\n .offset-sm-5 {\n margin-left: 41.66666667%;\n }\n .offset-sm-6 {\n margin-left: 50%;\n }\n .offset-sm-7 {\n margin-left: 58.33333333%;\n }\n .offset-sm-8 {\n margin-left: 66.66666667%;\n }\n .offset-sm-9 {\n margin-left: 75%;\n }\n .offset-sm-10 {\n margin-left: 83.33333333%;\n }\n .offset-sm-11 {\n margin-left: 91.66666667%;\n }\n .g-sm-0,\n .gx-sm-0 {\n --bs-gutter-x: 0;\n }\n .g-sm-0,\n .gy-sm-0 {\n --bs-gutter-y: 0;\n }\n .g-sm-1,\n .gx-sm-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-sm-1,\n .gy-sm-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-sm-2,\n .gx-sm-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-sm-2,\n .gy-sm-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-sm-3,\n .gx-sm-3 {\n --bs-gutter-x: 1rem;\n }\n .g-sm-3,\n .gy-sm-3 {\n --bs-gutter-y: 1rem;\n }\n .g-sm-4,\n .gx-sm-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-sm-4,\n .gy-sm-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-sm-5,\n .gx-sm-5 {\n --bs-gutter-x: 3rem;\n }\n .g-sm-5,\n .gy-sm-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 768px) {\n .col-md {\n flex: 1 0 0%;\n }\n .row-cols-md-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-md-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-md-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-md-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-md-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-md-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-md-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-md-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-md-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-md-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-md-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-md-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-md-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-md-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-md-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-md-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-md-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-md-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-md-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-md-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-md-0 {\n margin-left: 0;\n }\n .offset-md-1 {\n margin-left: 8.33333333%;\n }\n .offset-md-2 {\n margin-left: 16.66666667%;\n }\n .offset-md-3 {\n margin-left: 25%;\n }\n .offset-md-4 {\n margin-left: 33.33333333%;\n }\n .offset-md-5 {\n margin-left: 41.66666667%;\n }\n .offset-md-6 {\n margin-left: 50%;\n }\n .offset-md-7 {\n margin-left: 58.33333333%;\n }\n .offset-md-8 {\n margin-left: 66.66666667%;\n }\n .offset-md-9 {\n margin-left: 75%;\n }\n .offset-md-10 {\n margin-left: 83.33333333%;\n }\n .offset-md-11 {\n margin-left: 91.66666667%;\n }\n .g-md-0,\n .gx-md-0 {\n --bs-gutter-x: 0;\n }\n .g-md-0,\n .gy-md-0 {\n --bs-gutter-y: 0;\n }\n .g-md-1,\n .gx-md-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-md-1,\n .gy-md-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-md-2,\n .gx-md-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-md-2,\n .gy-md-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-md-3,\n .gx-md-3 {\n --bs-gutter-x: 1rem;\n }\n .g-md-3,\n .gy-md-3 {\n --bs-gutter-y: 1rem;\n }\n .g-md-4,\n .gx-md-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-md-4,\n .gy-md-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-md-5,\n .gx-md-5 {\n --bs-gutter-x: 3rem;\n }\n .g-md-5,\n .gy-md-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 992px) {\n .col-lg {\n flex: 1 0 0%;\n }\n .row-cols-lg-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-lg-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-lg-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-lg-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-lg-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-lg-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-lg-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-lg-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-lg-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-lg-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-lg-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-lg-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-lg-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-lg-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-lg-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-lg-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-lg-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-lg-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-lg-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-lg-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-lg-0 {\n margin-left: 0;\n }\n .offset-lg-1 {\n margin-left: 8.33333333%;\n }\n .offset-lg-2 {\n margin-left: 16.66666667%;\n }\n .offset-lg-3 {\n margin-left: 25%;\n }\n .offset-lg-4 {\n margin-left: 33.33333333%;\n }\n .offset-lg-5 {\n margin-left: 41.66666667%;\n }\n .offset-lg-6 {\n margin-left: 50%;\n }\n .offset-lg-7 {\n margin-left: 58.33333333%;\n }\n .offset-lg-8 {\n margin-left: 66.66666667%;\n }\n .offset-lg-9 {\n margin-left: 75%;\n }\n .offset-lg-10 {\n margin-left: 83.33333333%;\n }\n .offset-lg-11 {\n margin-left: 91.66666667%;\n }\n .g-lg-0,\n .gx-lg-0 {\n --bs-gutter-x: 0;\n }\n .g-lg-0,\n .gy-lg-0 {\n --bs-gutter-y: 0;\n }\n .g-lg-1,\n .gx-lg-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-lg-1,\n .gy-lg-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-lg-2,\n .gx-lg-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-lg-2,\n .gy-lg-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-lg-3,\n .gx-lg-3 {\n --bs-gutter-x: 1rem;\n }\n .g-lg-3,\n .gy-lg-3 {\n --bs-gutter-y: 1rem;\n }\n .g-lg-4,\n .gx-lg-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-lg-4,\n .gy-lg-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-lg-5,\n .gx-lg-5 {\n --bs-gutter-x: 3rem;\n }\n .g-lg-5,\n .gy-lg-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1200px) {\n .col-xl {\n flex: 1 0 0%;\n }\n .row-cols-xl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xl-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-xl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xl-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-xl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xl-0 {\n margin-left: 0;\n }\n .offset-xl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xl-3 {\n margin-left: 25%;\n }\n .offset-xl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xl-6 {\n margin-left: 50%;\n }\n .offset-xl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xl-9 {\n margin-left: 75%;\n }\n .offset-xl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xl-11 {\n margin-left: 91.66666667%;\n }\n .g-xl-0,\n .gx-xl-0 {\n --bs-gutter-x: 0;\n }\n .g-xl-0,\n .gy-xl-0 {\n --bs-gutter-y: 0;\n }\n .g-xl-1,\n .gx-xl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xl-1,\n .gy-xl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xl-2,\n .gx-xl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xl-2,\n .gy-xl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xl-3,\n .gx-xl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xl-3,\n .gy-xl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xl-4,\n .gx-xl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xl-4,\n .gy-xl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xl-5,\n .gx-xl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xl-5,\n .gy-xl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n@media (min-width: 1400px) {\n .col-xxl {\n flex: 1 0 0%;\n }\n .row-cols-xxl-auto > * {\n flex: 0 0 auto;\n width: auto;\n }\n .row-cols-xxl-1 > * {\n flex: 0 0 auto;\n width: 100%;\n }\n .row-cols-xxl-2 > * {\n flex: 0 0 auto;\n width: 50%;\n }\n .row-cols-xxl-3 > * {\n flex: 0 0 auto;\n width: 33.3333333333%;\n }\n .row-cols-xxl-4 > * {\n flex: 0 0 auto;\n width: 25%;\n }\n .row-cols-xxl-5 > * {\n flex: 0 0 auto;\n width: 20%;\n }\n .row-cols-xxl-6 > * {\n flex: 0 0 auto;\n width: 16.6666666667%;\n }\n .col-xxl-auto {\n flex: 0 0 auto;\n width: auto;\n }\n .col-xxl-1 {\n flex: 0 0 auto;\n width: 8.33333333%;\n }\n .col-xxl-2 {\n flex: 0 0 auto;\n width: 16.66666667%;\n }\n .col-xxl-3 {\n flex: 0 0 auto;\n width: 25%;\n }\n .col-xxl-4 {\n flex: 0 0 auto;\n width: 33.33333333%;\n }\n .col-xxl-5 {\n flex: 0 0 auto;\n width: 41.66666667%;\n }\n .col-xxl-6 {\n flex: 0 0 auto;\n width: 50%;\n }\n .col-xxl-7 {\n flex: 0 0 auto;\n width: 58.33333333%;\n }\n .col-xxl-8 {\n flex: 0 0 auto;\n width: 66.66666667%;\n }\n .col-xxl-9 {\n flex: 0 0 auto;\n width: 75%;\n }\n .col-xxl-10 {\n flex: 0 0 auto;\n width: 83.33333333%;\n }\n .col-xxl-11 {\n flex: 0 0 auto;\n width: 91.66666667%;\n }\n .col-xxl-12 {\n flex: 0 0 auto;\n width: 100%;\n }\n .offset-xxl-0 {\n margin-left: 0;\n }\n .offset-xxl-1 {\n margin-left: 8.33333333%;\n }\n .offset-xxl-2 {\n margin-left: 16.66666667%;\n }\n .offset-xxl-3 {\n margin-left: 25%;\n }\n .offset-xxl-4 {\n margin-left: 33.33333333%;\n }\n .offset-xxl-5 {\n margin-left: 41.66666667%;\n }\n .offset-xxl-6 {\n margin-left: 50%;\n }\n .offset-xxl-7 {\n margin-left: 58.33333333%;\n }\n .offset-xxl-8 {\n margin-left: 66.66666667%;\n }\n .offset-xxl-9 {\n margin-left: 75%;\n }\n .offset-xxl-10 {\n margin-left: 83.33333333%;\n }\n .offset-xxl-11 {\n margin-left: 91.66666667%;\n }\n .g-xxl-0,\n .gx-xxl-0 {\n --bs-gutter-x: 0;\n }\n .g-xxl-0,\n .gy-xxl-0 {\n --bs-gutter-y: 0;\n }\n .g-xxl-1,\n .gx-xxl-1 {\n --bs-gutter-x: 0.25rem;\n }\n .g-xxl-1,\n .gy-xxl-1 {\n --bs-gutter-y: 0.25rem;\n }\n .g-xxl-2,\n .gx-xxl-2 {\n --bs-gutter-x: 0.5rem;\n }\n .g-xxl-2,\n .gy-xxl-2 {\n --bs-gutter-y: 0.5rem;\n }\n .g-xxl-3,\n .gx-xxl-3 {\n --bs-gutter-x: 1rem;\n }\n .g-xxl-3,\n .gy-xxl-3 {\n --bs-gutter-y: 1rem;\n }\n .g-xxl-4,\n .gx-xxl-4 {\n --bs-gutter-x: 1.5rem;\n }\n .g-xxl-4,\n .gy-xxl-4 {\n --bs-gutter-y: 1.5rem;\n }\n .g-xxl-5,\n .gx-xxl-5 {\n --bs-gutter-x: 3rem;\n }\n .g-xxl-5,\n .gy-xxl-5 {\n --bs-gutter-y: 3rem;\n }\n}\n.table {\n --bs-table-color-type: initial;\n --bs-table-bg-type: initial;\n --bs-table-color-state: initial;\n --bs-table-bg-state: initial;\n --bs-table-color: var(--bs-body-color);\n --bs-table-bg: var(--bs-body-bg);\n --bs-table-border-color: var(--bs-border-color);\n --bs-table-accent-bg: transparent;\n --bs-table-striped-color: var(--bs-body-color);\n --bs-table-striped-bg: rgba(0, 0, 0, 0.05);\n --bs-table-active-color: var(--bs-body-color);\n --bs-table-active-bg: rgba(0, 0, 0, 0.1);\n --bs-table-hover-color: var(--bs-body-color);\n --bs-table-hover-bg: rgba(0, 0, 0, 0.075);\n width: 100%;\n margin-bottom: 1rem;\n vertical-align: top;\n border-color: var(--bs-table-border-color);\n}\n.table > :not(caption) > * > * {\n padding: 0.5rem 0.5rem;\n color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color)));\n background-color: var(--bs-table-bg);\n border-bottom-width: var(--bs-border-width);\n box-shadow: inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg)));\n}\n.table > tbody {\n vertical-align: inherit;\n}\n.table > thead {\n vertical-align: bottom;\n}\n\n.table-group-divider {\n border-top: calc(var(--bs-border-width) * 2) solid currentcolor;\n}\n\n.caption-top {\n caption-side: top;\n}\n\n.table-sm > :not(caption) > * > * {\n padding: 0.25rem 0.25rem;\n}\n\n.table-bordered > :not(caption) > * {\n border-width: var(--bs-border-width) 0;\n}\n.table-bordered > :not(caption) > * > * {\n border-width: 0 var(--bs-border-width);\n}\n\n.table-borderless > :not(caption) > * > * {\n border-bottom-width: 0;\n}\n.table-borderless > :not(:first-child) {\n border-top-width: 0;\n}\n\n.table-striped > tbody > tr:nth-of-type(odd) > * {\n --bs-table-color-type: var(--bs-table-striped-color);\n --bs-table-bg-type: var(--bs-table-striped-bg);\n}\n\n.table-striped-columns > :not(caption) > tr > :nth-child(even) {\n --bs-table-color-type: var(--bs-table-striped-color);\n --bs-table-bg-type: var(--bs-table-striped-bg);\n}\n\n.table-active {\n --bs-table-color-state: var(--bs-table-active-color);\n --bs-table-bg-state: var(--bs-table-active-bg);\n}\n\n.table-hover > tbody > tr:hover > * {\n --bs-table-color-state: var(--bs-table-hover-color);\n --bs-table-bg-state: var(--bs-table-hover-bg);\n}\n\n.table-primary {\n --bs-table-color: #000;\n --bs-table-bg: #cfe2ff;\n --bs-table-border-color: #bacbe6;\n --bs-table-striped-bg: #c5d7f2;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #bacbe6;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #bfd1ec;\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-secondary {\n --bs-table-color: #000;\n --bs-table-bg: #e2e3e5;\n --bs-table-border-color: #cbccce;\n --bs-table-striped-bg: #d7d8da;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #cbccce;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #d1d2d4;\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-success {\n --bs-table-color: #000;\n --bs-table-bg: #d1e7dd;\n --bs-table-border-color: #bcd0c7;\n --bs-table-striped-bg: #c7dbd2;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #bcd0c7;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #c1d6cc;\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-info {\n --bs-table-color: #000;\n --bs-table-bg: #cff4fc;\n --bs-table-border-color: #badce3;\n --bs-table-striped-bg: #c5e8ef;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #badce3;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #bfe2e9;\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-warning {\n --bs-table-color: #000;\n --bs-table-bg: #fff3cd;\n --bs-table-border-color: #e6dbb9;\n --bs-table-striped-bg: #f2e7c3;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #e6dbb9;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #ece1be;\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-danger {\n --bs-table-color: #000;\n --bs-table-bg: #f8d7da;\n --bs-table-border-color: #dfc2c4;\n --bs-table-striped-bg: #eccccf;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #dfc2c4;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #e5c7ca;\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-light {\n --bs-table-color: #000;\n --bs-table-bg: #f8f9fa;\n --bs-table-border-color: #dfe0e1;\n --bs-table-striped-bg: #ecedee;\n --bs-table-striped-color: #000;\n --bs-table-active-bg: #dfe0e1;\n --bs-table-active-color: #000;\n --bs-table-hover-bg: #e5e6e7;\n --bs-table-hover-color: #000;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-dark {\n --bs-table-color: #fff;\n --bs-table-bg: #212529;\n --bs-table-border-color: #373b3e;\n --bs-table-striped-bg: #2c3034;\n --bs-table-striped-color: #fff;\n --bs-table-active-bg: #373b3e;\n --bs-table-active-color: #fff;\n --bs-table-hover-bg: #323539;\n --bs-table-hover-color: #fff;\n color: var(--bs-table-color);\n border-color: var(--bs-table-border-color);\n}\n\n.table-responsive {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n}\n\n@media (max-width: 575.98px) {\n .table-responsive-sm {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 767.98px) {\n .table-responsive-md {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 991.98px) {\n .table-responsive-lg {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 1199.98px) {\n .table-responsive-xl {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n@media (max-width: 1399.98px) {\n .table-responsive-xxl {\n overflow-x: auto;\n -webkit-overflow-scrolling: touch;\n }\n}\n.form-label {\n margin-bottom: 0.5rem;\n}\n\n.col-form-label {\n padding-top: calc(0.375rem + var(--bs-border-width));\n padding-bottom: calc(0.375rem + var(--bs-border-width));\n margin-bottom: 0;\n font-size: inherit;\n line-height: 1.5;\n}\n\n.col-form-label-lg {\n padding-top: calc(0.5rem + var(--bs-border-width));\n padding-bottom: calc(0.5rem + var(--bs-border-width));\n font-size: 1.25rem;\n}\n\n.col-form-label-sm {\n padding-top: calc(0.25rem + var(--bs-border-width));\n padding-bottom: calc(0.25rem + var(--bs-border-width));\n font-size: 0.875rem;\n}\n\n.form-text {\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: var(--bs-secondary-color);\n}\n\n.form-control {\n display: block;\n width: 100%;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: var(--bs-body-color);\n background-color: var(--bs-body-bg);\n background-clip: padding-box;\n border: var(--bs-border-width) solid var(--bs-border-color);\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n border-radius: var(--bs-border-radius);\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-control {\n transition: none;\n }\n}\n.form-control[type=file] {\n overflow: hidden;\n}\n.form-control[type=file]:not(:disabled):not([readonly]) {\n cursor: pointer;\n}\n.form-control:focus {\n color: var(--bs-body-color);\n background-color: var(--bs-body-bg);\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-control::-webkit-date-and-time-value {\n min-width: 85px;\n height: 1.5em;\n margin: 0;\n}\n.form-control::-webkit-datetime-edit {\n display: block;\n padding: 0;\n}\n.form-control::-moz-placeholder {\n color: var(--bs-secondary-color);\n opacity: 1;\n}\n.form-control::placeholder {\n color: var(--bs-secondary-color);\n opacity: 1;\n}\n.form-control:disabled {\n background-color: var(--bs-secondary-bg);\n opacity: 1;\n}\n.form-control::-webkit-file-upload-button {\n padding: 0.375rem 0.75rem;\n margin: -0.375rem -0.75rem;\n -webkit-margin-end: 0.75rem;\n margin-inline-end: 0.75rem;\n color: var(--bs-body-color);\n background-color: var(--bs-tertiary-bg);\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: var(--bs-border-width);\n border-radius: 0;\n -webkit-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;\n 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;\n}\n.form-control::file-selector-button {\n padding: 0.375rem 0.75rem;\n margin: -0.375rem -0.75rem;\n -webkit-margin-end: 0.75rem;\n margin-inline-end: 0.75rem;\n color: var(--bs-body-color);\n background-color: var(--bs-tertiary-bg);\n pointer-events: none;\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n border-inline-end-width: var(--bs-border-width);\n border-radius: 0;\n 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;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-control::-webkit-file-upload-button {\n -webkit-transition: none;\n transition: none;\n }\n .form-control::file-selector-button {\n transition: none;\n }\n}\n.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button {\n background-color: var(--bs-secondary-bg);\n}\n.form-control:hover:not(:disabled):not([readonly])::file-selector-button {\n background-color: var(--bs-secondary-bg);\n}\n\n.form-control-plaintext {\n display: block;\n width: 100%;\n padding: 0.375rem 0;\n margin-bottom: 0;\n line-height: 1.5;\n color: var(--bs-body-color);\n background-color: transparent;\n border: solid transparent;\n border-width: var(--bs-border-width) 0;\n}\n.form-control-plaintext:focus {\n outline: 0;\n}\n.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg {\n padding-right: 0;\n padding-left: 0;\n}\n\n.form-control-sm {\n min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2));\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n border-radius: var(--bs-border-radius-sm);\n}\n.form-control-sm::-webkit-file-upload-button {\n padding: 0.25rem 0.5rem;\n margin: -0.25rem -0.5rem;\n -webkit-margin-end: 0.5rem;\n margin-inline-end: 0.5rem;\n}\n.form-control-sm::file-selector-button {\n padding: 0.25rem 0.5rem;\n margin: -0.25rem -0.5rem;\n -webkit-margin-end: 0.5rem;\n margin-inline-end: 0.5rem;\n}\n\n.form-control-lg {\n min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n border-radius: var(--bs-border-radius-lg);\n}\n.form-control-lg::-webkit-file-upload-button {\n padding: 0.5rem 1rem;\n margin: -0.5rem -1rem;\n -webkit-margin-end: 1rem;\n margin-inline-end: 1rem;\n}\n.form-control-lg::file-selector-button {\n padding: 0.5rem 1rem;\n margin: -0.5rem -1rem;\n -webkit-margin-end: 1rem;\n margin-inline-end: 1rem;\n}\n\ntextarea.form-control {\n min-height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2));\n}\ntextarea.form-control-sm {\n min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2));\n}\ntextarea.form-control-lg {\n min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));\n}\n\n.form-control-color {\n width: 3rem;\n height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2));\n padding: 0.375rem;\n}\n.form-control-color:not(:disabled):not([readonly]) {\n cursor: pointer;\n}\n.form-control-color::-moz-color-swatch {\n border: 0 !important;\n border-radius: var(--bs-border-radius);\n}\n.form-control-color::-webkit-color-swatch {\n border: 0 !important;\n border-radius: var(--bs-border-radius);\n}\n.form-control-color.form-control-sm {\n height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2));\n}\n.form-control-color.form-control-lg {\n height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2));\n}\n\n.form-select {\n --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\");\n display: block;\n width: 100%;\n padding: 0.375rem 2.25rem 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: var(--bs-body-color);\n background-color: var(--bs-body-bg);\n background-image: var(--bs-form-select-bg-img), var(--bs-form-select-bg-icon, none);\n background-repeat: no-repeat;\n background-position: right 0.75rem center;\n background-size: 16px 12px;\n border: var(--bs-border-width) solid var(--bs-border-color);\n border-radius: var(--bs-border-radius);\n transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-select {\n transition: none;\n }\n}\n.form-select:focus {\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-select[multiple], .form-select[size]:not([size=\"1\"]) {\n padding-right: 0.75rem;\n background-image: none;\n}\n.form-select:disabled {\n background-color: var(--bs-secondary-bg);\n}\n.form-select:-moz-focusring {\n color: transparent;\n text-shadow: 0 0 0 var(--bs-body-color);\n}\n\n.form-select-sm {\n padding-top: 0.25rem;\n padding-bottom: 0.25rem;\n padding-left: 0.5rem;\n font-size: 0.875rem;\n border-radius: var(--bs-border-radius-sm);\n}\n\n.form-select-lg {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n padding-left: 1rem;\n font-size: 1.25rem;\n border-radius: var(--bs-border-radius-lg);\n}\n\n[data-bs-theme=dark] .form-select {\n --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='%23adb5bd' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e\");\n}\n\n.form-check {\n display: block;\n min-height: 1.5rem;\n padding-left: 1.5em;\n margin-bottom: 0.125rem;\n}\n.form-check .form-check-input {\n float: left;\n margin-left: -1.5em;\n}\n\n.form-check-reverse {\n padding-right: 1.5em;\n padding-left: 0;\n text-align: right;\n}\n.form-check-reverse .form-check-input {\n float: right;\n margin-right: -1.5em;\n margin-left: 0;\n}\n\n.form-check-input {\n --bs-form-check-bg: var(--bs-body-bg);\n width: 1em;\n height: 1em;\n margin-top: 0.25em;\n vertical-align: top;\n background-color: var(--bs-form-check-bg);\n background-image: var(--bs-form-check-bg-image);\n background-repeat: no-repeat;\n background-position: center;\n background-size: contain;\n border: var(--bs-border-width) solid var(--bs-border-color);\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n -webkit-print-color-adjust: exact;\n color-adjust: exact;\n print-color-adjust: exact;\n}\n.form-check-input[type=checkbox] {\n border-radius: 0.25em;\n}\n.form-check-input[type=radio] {\n border-radius: 50%;\n}\n.form-check-input:active {\n filter: brightness(90%);\n}\n.form-check-input:focus {\n border-color: #86b7fe;\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-check-input:checked {\n background-color: #0d6efd;\n border-color: #0d6efd;\n}\n.form-check-input:checked[type=checkbox] {\n --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\");\n}\n.form-check-input:checked[type=radio] {\n --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\");\n}\n.form-check-input[type=checkbox]:indeterminate {\n background-color: #0d6efd;\n border-color: #0d6efd;\n --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\");\n}\n.form-check-input:disabled {\n pointer-events: none;\n filter: none;\n opacity: 0.5;\n}\n.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label {\n cursor: default;\n opacity: 0.5;\n}\n\n.form-switch {\n padding-left: 2.5em;\n}\n.form-switch .form-check-input {\n --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\");\n width: 2em;\n margin-left: -2.5em;\n background-image: var(--bs-form-switch-bg);\n background-position: left center;\n border-radius: 2em;\n transition: background-position 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-switch .form-check-input {\n transition: none;\n }\n}\n.form-switch .form-check-input:focus {\n --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='%2386b7fe'/%3e%3c/svg%3e\");\n}\n.form-switch .form-check-input:checked {\n background-position: right center;\n --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\");\n}\n.form-switch.form-check-reverse {\n padding-right: 2.5em;\n padding-left: 0;\n}\n.form-switch.form-check-reverse .form-check-input {\n margin-right: -2.5em;\n margin-left: 0;\n}\n\n.form-check-inline {\n display: inline-block;\n margin-right: 1rem;\n}\n\n.btn-check {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.btn-check[disabled] + .btn, .btn-check:disabled + .btn {\n pointer-events: none;\n filter: none;\n opacity: 0.65;\n}\n\n[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus) {\n --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\");\n}\n\n.form-range {\n width: 100%;\n height: 1.5rem;\n padding: 0;\n background-color: transparent;\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n.form-range:focus {\n outline: 0;\n}\n.form-range:focus::-webkit-slider-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-range:focus::-moz-range-thumb {\n box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.form-range::-moz-focus-outer {\n border: 0;\n}\n.form-range::-webkit-slider-thumb {\n width: 1rem;\n height: 1rem;\n margin-top: -0.25rem;\n background-color: #0d6efd;\n border: 0;\n border-radius: 1rem;\n -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -webkit-appearance: none;\n appearance: none;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-range::-webkit-slider-thumb {\n -webkit-transition: none;\n transition: none;\n }\n}\n.form-range::-webkit-slider-thumb:active {\n background-color: #b6d4fe;\n}\n.form-range::-webkit-slider-runnable-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: var(--bs-tertiary-bg);\n border-color: transparent;\n border-radius: 1rem;\n}\n.form-range::-moz-range-thumb {\n width: 1rem;\n height: 1rem;\n background-color: #0d6efd;\n border: 0;\n border-radius: 1rem;\n -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;\n -moz-appearance: none;\n appearance: none;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-range::-moz-range-thumb {\n -moz-transition: none;\n transition: none;\n }\n}\n.form-range::-moz-range-thumb:active {\n background-color: #b6d4fe;\n}\n.form-range::-moz-range-track {\n width: 100%;\n height: 0.5rem;\n color: transparent;\n cursor: pointer;\n background-color: var(--bs-tertiary-bg);\n border-color: transparent;\n border-radius: 1rem;\n}\n.form-range:disabled {\n pointer-events: none;\n}\n.form-range:disabled::-webkit-slider-thumb {\n background-color: var(--bs-secondary-color);\n}\n.form-range:disabled::-moz-range-thumb {\n background-color: var(--bs-secondary-color);\n}\n\n.form-floating {\n position: relative;\n}\n.form-floating > .form-control,\n.form-floating > .form-control-plaintext,\n.form-floating > .form-select {\n height: calc(3.5rem + calc(var(--bs-border-width) * 2));\n min-height: calc(3.5rem + calc(var(--bs-border-width) * 2));\n line-height: 1.25;\n}\n.form-floating > label {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 2;\n height: 100%;\n padding: 1rem 0.75rem;\n overflow: hidden;\n text-align: start;\n text-overflow: ellipsis;\n white-space: nowrap;\n pointer-events: none;\n border: var(--bs-border-width) solid transparent;\n transform-origin: 0 0;\n transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .form-floating > label {\n transition: none;\n }\n}\n.form-floating > .form-control,\n.form-floating > .form-control-plaintext {\n padding: 1rem 0.75rem;\n}\n.form-floating > .form-control::-moz-placeholder, .form-floating > .form-control-plaintext::-moz-placeholder {\n color: transparent;\n}\n.form-floating > .form-control::placeholder,\n.form-floating > .form-control-plaintext::placeholder {\n color: transparent;\n}\n.form-floating > .form-control:not(:-moz-placeholder-shown), .form-floating > .form-control-plaintext:not(:-moz-placeholder-shown) {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown),\n.form-floating > .form-control-plaintext:focus,\n.form-floating > .form-control-plaintext:not(:placeholder-shown) {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:-webkit-autofill,\n.form-floating > .form-control-plaintext:-webkit-autofill {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n}\n.form-floating > .form-select {\n padding-top: 1.625rem;\n padding-bottom: 0.625rem;\n}\n.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label {\n color: rgba(var(--bs-body-color-rgb), 0.65);\n transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);\n}\n.form-floating > .form-control:focus ~ label,\n.form-floating > .form-control:not(:placeholder-shown) ~ label,\n.form-floating > .form-control-plaintext ~ label,\n.form-floating > .form-select ~ label {\n color: rgba(var(--bs-body-color-rgb), 0.65);\n transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);\n}\n.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label::after {\n position: absolute;\n inset: 1rem 0.375rem;\n z-index: -1;\n height: 1.5em;\n content: \"\";\n background-color: var(--bs-body-bg);\n border-radius: var(--bs-border-radius);\n}\n.form-floating > .form-control:focus ~ label::after,\n.form-floating > .form-control:not(:placeholder-shown) ~ label::after,\n.form-floating > .form-control-plaintext ~ label::after,\n.form-floating > .form-select ~ label::after {\n position: absolute;\n inset: 1rem 0.375rem;\n z-index: -1;\n height: 1.5em;\n content: \"\";\n background-color: var(--bs-body-bg);\n border-radius: var(--bs-border-radius);\n}\n.form-floating > .form-control:-webkit-autofill ~ label {\n color: rgba(var(--bs-body-color-rgb), 0.65);\n transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem);\n}\n.form-floating > .form-control-plaintext ~ label {\n border-width: var(--bs-border-width) 0;\n}\n.form-floating > :disabled ~ label {\n color: #6c757d;\n}\n.form-floating > :disabled ~ label::after {\n background-color: var(--bs-secondary-bg);\n}\n\n.input-group {\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: stretch;\n width: 100%;\n}\n.input-group > .form-control,\n.input-group > .form-select,\n.input-group > .form-floating {\n position: relative;\n flex: 1 1 auto;\n width: 1%;\n min-width: 0;\n}\n.input-group > .form-control:focus,\n.input-group > .form-select:focus,\n.input-group > .form-floating:focus-within {\n z-index: 5;\n}\n.input-group .btn {\n position: relative;\n z-index: 2;\n}\n.input-group .btn:focus {\n z-index: 5;\n}\n\n.input-group-text {\n display: flex;\n align-items: center;\n padding: 0.375rem 0.75rem;\n font-size: 1rem;\n font-weight: 400;\n line-height: 1.5;\n color: var(--bs-body-color);\n text-align: center;\n white-space: nowrap;\n background-color: var(--bs-tertiary-bg);\n border: var(--bs-border-width) solid var(--bs-border-color);\n border-radius: var(--bs-border-radius);\n}\n\n.input-group-lg > .form-control,\n.input-group-lg > .form-select,\n.input-group-lg > .input-group-text,\n.input-group-lg > .btn {\n padding: 0.5rem 1rem;\n font-size: 1.25rem;\n border-radius: var(--bs-border-radius-lg);\n}\n\n.input-group-sm > .form-control,\n.input-group-sm > .form-select,\n.input-group-sm > .input-group-text,\n.input-group-sm > .btn {\n padding: 0.25rem 0.5rem;\n font-size: 0.875rem;\n border-radius: var(--bs-border-radius-sm);\n}\n\n.input-group-lg > .form-select,\n.input-group-sm > .form-select {\n padding-right: 3rem;\n}\n\n.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),\n.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3),\n.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control,\n.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating),\n.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4),\n.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control,\n.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) {\n margin-left: calc(var(--bs-border-width) * -1);\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.input-group > .form-floating:not(:first-child) > .form-control,\n.input-group > .form-floating:not(:first-child) > .form-select {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.valid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: var(--bs-form-valid-color);\n}\n\n.valid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: 0.1rem;\n font-size: 0.875rem;\n color: #fff;\n background-color: var(--bs-success);\n border-radius: var(--bs-border-radius);\n}\n\n.was-validated :valid ~ .valid-feedback,\n.was-validated :valid ~ .valid-tooltip,\n.is-valid ~ .valid-feedback,\n.is-valid ~ .valid-tooltip {\n display: block;\n}\n\n.was-validated .form-control:valid, .form-control.is-valid {\n border-color: var(--bs-form-valid-border-color);\n padding-right: calc(1.5em + 0.75rem);\n background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' 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\");\n background-repeat: no-repeat;\n background-position: right calc(0.375em + 0.1875rem) center;\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-control:valid:focus, .form-control.is-valid:focus {\n border-color: var(--bs-form-valid-border-color);\n box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25);\n}\n\n.was-validated textarea.form-control:valid, textarea.form-control.is-valid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .form-select:valid, .form-select.is-valid {\n border-color: var(--bs-form-valid-border-color);\n}\n.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size=\"1\"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size=\"1\"] {\n --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='%23198754' 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\");\n padding-right: 4.125rem;\n background-position: right 0.75rem center, center right 2.25rem;\n background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-select:valid:focus, .form-select.is-valid:focus {\n border-color: var(--bs-form-valid-border-color);\n box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25);\n}\n\n.was-validated .form-control-color:valid, .form-control-color.is-valid {\n width: calc(3rem + calc(1.5em + 0.75rem));\n}\n\n.was-validated .form-check-input:valid, .form-check-input.is-valid {\n border-color: var(--bs-form-valid-border-color);\n}\n.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked {\n background-color: var(--bs-form-valid-color);\n}\n.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus {\n box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25);\n}\n.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label {\n color: var(--bs-form-valid-color);\n}\n\n.form-check-inline .form-check-input ~ .valid-feedback {\n margin-left: 0.5em;\n}\n\n.was-validated .input-group > .form-control:not(:focus):valid, .input-group > .form-control:not(:focus).is-valid,\n.was-validated .input-group > .form-select:not(:focus):valid,\n.input-group > .form-select:not(:focus).is-valid,\n.was-validated .input-group > .form-floating:not(:focus-within):valid,\n.input-group > .form-floating:not(:focus-within).is-valid {\n z-index: 3;\n}\n\n.invalid-feedback {\n display: none;\n width: 100%;\n margin-top: 0.25rem;\n font-size: 0.875em;\n color: var(--bs-form-invalid-color);\n}\n\n.invalid-tooltip {\n position: absolute;\n top: 100%;\n z-index: 5;\n display: none;\n max-width: 100%;\n padding: 0.25rem 0.5rem;\n margin-top: 0.1rem;\n font-size: 0.875rem;\n color: #fff;\n background-color: var(--bs-danger);\n border-radius: var(--bs-border-radius);\n}\n\n.was-validated :invalid ~ .invalid-feedback,\n.was-validated :invalid ~ .invalid-tooltip,\n.is-invalid ~ .invalid-feedback,\n.is-invalid ~ .invalid-tooltip {\n display: block;\n}\n\n.was-validated .form-control:invalid, .form-control.is-invalid {\n border-color: var(--bs-form-invalid-border-color);\n padding-right: calc(1.5em + 0.75rem);\n 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='%23dc3545'%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='%23dc3545' stroke='none'/%3e%3c/svg%3e\");\n background-repeat: no-repeat;\n background-position: right calc(0.375em + 0.1875rem) center;\n background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus {\n border-color: var(--bs-form-invalid-border-color);\n box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25);\n}\n\n.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid {\n padding-right: calc(1.5em + 0.75rem);\n background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem);\n}\n\n.was-validated .form-select:invalid, .form-select.is-invalid {\n border-color: var(--bs-form-invalid-border-color);\n}\n.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size=\"1\"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size=\"1\"] {\n --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='%23dc3545'%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='%23dc3545' stroke='none'/%3e%3c/svg%3e\");\n padding-right: 4.125rem;\n background-position: right 0.75rem center, center right 2.25rem;\n background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem);\n}\n.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus {\n border-color: var(--bs-form-invalid-border-color);\n box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25);\n}\n\n.was-validated .form-control-color:invalid, .form-control-color.is-invalid {\n width: calc(3rem + calc(1.5em + 0.75rem));\n}\n\n.was-validated .form-check-input:invalid, .form-check-input.is-invalid {\n border-color: var(--bs-form-invalid-border-color);\n}\n.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked {\n background-color: var(--bs-form-invalid-color);\n}\n.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus {\n box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25);\n}\n.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label {\n color: var(--bs-form-invalid-color);\n}\n\n.form-check-inline .form-check-input ~ .invalid-feedback {\n margin-left: 0.5em;\n}\n\n.was-validated .input-group > .form-control:not(:focus):invalid, .input-group > .form-control:not(:focus).is-invalid,\n.was-validated .input-group > .form-select:not(:focus):invalid,\n.input-group > .form-select:not(:focus).is-invalid,\n.was-validated .input-group > .form-floating:not(:focus-within):invalid,\n.input-group > .form-floating:not(:focus-within).is-invalid {\n z-index: 4;\n}\n\n.btn {\n --bs-btn-padding-x: 0.75rem;\n --bs-btn-padding-y: 0.375rem;\n --bs-btn-font-family: ;\n --bs-btn-font-size: 1rem;\n --bs-btn-font-weight: 400;\n --bs-btn-line-height: 1.5;\n --bs-btn-color: var(--bs-body-color);\n --bs-btn-bg: transparent;\n --bs-btn-border-width: var(--bs-border-width);\n --bs-btn-border-color: transparent;\n --bs-btn-border-radius: var(--bs-border-radius);\n --bs-btn-hover-border-color: transparent;\n --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n --bs-btn-disabled-opacity: 0.65;\n --bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5);\n display: inline-block;\n padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x);\n font-family: var(--bs-btn-font-family);\n font-size: var(--bs-btn-font-size);\n font-weight: var(--bs-btn-font-weight);\n line-height: var(--bs-btn-line-height);\n color: var(--bs-btn-color);\n text-align: center;\n text-decoration: none;\n vertical-align: middle;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n border: var(--bs-btn-border-width) solid var(--bs-btn-border-color);\n border-radius: var(--bs-btn-border-radius);\n background-color: var(--bs-btn-bg);\n 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;\n}\n@media (prefers-reduced-motion: reduce) {\n .btn {\n transition: none;\n }\n}\n.btn:hover {\n color: var(--bs-btn-hover-color);\n background-color: var(--bs-btn-hover-bg);\n border-color: var(--bs-btn-hover-border-color);\n}\n.btn-check + .btn:hover {\n color: var(--bs-btn-color);\n background-color: var(--bs-btn-bg);\n border-color: var(--bs-btn-border-color);\n}\n.btn:focus-visible {\n color: var(--bs-btn-hover-color);\n background-color: var(--bs-btn-hover-bg);\n border-color: var(--bs-btn-hover-border-color);\n outline: 0;\n box-shadow: var(--bs-btn-focus-box-shadow);\n}\n.btn-check:focus-visible + .btn {\n border-color: var(--bs-btn-hover-border-color);\n outline: 0;\n box-shadow: var(--bs-btn-focus-box-shadow);\n}\n.btn-check:checked + .btn, :not(.btn-check) + .btn:active, .btn:first-child:active, .btn.active, .btn.show {\n color: var(--bs-btn-active-color);\n background-color: var(--bs-btn-active-bg);\n border-color: var(--bs-btn-active-border-color);\n}\n.btn-check:checked + .btn:focus-visible, :not(.btn-check) + .btn:active:focus-visible, .btn:first-child:active:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible {\n box-shadow: var(--bs-btn-focus-box-shadow);\n}\n.btn:disabled, .btn.disabled, fieldset:disabled .btn {\n color: var(--bs-btn-disabled-color);\n pointer-events: none;\n background-color: var(--bs-btn-disabled-bg);\n border-color: var(--bs-btn-disabled-border-color);\n opacity: var(--bs-btn-disabled-opacity);\n}\n\n.btn-primary {\n --bs-btn-color: #fff;\n --bs-btn-bg: #0d6efd;\n --bs-btn-border-color: #0d6efd;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #0b5ed7;\n --bs-btn-hover-border-color: #0a58ca;\n --bs-btn-focus-shadow-rgb: 49, 132, 253;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #0a58ca;\n --bs-btn-active-border-color: #0a53be;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #fff;\n --bs-btn-disabled-bg: #0d6efd;\n --bs-btn-disabled-border-color: #0d6efd;\n}\n\n.btn-secondary {\n --bs-btn-color: #fff;\n --bs-btn-bg: #6c757d;\n --bs-btn-border-color: #6c757d;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #5c636a;\n --bs-btn-hover-border-color: #565e64;\n --bs-btn-focus-shadow-rgb: 130, 138, 145;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #565e64;\n --bs-btn-active-border-color: #51585e;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #fff;\n --bs-btn-disabled-bg: #6c757d;\n --bs-btn-disabled-border-color: #6c757d;\n}\n\n.btn-success {\n --bs-btn-color: #fff;\n --bs-btn-bg: #198754;\n --bs-btn-border-color: #198754;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #157347;\n --bs-btn-hover-border-color: #146c43;\n --bs-btn-focus-shadow-rgb: 60, 153, 110;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #146c43;\n --bs-btn-active-border-color: #13653f;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #fff;\n --bs-btn-disabled-bg: #198754;\n --bs-btn-disabled-border-color: #198754;\n}\n\n.btn-info {\n --bs-btn-color: #000;\n --bs-btn-bg: #0dcaf0;\n --bs-btn-border-color: #0dcaf0;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: #31d2f2;\n --bs-btn-hover-border-color: #25cff2;\n --bs-btn-focus-shadow-rgb: 11, 172, 204;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: #3dd5f3;\n --bs-btn-active-border-color: #25cff2;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #000;\n --bs-btn-disabled-bg: #0dcaf0;\n --bs-btn-disabled-border-color: #0dcaf0;\n}\n\n.btn-warning {\n --bs-btn-color: #000;\n --bs-btn-bg: #ffc107;\n --bs-btn-border-color: #ffc107;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: #ffca2c;\n --bs-btn-hover-border-color: #ffc720;\n --bs-btn-focus-shadow-rgb: 217, 164, 6;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: #ffcd39;\n --bs-btn-active-border-color: #ffc720;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #000;\n --bs-btn-disabled-bg: #ffc107;\n --bs-btn-disabled-border-color: #ffc107;\n}\n\n.btn-danger {\n --bs-btn-color: #fff;\n --bs-btn-bg: #dc3545;\n --bs-btn-border-color: #dc3545;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #bb2d3b;\n --bs-btn-hover-border-color: #b02a37;\n --bs-btn-focus-shadow-rgb: 225, 83, 97;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #b02a37;\n --bs-btn-active-border-color: #a52834;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #fff;\n --bs-btn-disabled-bg: #dc3545;\n --bs-btn-disabled-border-color: #dc3545;\n}\n\n.btn-light {\n --bs-btn-color: #000;\n --bs-btn-bg: #f8f9fa;\n --bs-btn-border-color: #f8f9fa;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: #d3d4d5;\n --bs-btn-hover-border-color: #c6c7c8;\n --bs-btn-focus-shadow-rgb: 211, 212, 213;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: #c6c7c8;\n --bs-btn-active-border-color: #babbbc;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #000;\n --bs-btn-disabled-bg: #f8f9fa;\n --bs-btn-disabled-border-color: #f8f9fa;\n}\n\n.btn-dark {\n --bs-btn-color: #fff;\n --bs-btn-bg: #212529;\n --bs-btn-border-color: #212529;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #424649;\n --bs-btn-hover-border-color: #373b3e;\n --bs-btn-focus-shadow-rgb: 66, 70, 73;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #4d5154;\n --bs-btn-active-border-color: #373b3e;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #fff;\n --bs-btn-disabled-bg: #212529;\n --bs-btn-disabled-border-color: #212529;\n}\n\n.btn-outline-primary {\n --bs-btn-color: #0d6efd;\n --bs-btn-border-color: #0d6efd;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #0d6efd;\n --bs-btn-hover-border-color: #0d6efd;\n --bs-btn-focus-shadow-rgb: 13, 110, 253;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #0d6efd;\n --bs-btn-active-border-color: #0d6efd;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #0d6efd;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #0d6efd;\n --bs-gradient: none;\n}\n\n.btn-outline-secondary {\n --bs-btn-color: #6c757d;\n --bs-btn-border-color: #6c757d;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #6c757d;\n --bs-btn-hover-border-color: #6c757d;\n --bs-btn-focus-shadow-rgb: 108, 117, 125;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #6c757d;\n --bs-btn-active-border-color: #6c757d;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #6c757d;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #6c757d;\n --bs-gradient: none;\n}\n\n.btn-outline-success {\n --bs-btn-color: #198754;\n --bs-btn-border-color: #198754;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #198754;\n --bs-btn-hover-border-color: #198754;\n --bs-btn-focus-shadow-rgb: 25, 135, 84;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #198754;\n --bs-btn-active-border-color: #198754;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #198754;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #198754;\n --bs-gradient: none;\n}\n\n.btn-outline-info {\n --bs-btn-color: #0dcaf0;\n --bs-btn-border-color: #0dcaf0;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: #0dcaf0;\n --bs-btn-hover-border-color: #0dcaf0;\n --bs-btn-focus-shadow-rgb: 13, 202, 240;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: #0dcaf0;\n --bs-btn-active-border-color: #0dcaf0;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #0dcaf0;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #0dcaf0;\n --bs-gradient: none;\n}\n\n.btn-outline-warning {\n --bs-btn-color: #ffc107;\n --bs-btn-border-color: #ffc107;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: #ffc107;\n --bs-btn-hover-border-color: #ffc107;\n --bs-btn-focus-shadow-rgb: 255, 193, 7;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: #ffc107;\n --bs-btn-active-border-color: #ffc107;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #ffc107;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #ffc107;\n --bs-gradient: none;\n}\n\n.btn-outline-danger {\n --bs-btn-color: #dc3545;\n --bs-btn-border-color: #dc3545;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #dc3545;\n --bs-btn-hover-border-color: #dc3545;\n --bs-btn-focus-shadow-rgb: 220, 53, 69;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #dc3545;\n --bs-btn-active-border-color: #dc3545;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #dc3545;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #dc3545;\n --bs-gradient: none;\n}\n\n.btn-outline-light {\n --bs-btn-color: #f8f9fa;\n --bs-btn-border-color: #f8f9fa;\n --bs-btn-hover-color: #000;\n --bs-btn-hover-bg: #f8f9fa;\n --bs-btn-hover-border-color: #f8f9fa;\n --bs-btn-focus-shadow-rgb: 248, 249, 250;\n --bs-btn-active-color: #000;\n --bs-btn-active-bg: #f8f9fa;\n --bs-btn-active-border-color: #f8f9fa;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #f8f9fa;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #f8f9fa;\n --bs-gradient: none;\n}\n\n.btn-outline-dark {\n --bs-btn-color: #212529;\n --bs-btn-border-color: #212529;\n --bs-btn-hover-color: #fff;\n --bs-btn-hover-bg: #212529;\n --bs-btn-hover-border-color: #212529;\n --bs-btn-focus-shadow-rgb: 33, 37, 41;\n --bs-btn-active-color: #fff;\n --bs-btn-active-bg: #212529;\n --bs-btn-active-border-color: #212529;\n --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n --bs-btn-disabled-color: #212529;\n --bs-btn-disabled-bg: transparent;\n --bs-btn-disabled-border-color: #212529;\n --bs-gradient: none;\n}\n\n.btn-link {\n --bs-btn-font-weight: 400;\n --bs-btn-color: var(--bs-link-color);\n --bs-btn-bg: transparent;\n --bs-btn-border-color: transparent;\n --bs-btn-hover-color: var(--bs-link-hover-color);\n --bs-btn-hover-border-color: transparent;\n --bs-btn-active-color: var(--bs-link-hover-color);\n --bs-btn-active-border-color: transparent;\n --bs-btn-disabled-color: #6c757d;\n --bs-btn-disabled-border-color: transparent;\n --bs-btn-box-shadow: 0 0 0 #000;\n --bs-btn-focus-shadow-rgb: 49, 132, 253;\n text-decoration: underline;\n}\n.btn-link:focus-visible {\n color: var(--bs-btn-color);\n}\n.btn-link:hover {\n color: var(--bs-btn-hover-color);\n}\n\n.btn-lg, .btn-group-lg > .btn {\n --bs-btn-padding-y: 0.5rem;\n --bs-btn-padding-x: 1rem;\n --bs-btn-font-size: 1.25rem;\n --bs-btn-border-radius: var(--bs-border-radius-lg);\n}\n\n.btn-sm, .btn-group-sm > .btn {\n --bs-btn-padding-y: 0.25rem;\n --bs-btn-padding-x: 0.5rem;\n --bs-btn-font-size: 0.875rem;\n --bs-btn-border-radius: var(--bs-border-radius-sm);\n}\n\n.fade {\n transition: opacity 0.15s linear;\n}\n@media (prefers-reduced-motion: reduce) {\n .fade {\n transition: none;\n }\n}\n.fade:not(.show) {\n opacity: 0;\n}\n\n.collapse:not(.show) {\n display: none;\n}\n\n.collapsing {\n height: 0;\n overflow: hidden;\n transition: height 0.35s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .collapsing {\n transition: none;\n }\n}\n.collapsing.collapse-horizontal {\n width: 0;\n height: auto;\n transition: width 0.35s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .collapsing.collapse-horizontal {\n transition: none;\n }\n}\n\n.dropup,\n.dropend,\n.dropdown,\n.dropstart,\n.dropup-center,\n.dropdown-center {\n position: relative;\n}\n\n.dropdown-toggle {\n white-space: nowrap;\n}\n.dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid;\n border-right: 0.3em solid transparent;\n border-bottom: 0;\n border-left: 0.3em solid transparent;\n}\n.dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropdown-menu {\n --bs-dropdown-zindex: 1000;\n --bs-dropdown-min-width: 10rem;\n --bs-dropdown-padding-x: 0;\n --bs-dropdown-padding-y: 0.5rem;\n --bs-dropdown-spacer: 0.125rem;\n --bs-dropdown-font-size: 1rem;\n --bs-dropdown-color: var(--bs-body-color);\n --bs-dropdown-bg: var(--bs-body-bg);\n --bs-dropdown-border-color: var(--bs-border-color-translucent);\n --bs-dropdown-border-radius: var(--bs-border-radius);\n --bs-dropdown-border-width: var(--bs-border-width);\n --bs-dropdown-inner-border-radius: calc(var(--bs-border-radius) - var(--bs-border-width));\n --bs-dropdown-divider-bg: var(--bs-border-color-translucent);\n --bs-dropdown-divider-margin-y: 0.5rem;\n --bs-dropdown-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n --bs-dropdown-link-color: var(--bs-body-color);\n --bs-dropdown-link-hover-color: var(--bs-body-color);\n --bs-dropdown-link-hover-bg: var(--bs-tertiary-bg);\n --bs-dropdown-link-active-color: #fff;\n --bs-dropdown-link-active-bg: #0d6efd;\n --bs-dropdown-link-disabled-color: var(--bs-tertiary-color);\n --bs-dropdown-item-padding-x: 1rem;\n --bs-dropdown-item-padding-y: 0.25rem;\n --bs-dropdown-header-color: #6c757d;\n --bs-dropdown-header-padding-x: 1rem;\n --bs-dropdown-header-padding-y: 0.5rem;\n position: absolute;\n z-index: var(--bs-dropdown-zindex);\n display: none;\n min-width: var(--bs-dropdown-min-width);\n padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x);\n margin: 0;\n font-size: var(--bs-dropdown-font-size);\n color: var(--bs-dropdown-color);\n text-align: left;\n list-style: none;\n background-color: var(--bs-dropdown-bg);\n background-clip: padding-box;\n border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color);\n border-radius: var(--bs-dropdown-border-radius);\n}\n.dropdown-menu[data-bs-popper] {\n top: 100%;\n left: 0;\n margin-top: var(--bs-dropdown-spacer);\n}\n\n.dropdown-menu-start {\n --bs-position: start;\n}\n.dropdown-menu-start[data-bs-popper] {\n right: auto;\n left: 0;\n}\n\n.dropdown-menu-end {\n --bs-position: end;\n}\n.dropdown-menu-end[data-bs-popper] {\n right: 0;\n left: auto;\n}\n\n@media (min-width: 576px) {\n .dropdown-menu-sm-start {\n --bs-position: start;\n }\n .dropdown-menu-sm-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n .dropdown-menu-sm-end {\n --bs-position: end;\n }\n .dropdown-menu-sm-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 768px) {\n .dropdown-menu-md-start {\n --bs-position: start;\n }\n .dropdown-menu-md-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n .dropdown-menu-md-end {\n --bs-position: end;\n }\n .dropdown-menu-md-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 992px) {\n .dropdown-menu-lg-start {\n --bs-position: start;\n }\n .dropdown-menu-lg-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n .dropdown-menu-lg-end {\n --bs-position: end;\n }\n .dropdown-menu-lg-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 1200px) {\n .dropdown-menu-xl-start {\n --bs-position: start;\n }\n .dropdown-menu-xl-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xl-end {\n --bs-position: end;\n }\n .dropdown-menu-xl-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n@media (min-width: 1400px) {\n .dropdown-menu-xxl-start {\n --bs-position: start;\n }\n .dropdown-menu-xxl-start[data-bs-popper] {\n right: auto;\n left: 0;\n }\n .dropdown-menu-xxl-end {\n --bs-position: end;\n }\n .dropdown-menu-xxl-end[data-bs-popper] {\n right: 0;\n left: auto;\n }\n}\n.dropup .dropdown-menu[data-bs-popper] {\n top: auto;\n bottom: 100%;\n margin-top: 0;\n margin-bottom: var(--bs-dropdown-spacer);\n}\n.dropup .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0;\n border-right: 0.3em solid transparent;\n border-bottom: 0.3em solid;\n border-left: 0.3em solid transparent;\n}\n.dropup .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n\n.dropend .dropdown-menu[data-bs-popper] {\n top: 0;\n right: auto;\n left: 100%;\n margin-top: 0;\n margin-left: var(--bs-dropdown-spacer);\n}\n.dropend .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0;\n border-bottom: 0.3em solid transparent;\n border-left: 0.3em solid;\n}\n.dropend .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n.dropend .dropdown-toggle::after {\n vertical-align: 0;\n}\n\n.dropstart .dropdown-menu[data-bs-popper] {\n top: 0;\n right: 100%;\n left: auto;\n margin-top: 0;\n margin-right: var(--bs-dropdown-spacer);\n}\n.dropstart .dropdown-toggle::after {\n display: inline-block;\n margin-left: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n}\n.dropstart .dropdown-toggle::after {\n display: none;\n}\n.dropstart .dropdown-toggle::before {\n display: inline-block;\n margin-right: 0.255em;\n vertical-align: 0.255em;\n content: \"\";\n border-top: 0.3em solid transparent;\n border-right: 0.3em solid;\n border-bottom: 0.3em solid transparent;\n}\n.dropstart .dropdown-toggle:empty::after {\n margin-left: 0;\n}\n.dropstart .dropdown-toggle::before {\n vertical-align: 0;\n}\n\n.dropdown-divider {\n height: 0;\n margin: var(--bs-dropdown-divider-margin-y) 0;\n overflow: hidden;\n border-top: 1px solid var(--bs-dropdown-divider-bg);\n opacity: 1;\n}\n\n.dropdown-item {\n display: block;\n width: 100%;\n padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);\n clear: both;\n font-weight: 400;\n color: var(--bs-dropdown-link-color);\n text-align: inherit;\n text-decoration: none;\n white-space: nowrap;\n background-color: transparent;\n border: 0;\n border-radius: var(--bs-dropdown-item-border-radius, 0);\n}\n.dropdown-item:hover, .dropdown-item:focus {\n color: var(--bs-dropdown-link-hover-color);\n background-color: var(--bs-dropdown-link-hover-bg);\n}\n.dropdown-item.active, .dropdown-item:active {\n color: var(--bs-dropdown-link-active-color);\n text-decoration: none;\n background-color: var(--bs-dropdown-link-active-bg);\n}\n.dropdown-item.disabled, .dropdown-item:disabled {\n color: var(--bs-dropdown-link-disabled-color);\n pointer-events: none;\n background-color: transparent;\n}\n\n.dropdown-menu.show {\n display: block;\n}\n\n.dropdown-header {\n display: block;\n padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x);\n margin-bottom: 0;\n font-size: 0.875rem;\n color: var(--bs-dropdown-header-color);\n white-space: nowrap;\n}\n\n.dropdown-item-text {\n display: block;\n padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x);\n color: var(--bs-dropdown-link-color);\n}\n\n.dropdown-menu-dark {\n --bs-dropdown-color: #dee2e6;\n --bs-dropdown-bg: #343a40;\n --bs-dropdown-border-color: var(--bs-border-color-translucent);\n --bs-dropdown-box-shadow: ;\n --bs-dropdown-link-color: #dee2e6;\n --bs-dropdown-link-hover-color: #fff;\n --bs-dropdown-divider-bg: var(--bs-border-color-translucent);\n --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15);\n --bs-dropdown-link-active-color: #fff;\n --bs-dropdown-link-active-bg: #0d6efd;\n --bs-dropdown-link-disabled-color: #adb5bd;\n --bs-dropdown-header-color: #adb5bd;\n}\n\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-flex;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n flex: 1 1 auto;\n}\n.btn-group > .btn-check:checked + .btn,\n.btn-group > .btn-check:focus + .btn,\n.btn-group > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn-check:checked + .btn,\n.btn-group-vertical > .btn-check:focus + .btn,\n.btn-group-vertical > .btn:hover,\n.btn-group-vertical > .btn:focus,\n.btn-group-vertical > .btn:active,\n.btn-group-vertical > .btn.active {\n z-index: 1;\n}\n\n.btn-toolbar {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n}\n.btn-toolbar .input-group {\n width: auto;\n}\n\n.btn-group {\n border-radius: var(--bs-border-radius);\n}\n.btn-group > :not(.btn-check:first-child) + .btn,\n.btn-group > .btn-group:not(:first-child) {\n margin-left: calc(var(--bs-border-width) * -1);\n}\n.btn-group > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group > .btn.dropdown-toggle-split:first-child,\n.btn-group > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:nth-child(n+3),\n.btn-group > :not(.btn-check) + .btn,\n.btn-group > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n\n.dropdown-toggle-split {\n padding-right: 0.5625rem;\n padding-left: 0.5625rem;\n}\n.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after {\n margin-left: 0;\n}\n.dropstart .dropdown-toggle-split::before {\n margin-right: 0;\n}\n\n.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split {\n padding-right: 0.375rem;\n padding-left: 0.375rem;\n}\n\n.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split {\n padding-right: 0.75rem;\n padding-left: 0.75rem;\n}\n\n.btn-group-vertical {\n flex-direction: column;\n align-items: flex-start;\n justify-content: center;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group {\n width: 100%;\n}\n.btn-group-vertical > .btn:not(:first-child),\n.btn-group-vertical > .btn-group:not(:first-child) {\n margin-top: calc(var(--bs-border-width) * -1);\n}\n.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle),\n.btn-group-vertical > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn ~ .btn,\n.btn-group-vertical > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav {\n --bs-nav-link-padding-x: 1rem;\n --bs-nav-link-padding-y: 0.5rem;\n --bs-nav-link-font-weight: ;\n --bs-nav-link-color: var(--bs-link-color);\n --bs-nav-link-hover-color: var(--bs-link-hover-color);\n --bs-nav-link-disabled-color: var(--bs-secondary-color);\n display: flex;\n flex-wrap: wrap;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n\n.nav-link {\n display: block;\n padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x);\n font-size: var(--bs-nav-link-font-size);\n font-weight: var(--bs-nav-link-font-weight);\n color: var(--bs-nav-link-color);\n text-decoration: none;\n background: none;\n border: 0;\n transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .nav-link {\n transition: none;\n }\n}\n.nav-link:hover, .nav-link:focus {\n color: var(--bs-nav-link-hover-color);\n}\n.nav-link:focus-visible {\n outline: 0;\n box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n}\n.nav-link.disabled {\n color: var(--bs-nav-link-disabled-color);\n pointer-events: none;\n cursor: default;\n}\n\n.nav-tabs {\n --bs-nav-tabs-border-width: var(--bs-border-width);\n --bs-nav-tabs-border-color: var(--bs-border-color);\n --bs-nav-tabs-border-radius: var(--bs-border-radius);\n --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color);\n --bs-nav-tabs-link-active-color: var(--bs-emphasis-color);\n --bs-nav-tabs-link-active-bg: var(--bs-body-bg);\n --bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg);\n border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color);\n}\n.nav-tabs .nav-link {\n margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width));\n border: var(--bs-nav-tabs-border-width) solid transparent;\n border-top-left-radius: var(--bs-nav-tabs-border-radius);\n border-top-right-radius: var(--bs-nav-tabs-border-radius);\n}\n.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus {\n isolation: isolate;\n border-color: var(--bs-nav-tabs-link-hover-border-color);\n}\n.nav-tabs .nav-link.disabled, .nav-tabs .nav-link:disabled {\n color: var(--bs-nav-link-disabled-color);\n background-color: transparent;\n border-color: transparent;\n}\n.nav-tabs .nav-link.active,\n.nav-tabs .nav-item.show .nav-link {\n color: var(--bs-nav-tabs-link-active-color);\n background-color: var(--bs-nav-tabs-link-active-bg);\n border-color: var(--bs-nav-tabs-link-active-border-color);\n}\n.nav-tabs .dropdown-menu {\n margin-top: calc(-1 * var(--bs-nav-tabs-border-width));\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.nav-pills {\n --bs-nav-pills-border-radius: var(--bs-border-radius);\n --bs-nav-pills-link-active-color: #fff;\n --bs-nav-pills-link-active-bg: #0d6efd;\n}\n.nav-pills .nav-link {\n border-radius: var(--bs-nav-pills-border-radius);\n}\n.nav-pills .nav-link:disabled {\n color: var(--bs-nav-link-disabled-color);\n background-color: transparent;\n border-color: transparent;\n}\n.nav-pills .nav-link.active,\n.nav-pills .show > .nav-link {\n color: var(--bs-nav-pills-link-active-color);\n background-color: var(--bs-nav-pills-link-active-bg);\n}\n\n.nav-underline {\n --bs-nav-underline-gap: 1rem;\n --bs-nav-underline-border-width: 0.125rem;\n --bs-nav-underline-link-active-color: var(--bs-emphasis-color);\n gap: var(--bs-nav-underline-gap);\n}\n.nav-underline .nav-link {\n padding-right: 0;\n padding-left: 0;\n border-bottom: var(--bs-nav-underline-border-width) solid transparent;\n}\n.nav-underline .nav-link:hover, .nav-underline .nav-link:focus {\n border-bottom-color: currentcolor;\n}\n.nav-underline .nav-link.active,\n.nav-underline .show > .nav-link {\n font-weight: 700;\n color: var(--bs-nav-underline-link-active-color);\n border-bottom-color: currentcolor;\n}\n\n.nav-fill > .nav-link,\n.nav-fill .nav-item {\n flex: 1 1 auto;\n text-align: center;\n}\n\n.nav-justified > .nav-link,\n.nav-justified .nav-item {\n flex-basis: 0;\n flex-grow: 1;\n text-align: center;\n}\n\n.nav-fill .nav-item .nav-link,\n.nav-justified .nav-item .nav-link {\n width: 100%;\n}\n\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n\n.navbar {\n --bs-navbar-padding-x: 0;\n --bs-navbar-padding-y: 0.5rem;\n --bs-navbar-color: rgba(var(--bs-emphasis-color-rgb), 0.65);\n --bs-navbar-hover-color: rgba(var(--bs-emphasis-color-rgb), 0.8);\n --bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), 0.3);\n --bs-navbar-active-color: rgba(var(--bs-emphasis-color-rgb), 1);\n --bs-navbar-brand-padding-y: 0.3125rem;\n --bs-navbar-brand-margin-end: 1rem;\n --bs-navbar-brand-font-size: 1.25rem;\n --bs-navbar-brand-color: rgba(var(--bs-emphasis-color-rgb), 1);\n --bs-navbar-brand-hover-color: rgba(var(--bs-emphasis-color-rgb), 1);\n --bs-navbar-nav-link-padding-x: 0.5rem;\n --bs-navbar-toggler-padding-y: 0.25rem;\n --bs-navbar-toggler-padding-x: 0.75rem;\n --bs-navbar-toggler-font-size: 1.25rem;\n --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%2833, 37, 41, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n --bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), 0.15);\n --bs-navbar-toggler-border-radius: var(--bs-border-radius);\n --bs-navbar-toggler-focus-width: 0.25rem;\n --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out;\n position: relative;\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n justify-content: space-between;\n padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x);\n}\n.navbar > .container,\n.navbar > .container-fluid,\n.navbar > .container-sm,\n.navbar > .container-md,\n.navbar > .container-lg,\n.navbar > .container-xl,\n.navbar > .container-xxl {\n display: flex;\n flex-wrap: inherit;\n align-items: center;\n justify-content: space-between;\n}\n.navbar-brand {\n padding-top: var(--bs-navbar-brand-padding-y);\n padding-bottom: var(--bs-navbar-brand-padding-y);\n margin-right: var(--bs-navbar-brand-margin-end);\n font-size: var(--bs-navbar-brand-font-size);\n color: var(--bs-navbar-brand-color);\n text-decoration: none;\n white-space: nowrap;\n}\n.navbar-brand:hover, .navbar-brand:focus {\n color: var(--bs-navbar-brand-hover-color);\n}\n\n.navbar-nav {\n --bs-nav-link-padding-x: 0;\n --bs-nav-link-padding-y: 0.5rem;\n --bs-nav-link-font-weight: ;\n --bs-nav-link-color: var(--bs-navbar-color);\n --bs-nav-link-hover-color: var(--bs-navbar-hover-color);\n --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color);\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.navbar-nav .nav-link.active, .navbar-nav .nav-link.show {\n color: var(--bs-navbar-active-color);\n}\n.navbar-nav .dropdown-menu {\n position: static;\n}\n\n.navbar-text {\n padding-top: 0.5rem;\n padding-bottom: 0.5rem;\n color: var(--bs-navbar-color);\n}\n.navbar-text a,\n.navbar-text a:hover,\n.navbar-text a:focus {\n color: var(--bs-navbar-active-color);\n}\n\n.navbar-collapse {\n flex-basis: 100%;\n flex-grow: 1;\n align-items: center;\n}\n\n.navbar-toggler {\n padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x);\n font-size: var(--bs-navbar-toggler-font-size);\n line-height: 1;\n color: var(--bs-navbar-color);\n background-color: transparent;\n border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color);\n border-radius: var(--bs-navbar-toggler-border-radius);\n transition: var(--bs-navbar-toggler-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n .navbar-toggler {\n transition: none;\n }\n}\n.navbar-toggler:hover {\n text-decoration: none;\n}\n.navbar-toggler:focus {\n text-decoration: none;\n outline: 0;\n box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width);\n}\n\n.navbar-toggler-icon {\n display: inline-block;\n width: 1.5em;\n height: 1.5em;\n vertical-align: middle;\n background-image: var(--bs-navbar-toggler-icon-bg);\n background-repeat: no-repeat;\n background-position: center;\n background-size: 100%;\n}\n\n.navbar-nav-scroll {\n max-height: var(--bs-scroll-height, 75vh);\n overflow-y: auto;\n}\n\n@media (min-width: 576px) {\n .navbar-expand-sm {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-sm .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-sm .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-sm .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n }\n .navbar-expand-sm .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-sm .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-sm .navbar-toggler {\n display: none;\n }\n .navbar-expand-sm .offcanvas {\n position: static;\n z-index: auto;\n flex-grow: 1;\n width: auto !important;\n height: auto !important;\n visibility: visible !important;\n background-color: transparent !important;\n border: 0 !important;\n transform: none !important;\n transition: none;\n }\n .navbar-expand-sm .offcanvas .offcanvas-header {\n display: none;\n }\n .navbar-expand-sm .offcanvas .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 768px) {\n .navbar-expand-md {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-md .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-md .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-md .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n }\n .navbar-expand-md .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-md .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-md .navbar-toggler {\n display: none;\n }\n .navbar-expand-md .offcanvas {\n position: static;\n z-index: auto;\n flex-grow: 1;\n width: auto !important;\n height: auto !important;\n visibility: visible !important;\n background-color: transparent !important;\n border: 0 !important;\n transform: none !important;\n transition: none;\n }\n .navbar-expand-md .offcanvas .offcanvas-header {\n display: none;\n }\n .navbar-expand-md .offcanvas .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 992px) {\n .navbar-expand-lg {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-lg .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-lg .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-lg .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n }\n .navbar-expand-lg .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-lg .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-lg .navbar-toggler {\n display: none;\n }\n .navbar-expand-lg .offcanvas {\n position: static;\n z-index: auto;\n flex-grow: 1;\n width: auto !important;\n height: auto !important;\n visibility: visible !important;\n background-color: transparent !important;\n border: 0 !important;\n transform: none !important;\n transition: none;\n }\n .navbar-expand-lg .offcanvas .offcanvas-header {\n display: none;\n }\n .navbar-expand-lg .offcanvas .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 1200px) {\n .navbar-expand-xl {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xl .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n }\n .navbar-expand-xl .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-xl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xl .navbar-toggler {\n display: none;\n }\n .navbar-expand-xl .offcanvas {\n position: static;\n z-index: auto;\n flex-grow: 1;\n width: auto !important;\n height: auto !important;\n visibility: visible !important;\n background-color: transparent !important;\n border: 0 !important;\n transform: none !important;\n transition: none;\n }\n .navbar-expand-xl .offcanvas .offcanvas-header {\n display: none;\n }\n .navbar-expand-xl .offcanvas .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n@media (min-width: 1400px) {\n .navbar-expand-xxl {\n flex-wrap: nowrap;\n justify-content: flex-start;\n }\n .navbar-expand-xxl .navbar-nav {\n flex-direction: row;\n }\n .navbar-expand-xxl .navbar-nav .dropdown-menu {\n position: absolute;\n }\n .navbar-expand-xxl .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n }\n .navbar-expand-xxl .navbar-nav-scroll {\n overflow: visible;\n }\n .navbar-expand-xxl .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n }\n .navbar-expand-xxl .navbar-toggler {\n display: none;\n }\n .navbar-expand-xxl .offcanvas {\n position: static;\n z-index: auto;\n flex-grow: 1;\n width: auto !important;\n height: auto !important;\n visibility: visible !important;\n background-color: transparent !important;\n border: 0 !important;\n transform: none !important;\n transition: none;\n }\n .navbar-expand-xxl .offcanvas .offcanvas-header {\n display: none;\n }\n .navbar-expand-xxl .offcanvas .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n }\n}\n.navbar-expand {\n flex-wrap: nowrap;\n justify-content: flex-start;\n}\n.navbar-expand .navbar-nav {\n flex-direction: row;\n}\n.navbar-expand .navbar-nav .dropdown-menu {\n position: absolute;\n}\n.navbar-expand .navbar-nav .nav-link {\n padding-right: var(--bs-navbar-nav-link-padding-x);\n padding-left: var(--bs-navbar-nav-link-padding-x);\n}\n.navbar-expand .navbar-nav-scroll {\n overflow: visible;\n}\n.navbar-expand .navbar-collapse {\n display: flex !important;\n flex-basis: auto;\n}\n.navbar-expand .navbar-toggler {\n display: none;\n}\n.navbar-expand .offcanvas {\n position: static;\n z-index: auto;\n flex-grow: 1;\n width: auto !important;\n height: auto !important;\n visibility: visible !important;\n background-color: transparent !important;\n border: 0 !important;\n transform: none !important;\n transition: none;\n}\n.navbar-expand .offcanvas .offcanvas-header {\n display: none;\n}\n.navbar-expand .offcanvas .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n}\n\n.navbar-dark,\n.navbar[data-bs-theme=dark] {\n --bs-navbar-color: rgba(255, 255, 255, 0.55);\n --bs-navbar-hover-color: rgba(255, 255, 255, 0.75);\n --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25);\n --bs-navbar-active-color: #fff;\n --bs-navbar-brand-color: #fff;\n --bs-navbar-brand-hover-color: #fff;\n --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1);\n --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.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n[data-bs-theme=dark] .navbar-toggler-icon {\n --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.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e\");\n}\n\n.card {\n --bs-card-spacer-y: 1rem;\n --bs-card-spacer-x: 1rem;\n --bs-card-title-spacer-y: 0.5rem;\n --bs-card-title-color: ;\n --bs-card-subtitle-color: ;\n --bs-card-border-width: var(--bs-border-width);\n --bs-card-border-color: var(--bs-border-color-translucent);\n --bs-card-border-radius: var(--bs-border-radius);\n --bs-card-box-shadow: ;\n --bs-card-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));\n --bs-card-cap-padding-y: 0.5rem;\n --bs-card-cap-padding-x: 1rem;\n --bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03);\n --bs-card-cap-color: ;\n --bs-card-height: ;\n --bs-card-color: ;\n --bs-card-bg: var(--bs-body-bg);\n --bs-card-img-overlay-padding: 1rem;\n --bs-card-group-margin: 0.75rem;\n position: relative;\n display: flex;\n flex-direction: column;\n min-width: 0;\n height: var(--bs-card-height);\n color: var(--bs-body-color);\n word-wrap: break-word;\n background-color: var(--bs-card-bg);\n background-clip: border-box;\n border: var(--bs-card-border-width) solid var(--bs-card-border-color);\n border-radius: var(--bs-card-border-radius);\n}\n.card > hr {\n margin-right: 0;\n margin-left: 0;\n}\n.card > .list-group {\n border-top: inherit;\n border-bottom: inherit;\n}\n.card > .list-group:first-child {\n border-top-width: 0;\n border-top-left-radius: var(--bs-card-inner-border-radius);\n border-top-right-radius: var(--bs-card-inner-border-radius);\n}\n.card > .list-group:last-child {\n border-bottom-width: 0;\n border-bottom-right-radius: var(--bs-card-inner-border-radius);\n border-bottom-left-radius: var(--bs-card-inner-border-radius);\n}\n.card > .card-header + .list-group,\n.card > .list-group + .card-footer {\n border-top: 0;\n}\n\n.card-body {\n flex: 1 1 auto;\n padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x);\n color: var(--bs-card-color);\n}\n\n.card-title {\n margin-bottom: var(--bs-card-title-spacer-y);\n color: var(--bs-card-title-color);\n}\n\n.card-subtitle {\n margin-top: calc(-0.5 * var(--bs-card-title-spacer-y));\n margin-bottom: 0;\n color: var(--bs-card-subtitle-color);\n}\n\n.card-text:last-child {\n margin-bottom: 0;\n}\n\n.card-link + .card-link {\n margin-left: var(--bs-card-spacer-x);\n}\n\n.card-header {\n padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);\n margin-bottom: 0;\n color: var(--bs-card-cap-color);\n background-color: var(--bs-card-cap-bg);\n border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color);\n}\n.card-header:first-child {\n border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0;\n}\n\n.card-footer {\n padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x);\n color: var(--bs-card-cap-color);\n background-color: var(--bs-card-cap-bg);\n border-top: var(--bs-card-border-width) solid var(--bs-card-border-color);\n}\n.card-footer:last-child {\n border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius);\n}\n\n.card-header-tabs {\n margin-right: calc(-0.5 * var(--bs-card-cap-padding-x));\n margin-bottom: calc(-1 * var(--bs-card-cap-padding-y));\n margin-left: calc(-0.5 * var(--bs-card-cap-padding-x));\n border-bottom: 0;\n}\n.card-header-tabs .nav-link.active {\n background-color: var(--bs-card-bg);\n border-bottom-color: var(--bs-card-bg);\n}\n\n.card-header-pills {\n margin-right: calc(-0.5 * var(--bs-card-cap-padding-x));\n margin-left: calc(-0.5 * var(--bs-card-cap-padding-x));\n}\n\n.card-img-overlay {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n padding: var(--bs-card-img-overlay-padding);\n border-radius: var(--bs-card-inner-border-radius);\n}\n\n.card-img,\n.card-img-top,\n.card-img-bottom {\n width: 100%;\n}\n\n.card-img,\n.card-img-top {\n border-top-left-radius: var(--bs-card-inner-border-radius);\n border-top-right-radius: var(--bs-card-inner-border-radius);\n}\n\n.card-img,\n.card-img-bottom {\n border-bottom-right-radius: var(--bs-card-inner-border-radius);\n border-bottom-left-radius: var(--bs-card-inner-border-radius);\n}\n\n.card-group > .card {\n margin-bottom: var(--bs-card-group-margin);\n}\n@media (min-width: 576px) {\n .card-group {\n display: flex;\n flex-flow: row wrap;\n }\n .card-group > .card {\n flex: 1 0 0%;\n margin-bottom: 0;\n }\n .card-group > .card + .card {\n margin-left: 0;\n border-left: 0;\n }\n .card-group > .card:not(:last-child) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-top,\n .card-group > .card:not(:last-child) .card-header {\n border-top-right-radius: 0;\n }\n .card-group > .card:not(:last-child) .card-img-bottom,\n .card-group > .card:not(:last-child) .card-footer {\n border-bottom-right-radius: 0;\n }\n .card-group > .card:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-top,\n .card-group > .card:not(:first-child) .card-header {\n border-top-left-radius: 0;\n }\n .card-group > .card:not(:first-child) .card-img-bottom,\n .card-group > .card:not(:first-child) .card-footer {\n border-bottom-left-radius: 0;\n }\n}\n\n.accordion {\n --bs-accordion-color: var(--bs-body-color);\n --bs-accordion-bg: var(--bs-body-bg);\n --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;\n --bs-accordion-border-color: var(--bs-border-color);\n --bs-accordion-border-width: var(--bs-border-width);\n --bs-accordion-border-radius: var(--bs-border-radius);\n --bs-accordion-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width)));\n --bs-accordion-btn-padding-x: 1.25rem;\n --bs-accordion-btn-padding-y: 1rem;\n --bs-accordion-btn-color: var(--bs-body-color);\n --bs-accordion-btn-bg: var(--bs-accordion-bg);\n --bs-accordion-btn-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%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\");\n --bs-accordion-btn-icon-width: 1.25rem;\n --bs-accordion-btn-icon-transform: rotate(-180deg);\n --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out;\n --bs-accordion-btn-active-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23052c65'%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\");\n --bs-accordion-btn-focus-border-color: #86b7fe;\n --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n --bs-accordion-body-padding-x: 1.25rem;\n --bs-accordion-body-padding-y: 1rem;\n --bs-accordion-active-color: var(--bs-primary-text-emphasis);\n --bs-accordion-active-bg: var(--bs-primary-bg-subtle);\n}\n\n.accordion-button {\n position: relative;\n display: flex;\n align-items: center;\n width: 100%;\n padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x);\n font-size: 1rem;\n color: var(--bs-accordion-btn-color);\n text-align: left;\n background-color: var(--bs-accordion-btn-bg);\n border: 0;\n border-radius: 0;\n overflow-anchor: none;\n transition: var(--bs-accordion-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n .accordion-button {\n transition: none;\n }\n}\n.accordion-button:not(.collapsed) {\n color: var(--bs-accordion-active-color);\n background-color: var(--bs-accordion-active-bg);\n box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color);\n}\n.accordion-button:not(.collapsed)::after {\n background-image: var(--bs-accordion-btn-active-icon);\n transform: var(--bs-accordion-btn-icon-transform);\n}\n.accordion-button::after {\n flex-shrink: 0;\n width: var(--bs-accordion-btn-icon-width);\n height: var(--bs-accordion-btn-icon-width);\n margin-left: auto;\n content: \"\";\n background-image: var(--bs-accordion-btn-icon);\n background-repeat: no-repeat;\n background-size: var(--bs-accordion-btn-icon-width);\n transition: var(--bs-accordion-btn-icon-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n .accordion-button::after {\n transition: none;\n }\n}\n.accordion-button:hover {\n z-index: 2;\n}\n.accordion-button:focus {\n z-index: 3;\n border-color: var(--bs-accordion-btn-focus-border-color);\n outline: 0;\n box-shadow: var(--bs-accordion-btn-focus-box-shadow);\n}\n\n.accordion-header {\n margin-bottom: 0;\n}\n\n.accordion-item {\n color: var(--bs-accordion-color);\n background-color: var(--bs-accordion-bg);\n border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color);\n}\n.accordion-item:first-of-type {\n border-top-left-radius: var(--bs-accordion-border-radius);\n border-top-right-radius: var(--bs-accordion-border-radius);\n}\n.accordion-item:first-of-type .accordion-button {\n border-top-left-radius: var(--bs-accordion-inner-border-radius);\n border-top-right-radius: var(--bs-accordion-inner-border-radius);\n}\n.accordion-item:not(:first-of-type) {\n border-top: 0;\n}\n.accordion-item:last-of-type {\n border-bottom-right-radius: var(--bs-accordion-border-radius);\n border-bottom-left-radius: var(--bs-accordion-border-radius);\n}\n.accordion-item:last-of-type .accordion-button.collapsed {\n border-bottom-right-radius: var(--bs-accordion-inner-border-radius);\n border-bottom-left-radius: var(--bs-accordion-inner-border-radius);\n}\n.accordion-item:last-of-type .accordion-collapse {\n border-bottom-right-radius: var(--bs-accordion-border-radius);\n border-bottom-left-radius: var(--bs-accordion-border-radius);\n}\n\n.accordion-body {\n padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x);\n}\n\n.accordion-flush .accordion-collapse {\n border-width: 0;\n}\n.accordion-flush .accordion-item {\n border-right: 0;\n border-left: 0;\n border-radius: 0;\n}\n.accordion-flush .accordion-item:first-child {\n border-top: 0;\n}\n.accordion-flush .accordion-item:last-child {\n border-bottom: 0;\n}\n.accordion-flush .accordion-item .accordion-button, .accordion-flush .accordion-item .accordion-button.collapsed {\n border-radius: 0;\n}\n\n[data-bs-theme=dark] .accordion-button::after {\n --bs-accordion-btn-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%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\");\n --bs-accordion-btn-active-icon: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%236ea8fe'%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\");\n}\n\n.breadcrumb {\n --bs-breadcrumb-padding-x: 0;\n --bs-breadcrumb-padding-y: 0;\n --bs-breadcrumb-margin-bottom: 1rem;\n --bs-breadcrumb-bg: ;\n --bs-breadcrumb-border-radius: ;\n --bs-breadcrumb-divider-color: var(--bs-secondary-color);\n --bs-breadcrumb-item-padding-x: 0.5rem;\n --bs-breadcrumb-item-active-color: var(--bs-secondary-color);\n display: flex;\n flex-wrap: wrap;\n padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x);\n margin-bottom: var(--bs-breadcrumb-margin-bottom);\n font-size: var(--bs-breadcrumb-font-size);\n list-style: none;\n background-color: var(--bs-breadcrumb-bg);\n border-radius: var(--bs-breadcrumb-border-radius);\n}\n\n.breadcrumb-item + .breadcrumb-item {\n padding-left: var(--bs-breadcrumb-item-padding-x);\n}\n.breadcrumb-item + .breadcrumb-item::before {\n float: left;\n padding-right: var(--bs-breadcrumb-item-padding-x);\n color: var(--bs-breadcrumb-divider-color);\n content: var(--bs-breadcrumb-divider, \"/\") /* rtl: var(--bs-breadcrumb-divider, \"/\") */;\n}\n.breadcrumb-item.active {\n color: var(--bs-breadcrumb-item-active-color);\n}\n\n.pagination {\n --bs-pagination-padding-x: 0.75rem;\n --bs-pagination-padding-y: 0.375rem;\n --bs-pagination-font-size: 1rem;\n --bs-pagination-color: var(--bs-link-color);\n --bs-pagination-bg: var(--bs-body-bg);\n --bs-pagination-border-width: var(--bs-border-width);\n --bs-pagination-border-color: var(--bs-border-color);\n --bs-pagination-border-radius: var(--bs-border-radius);\n --bs-pagination-hover-color: var(--bs-link-hover-color);\n --bs-pagination-hover-bg: var(--bs-tertiary-bg);\n --bs-pagination-hover-border-color: var(--bs-border-color);\n --bs-pagination-focus-color: var(--bs-link-hover-color);\n --bs-pagination-focus-bg: var(--bs-secondary-bg);\n --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n --bs-pagination-active-color: #fff;\n --bs-pagination-active-bg: #0d6efd;\n --bs-pagination-active-border-color: #0d6efd;\n --bs-pagination-disabled-color: var(--bs-secondary-color);\n --bs-pagination-disabled-bg: var(--bs-secondary-bg);\n --bs-pagination-disabled-border-color: var(--bs-border-color);\n display: flex;\n padding-left: 0;\n list-style: none;\n}\n\n.page-link {\n position: relative;\n display: block;\n padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x);\n font-size: var(--bs-pagination-font-size);\n color: var(--bs-pagination-color);\n text-decoration: none;\n background-color: var(--bs-pagination-bg);\n border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color);\n 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;\n}\n@media (prefers-reduced-motion: reduce) {\n .page-link {\n transition: none;\n }\n}\n.page-link:hover {\n z-index: 2;\n color: var(--bs-pagination-hover-color);\n background-color: var(--bs-pagination-hover-bg);\n border-color: var(--bs-pagination-hover-border-color);\n}\n.page-link:focus {\n z-index: 3;\n color: var(--bs-pagination-focus-color);\n background-color: var(--bs-pagination-focus-bg);\n outline: 0;\n box-shadow: var(--bs-pagination-focus-box-shadow);\n}\n.page-link.active, .active > .page-link {\n z-index: 3;\n color: var(--bs-pagination-active-color);\n background-color: var(--bs-pagination-active-bg);\n border-color: var(--bs-pagination-active-border-color);\n}\n.page-link.disabled, .disabled > .page-link {\n color: var(--bs-pagination-disabled-color);\n pointer-events: none;\n background-color: var(--bs-pagination-disabled-bg);\n border-color: var(--bs-pagination-disabled-border-color);\n}\n\n.page-item:not(:first-child) .page-link {\n margin-left: calc(var(--bs-border-width) * -1);\n}\n.page-item:first-child .page-link {\n border-top-left-radius: var(--bs-pagination-border-radius);\n border-bottom-left-radius: var(--bs-pagination-border-radius);\n}\n.page-item:last-child .page-link {\n border-top-right-radius: var(--bs-pagination-border-radius);\n border-bottom-right-radius: var(--bs-pagination-border-radius);\n}\n\n.pagination-lg {\n --bs-pagination-padding-x: 1.5rem;\n --bs-pagination-padding-y: 0.75rem;\n --bs-pagination-font-size: 1.25rem;\n --bs-pagination-border-radius: var(--bs-border-radius-lg);\n}\n\n.pagination-sm {\n --bs-pagination-padding-x: 0.5rem;\n --bs-pagination-padding-y: 0.25rem;\n --bs-pagination-font-size: 0.875rem;\n --bs-pagination-border-radius: var(--bs-border-radius-sm);\n}\n\n.badge {\n --bs-badge-padding-x: 0.65em;\n --bs-badge-padding-y: 0.35em;\n --bs-badge-font-size: 0.75em;\n --bs-badge-font-weight: 700;\n --bs-badge-color: #fff;\n --bs-badge-border-radius: var(--bs-border-radius);\n display: inline-block;\n padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x);\n font-size: var(--bs-badge-font-size);\n font-weight: var(--bs-badge-font-weight);\n line-height: 1;\n color: var(--bs-badge-color);\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: var(--bs-badge-border-radius);\n}\n.badge:empty {\n display: none;\n}\n\n.btn .badge {\n position: relative;\n top: -1px;\n}\n\n.alert {\n --bs-alert-bg: transparent;\n --bs-alert-padding-x: 1rem;\n --bs-alert-padding-y: 1rem;\n --bs-alert-margin-bottom: 1rem;\n --bs-alert-color: inherit;\n --bs-alert-border-color: transparent;\n --bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color);\n --bs-alert-border-radius: var(--bs-border-radius);\n --bs-alert-link-color: inherit;\n position: relative;\n padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x);\n margin-bottom: var(--bs-alert-margin-bottom);\n color: var(--bs-alert-color);\n background-color: var(--bs-alert-bg);\n border: var(--bs-alert-border);\n border-radius: var(--bs-alert-border-radius);\n}\n\n.alert-heading {\n color: inherit;\n}\n\n.alert-link {\n font-weight: 700;\n color: var(--bs-alert-link-color);\n}\n\n.alert-dismissible {\n padding-right: 3rem;\n}\n.alert-dismissible .btn-close {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n padding: 1.25rem 1rem;\n}\n\n.alert-primary {\n --bs-alert-color: var(--bs-primary-text-emphasis);\n --bs-alert-bg: var(--bs-primary-bg-subtle);\n --bs-alert-border-color: var(--bs-primary-border-subtle);\n --bs-alert-link-color: var(--bs-primary-text-emphasis);\n}\n\n.alert-secondary {\n --bs-alert-color: var(--bs-secondary-text-emphasis);\n --bs-alert-bg: var(--bs-secondary-bg-subtle);\n --bs-alert-border-color: var(--bs-secondary-border-subtle);\n --bs-alert-link-color: var(--bs-secondary-text-emphasis);\n}\n\n.alert-success {\n --bs-alert-color: var(--bs-success-text-emphasis);\n --bs-alert-bg: var(--bs-success-bg-subtle);\n --bs-alert-border-color: var(--bs-success-border-subtle);\n --bs-alert-link-color: var(--bs-success-text-emphasis);\n}\n\n.alert-info {\n --bs-alert-color: var(--bs-info-text-emphasis);\n --bs-alert-bg: var(--bs-info-bg-subtle);\n --bs-alert-border-color: var(--bs-info-border-subtle);\n --bs-alert-link-color: var(--bs-info-text-emphasis);\n}\n\n.alert-warning {\n --bs-alert-color: var(--bs-warning-text-emphasis);\n --bs-alert-bg: var(--bs-warning-bg-subtle);\n --bs-alert-border-color: var(--bs-warning-border-subtle);\n --bs-alert-link-color: var(--bs-warning-text-emphasis);\n}\n\n.alert-danger {\n --bs-alert-color: var(--bs-danger-text-emphasis);\n --bs-alert-bg: var(--bs-danger-bg-subtle);\n --bs-alert-border-color: var(--bs-danger-border-subtle);\n --bs-alert-link-color: var(--bs-danger-text-emphasis);\n}\n\n.alert-light {\n --bs-alert-color: var(--bs-light-text-emphasis);\n --bs-alert-bg: var(--bs-light-bg-subtle);\n --bs-alert-border-color: var(--bs-light-border-subtle);\n --bs-alert-link-color: var(--bs-light-text-emphasis);\n}\n\n.alert-dark {\n --bs-alert-color: var(--bs-dark-text-emphasis);\n --bs-alert-bg: var(--bs-dark-bg-subtle);\n --bs-alert-border-color: var(--bs-dark-border-subtle);\n --bs-alert-link-color: var(--bs-dark-text-emphasis);\n}\n\n@keyframes progress-bar-stripes {\n 0% {\n background-position-x: 1rem;\n }\n}\n.progress,\n.progress-stacked {\n --bs-progress-height: 1rem;\n --bs-progress-font-size: 0.75rem;\n --bs-progress-bg: var(--bs-secondary-bg);\n --bs-progress-border-radius: var(--bs-border-radius);\n --bs-progress-box-shadow: var(--bs-box-shadow-inset);\n --bs-progress-bar-color: #fff;\n --bs-progress-bar-bg: #0d6efd;\n --bs-progress-bar-transition: width 0.6s ease;\n display: flex;\n height: var(--bs-progress-height);\n overflow: hidden;\n font-size: var(--bs-progress-font-size);\n background-color: var(--bs-progress-bg);\n border-radius: var(--bs-progress-border-radius);\n}\n\n.progress-bar {\n display: flex;\n flex-direction: column;\n justify-content: center;\n overflow: hidden;\n color: var(--bs-progress-bar-color);\n text-align: center;\n white-space: nowrap;\n background-color: var(--bs-progress-bar-bg);\n transition: var(--bs-progress-bar-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n .progress-bar {\n transition: none;\n }\n}\n\n.progress-bar-striped {\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: var(--bs-progress-height) var(--bs-progress-height);\n}\n\n.progress-stacked > .progress {\n overflow: visible;\n}\n\n.progress-stacked > .progress > .progress-bar {\n width: 100%;\n}\n\n.progress-bar-animated {\n animation: 1s linear infinite progress-bar-stripes;\n}\n@media (prefers-reduced-motion: reduce) {\n .progress-bar-animated {\n animation: none;\n }\n}\n\n.list-group {\n --bs-list-group-color: var(--bs-body-color);\n --bs-list-group-bg: var(--bs-body-bg);\n --bs-list-group-border-color: var(--bs-border-color);\n --bs-list-group-border-width: var(--bs-border-width);\n --bs-list-group-border-radius: var(--bs-border-radius);\n --bs-list-group-item-padding-x: 1rem;\n --bs-list-group-item-padding-y: 0.5rem;\n --bs-list-group-action-color: var(--bs-secondary-color);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-tertiary-bg);\n --bs-list-group-action-active-color: var(--bs-body-color);\n --bs-list-group-action-active-bg: var(--bs-secondary-bg);\n --bs-list-group-disabled-color: var(--bs-secondary-color);\n --bs-list-group-disabled-bg: var(--bs-body-bg);\n --bs-list-group-active-color: #fff;\n --bs-list-group-active-bg: #0d6efd;\n --bs-list-group-active-border-color: #0d6efd;\n display: flex;\n flex-direction: column;\n padding-left: 0;\n margin-bottom: 0;\n border-radius: var(--bs-list-group-border-radius);\n}\n\n.list-group-numbered {\n list-style-type: none;\n counter-reset: section;\n}\n.list-group-numbered > .list-group-item::before {\n content: counters(section, \".\") \". \";\n counter-increment: section;\n}\n\n.list-group-item-action {\n width: 100%;\n color: var(--bs-list-group-action-color);\n text-align: inherit;\n}\n.list-group-item-action:hover, .list-group-item-action:focus {\n z-index: 1;\n color: var(--bs-list-group-action-hover-color);\n text-decoration: none;\n background-color: var(--bs-list-group-action-hover-bg);\n}\n.list-group-item-action:active {\n color: var(--bs-list-group-action-active-color);\n background-color: var(--bs-list-group-action-active-bg);\n}\n\n.list-group-item {\n position: relative;\n display: block;\n padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x);\n color: var(--bs-list-group-color);\n text-decoration: none;\n background-color: var(--bs-list-group-bg);\n border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color);\n}\n.list-group-item:first-child {\n border-top-left-radius: inherit;\n border-top-right-radius: inherit;\n}\n.list-group-item:last-child {\n border-bottom-right-radius: inherit;\n border-bottom-left-radius: inherit;\n}\n.list-group-item.disabled, .list-group-item:disabled {\n color: var(--bs-list-group-disabled-color);\n pointer-events: none;\n background-color: var(--bs-list-group-disabled-bg);\n}\n.list-group-item.active {\n z-index: 2;\n color: var(--bs-list-group-active-color);\n background-color: var(--bs-list-group-active-bg);\n border-color: var(--bs-list-group-active-border-color);\n}\n.list-group-item + .list-group-item {\n border-top-width: 0;\n}\n.list-group-item + .list-group-item.active {\n margin-top: calc(-1 * var(--bs-list-group-border-width));\n border-top-width: var(--bs-list-group-border-width);\n}\n\n.list-group-horizontal {\n flex-direction: row;\n}\n.list-group-horizontal > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n}\n.list-group-horizontal > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n}\n.list-group-horizontal > .list-group-item.active {\n margin-top: 0;\n}\n.list-group-horizontal > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n}\n.list-group-horizontal > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n}\n\n@media (min-width: 576px) {\n .list-group-horizontal-sm {\n flex-direction: row;\n }\n .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n }\n .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-sm > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-sm > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n }\n .list-group-horizontal-sm > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n }\n}\n@media (min-width: 768px) {\n .list-group-horizontal-md {\n flex-direction: row;\n }\n .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n }\n .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-md > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-md > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n }\n .list-group-horizontal-md > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n }\n}\n@media (min-width: 992px) {\n .list-group-horizontal-lg {\n flex-direction: row;\n }\n .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n }\n .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-lg > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-lg > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n }\n .list-group-horizontal-lg > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n }\n}\n@media (min-width: 1200px) {\n .list-group-horizontal-xl {\n flex-direction: row;\n }\n .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-xl > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-xl > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n }\n .list-group-horizontal-xl > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n }\n}\n@media (min-width: 1400px) {\n .list-group-horizontal-xxl {\n flex-direction: row;\n }\n .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) {\n border-bottom-left-radius: var(--bs-list-group-border-radius);\n border-top-right-radius: 0;\n }\n .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) {\n border-top-right-radius: var(--bs-list-group-border-radius);\n border-bottom-left-radius: 0;\n }\n .list-group-horizontal-xxl > .list-group-item.active {\n margin-top: 0;\n }\n .list-group-horizontal-xxl > .list-group-item + .list-group-item {\n border-top-width: var(--bs-list-group-border-width);\n border-left-width: 0;\n }\n .list-group-horizontal-xxl > .list-group-item + .list-group-item.active {\n margin-left: calc(-1 * var(--bs-list-group-border-width));\n border-left-width: var(--bs-list-group-border-width);\n }\n}\n.list-group-flush {\n border-radius: 0;\n}\n.list-group-flush > .list-group-item {\n border-width: 0 0 var(--bs-list-group-border-width);\n}\n.list-group-flush > .list-group-item:last-child {\n border-bottom-width: 0;\n}\n\n.list-group-item-primary {\n --bs-list-group-color: var(--bs-primary-text-emphasis);\n --bs-list-group-bg: var(--bs-primary-bg-subtle);\n --bs-list-group-border-color: var(--bs-primary-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-primary-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-primary-border-subtle);\n --bs-list-group-active-color: var(--bs-primary-bg-subtle);\n --bs-list-group-active-bg: var(--bs-primary-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-primary-text-emphasis);\n}\n\n.list-group-item-secondary {\n --bs-list-group-color: var(--bs-secondary-text-emphasis);\n --bs-list-group-bg: var(--bs-secondary-bg-subtle);\n --bs-list-group-border-color: var(--bs-secondary-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-secondary-border-subtle);\n --bs-list-group-active-color: var(--bs-secondary-bg-subtle);\n --bs-list-group-active-bg: var(--bs-secondary-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-secondary-text-emphasis);\n}\n\n.list-group-item-success {\n --bs-list-group-color: var(--bs-success-text-emphasis);\n --bs-list-group-bg: var(--bs-success-bg-subtle);\n --bs-list-group-border-color: var(--bs-success-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-success-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-success-border-subtle);\n --bs-list-group-active-color: var(--bs-success-bg-subtle);\n --bs-list-group-active-bg: var(--bs-success-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-success-text-emphasis);\n}\n\n.list-group-item-info {\n --bs-list-group-color: var(--bs-info-text-emphasis);\n --bs-list-group-bg: var(--bs-info-bg-subtle);\n --bs-list-group-border-color: var(--bs-info-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-info-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-info-border-subtle);\n --bs-list-group-active-color: var(--bs-info-bg-subtle);\n --bs-list-group-active-bg: var(--bs-info-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-info-text-emphasis);\n}\n\n.list-group-item-warning {\n --bs-list-group-color: var(--bs-warning-text-emphasis);\n --bs-list-group-bg: var(--bs-warning-bg-subtle);\n --bs-list-group-border-color: var(--bs-warning-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-warning-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-warning-border-subtle);\n --bs-list-group-active-color: var(--bs-warning-bg-subtle);\n --bs-list-group-active-bg: var(--bs-warning-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-warning-text-emphasis);\n}\n\n.list-group-item-danger {\n --bs-list-group-color: var(--bs-danger-text-emphasis);\n --bs-list-group-bg: var(--bs-danger-bg-subtle);\n --bs-list-group-border-color: var(--bs-danger-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-danger-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-danger-border-subtle);\n --bs-list-group-active-color: var(--bs-danger-bg-subtle);\n --bs-list-group-active-bg: var(--bs-danger-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-danger-text-emphasis);\n}\n\n.list-group-item-light {\n --bs-list-group-color: var(--bs-light-text-emphasis);\n --bs-list-group-bg: var(--bs-light-bg-subtle);\n --bs-list-group-border-color: var(--bs-light-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-light-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-light-border-subtle);\n --bs-list-group-active-color: var(--bs-light-bg-subtle);\n --bs-list-group-active-bg: var(--bs-light-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-light-text-emphasis);\n}\n\n.list-group-item-dark {\n --bs-list-group-color: var(--bs-dark-text-emphasis);\n --bs-list-group-bg: var(--bs-dark-bg-subtle);\n --bs-list-group-border-color: var(--bs-dark-border-subtle);\n --bs-list-group-action-hover-color: var(--bs-emphasis-color);\n --bs-list-group-action-hover-bg: var(--bs-dark-border-subtle);\n --bs-list-group-action-active-color: var(--bs-emphasis-color);\n --bs-list-group-action-active-bg: var(--bs-dark-border-subtle);\n --bs-list-group-active-color: var(--bs-dark-bg-subtle);\n --bs-list-group-active-bg: var(--bs-dark-text-emphasis);\n --bs-list-group-active-border-color: var(--bs-dark-text-emphasis);\n}\n\n.btn-close {\n --bs-btn-close-color: #000;\n --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\");\n --bs-btn-close-opacity: 0.5;\n --bs-btn-close-hover-opacity: 0.75;\n --bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);\n --bs-btn-close-focus-opacity: 1;\n --bs-btn-close-disabled-opacity: 0.25;\n --bs-btn-close-white-filter: invert(1) grayscale(100%) brightness(200%);\n box-sizing: content-box;\n width: 1em;\n height: 1em;\n padding: 0.25em 0.25em;\n color: var(--bs-btn-close-color);\n background: transparent var(--bs-btn-close-bg) center/1em auto no-repeat;\n border: 0;\n border-radius: 0.375rem;\n opacity: var(--bs-btn-close-opacity);\n}\n.btn-close:hover {\n color: var(--bs-btn-close-color);\n text-decoration: none;\n opacity: var(--bs-btn-close-hover-opacity);\n}\n.btn-close:focus {\n outline: 0;\n box-shadow: var(--bs-btn-close-focus-shadow);\n opacity: var(--bs-btn-close-focus-opacity);\n}\n.btn-close:disabled, .btn-close.disabled {\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n opacity: var(--bs-btn-close-disabled-opacity);\n}\n\n.btn-close-white {\n filter: var(--bs-btn-close-white-filter);\n}\n\n[data-bs-theme=dark] .btn-close {\n filter: var(--bs-btn-close-white-filter);\n}\n\n.toast {\n --bs-toast-zindex: 1090;\n --bs-toast-padding-x: 0.75rem;\n --bs-toast-padding-y: 0.5rem;\n --bs-toast-spacing: 1.5rem;\n --bs-toast-max-width: 350px;\n --bs-toast-font-size: 0.875rem;\n --bs-toast-color: ;\n --bs-toast-bg: rgba(var(--bs-body-bg-rgb), 0.85);\n --bs-toast-border-width: var(--bs-border-width);\n --bs-toast-border-color: var(--bs-border-color-translucent);\n --bs-toast-border-radius: var(--bs-border-radius);\n --bs-toast-box-shadow: var(--bs-box-shadow);\n --bs-toast-header-color: var(--bs-secondary-color);\n --bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), 0.85);\n --bs-toast-header-border-color: var(--bs-border-color-translucent);\n width: var(--bs-toast-max-width);\n max-width: 100%;\n font-size: var(--bs-toast-font-size);\n color: var(--bs-toast-color);\n pointer-events: auto;\n background-color: var(--bs-toast-bg);\n background-clip: padding-box;\n border: var(--bs-toast-border-width) solid var(--bs-toast-border-color);\n box-shadow: var(--bs-toast-box-shadow);\n border-radius: var(--bs-toast-border-radius);\n}\n.toast.showing {\n opacity: 0;\n}\n.toast:not(.show) {\n display: none;\n}\n\n.toast-container {\n --bs-toast-zindex: 1090;\n position: absolute;\n z-index: var(--bs-toast-zindex);\n width: -webkit-max-content;\n width: -moz-max-content;\n width: max-content;\n max-width: 100%;\n pointer-events: none;\n}\n.toast-container > :not(:last-child) {\n margin-bottom: var(--bs-toast-spacing);\n}\n\n.toast-header {\n display: flex;\n align-items: center;\n padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x);\n color: var(--bs-toast-header-color);\n background-color: var(--bs-toast-header-bg);\n background-clip: padding-box;\n border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color);\n border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));\n border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width));\n}\n.toast-header .btn-close {\n margin-right: calc(-0.5 * var(--bs-toast-padding-x));\n margin-left: var(--bs-toast-padding-x);\n}\n\n.toast-body {\n padding: var(--bs-toast-padding-x);\n word-wrap: break-word;\n}\n\n.modal {\n --bs-modal-zindex: 1055;\n --bs-modal-width: 500px;\n --bs-modal-padding: 1rem;\n --bs-modal-margin: 0.5rem;\n --bs-modal-color: ;\n --bs-modal-bg: var(--bs-body-bg);\n --bs-modal-border-color: var(--bs-border-color-translucent);\n --bs-modal-border-width: var(--bs-border-width);\n --bs-modal-border-radius: var(--bs-border-radius-lg);\n --bs-modal-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);\n --bs-modal-inner-border-radius: calc(var(--bs-border-radius-lg) - (var(--bs-border-width)));\n --bs-modal-header-padding-x: 1rem;\n --bs-modal-header-padding-y: 1rem;\n --bs-modal-header-padding: 1rem 1rem;\n --bs-modal-header-border-color: var(--bs-border-color);\n --bs-modal-header-border-width: var(--bs-border-width);\n --bs-modal-title-line-height: 1.5;\n --bs-modal-footer-gap: 0.5rem;\n --bs-modal-footer-bg: ;\n --bs-modal-footer-border-color: var(--bs-border-color);\n --bs-modal-footer-border-width: var(--bs-border-width);\n position: fixed;\n top: 0;\n left: 0;\n z-index: var(--bs-modal-zindex);\n display: none;\n width: 100%;\n height: 100%;\n overflow-x: hidden;\n overflow-y: auto;\n outline: 0;\n}\n\n.modal-dialog {\n position: relative;\n width: auto;\n margin: var(--bs-modal-margin);\n pointer-events: none;\n}\n.modal.fade .modal-dialog {\n transition: transform 0.3s ease-out;\n transform: translate(0, -50px);\n}\n@media (prefers-reduced-motion: reduce) {\n .modal.fade .modal-dialog {\n transition: none;\n }\n}\n.modal.show .modal-dialog {\n transform: none;\n}\n.modal.modal-static .modal-dialog {\n transform: scale(1.02);\n}\n\n.modal-dialog-scrollable {\n height: calc(100% - var(--bs-modal-margin) * 2);\n}\n.modal-dialog-scrollable .modal-content {\n max-height: 100%;\n overflow: hidden;\n}\n.modal-dialog-scrollable .modal-body {\n overflow-y: auto;\n}\n\n.modal-dialog-centered {\n display: flex;\n align-items: center;\n min-height: calc(100% - var(--bs-modal-margin) * 2);\n}\n\n.modal-content {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n color: var(--bs-modal-color);\n pointer-events: auto;\n background-color: var(--bs-modal-bg);\n background-clip: padding-box;\n border: var(--bs-modal-border-width) solid var(--bs-modal-border-color);\n border-radius: var(--bs-modal-border-radius);\n outline: 0;\n}\n\n.modal-backdrop {\n --bs-backdrop-zindex: 1050;\n --bs-backdrop-bg: #000;\n --bs-backdrop-opacity: 0.5;\n position: fixed;\n top: 0;\n left: 0;\n z-index: var(--bs-backdrop-zindex);\n width: 100vw;\n height: 100vh;\n background-color: var(--bs-backdrop-bg);\n}\n.modal-backdrop.fade {\n opacity: 0;\n}\n.modal-backdrop.show {\n opacity: var(--bs-backdrop-opacity);\n}\n\n.modal-header {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: space-between;\n padding: var(--bs-modal-header-padding);\n border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color);\n border-top-left-radius: var(--bs-modal-inner-border-radius);\n border-top-right-radius: var(--bs-modal-inner-border-radius);\n}\n.modal-header .btn-close {\n padding: calc(var(--bs-modal-header-padding-y) * 0.5) calc(var(--bs-modal-header-padding-x) * 0.5);\n margin: calc(-0.5 * var(--bs-modal-header-padding-y)) calc(-0.5 * var(--bs-modal-header-padding-x)) calc(-0.5 * var(--bs-modal-header-padding-y)) auto;\n}\n\n.modal-title {\n margin-bottom: 0;\n line-height: var(--bs-modal-title-line-height);\n}\n\n.modal-body {\n position: relative;\n flex: 1 1 auto;\n padding: var(--bs-modal-padding);\n}\n\n.modal-footer {\n display: flex;\n flex-shrink: 0;\n flex-wrap: wrap;\n align-items: center;\n justify-content: flex-end;\n padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5);\n background-color: var(--bs-modal-footer-bg);\n border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color);\n border-bottom-right-radius: var(--bs-modal-inner-border-radius);\n border-bottom-left-radius: var(--bs-modal-inner-border-radius);\n}\n.modal-footer > * {\n margin: calc(var(--bs-modal-footer-gap) * 0.5);\n}\n\n@media (min-width: 576px) {\n .modal {\n --bs-modal-margin: 1.75rem;\n --bs-modal-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n }\n .modal-dialog {\n max-width: var(--bs-modal-width);\n margin-right: auto;\n margin-left: auto;\n }\n .modal-sm {\n --bs-modal-width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg,\n .modal-xl {\n --bs-modal-width: 800px;\n }\n}\n@media (min-width: 1200px) {\n .modal-xl {\n --bs-modal-width: 1140px;\n }\n}\n.modal-fullscreen {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n}\n.modal-fullscreen .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n}\n.modal-fullscreen .modal-header,\n.modal-fullscreen .modal-footer {\n border-radius: 0;\n}\n.modal-fullscreen .modal-body {\n overflow-y: auto;\n}\n\n@media (max-width: 575.98px) {\n .modal-fullscreen-sm-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-sm-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-sm-down .modal-header,\n .modal-fullscreen-sm-down .modal-footer {\n border-radius: 0;\n }\n .modal-fullscreen-sm-down .modal-body {\n overflow-y: auto;\n }\n}\n@media (max-width: 767.98px) {\n .modal-fullscreen-md-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-md-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-md-down .modal-header,\n .modal-fullscreen-md-down .modal-footer {\n border-radius: 0;\n }\n .modal-fullscreen-md-down .modal-body {\n overflow-y: auto;\n }\n}\n@media (max-width: 991.98px) {\n .modal-fullscreen-lg-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-lg-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-lg-down .modal-header,\n .modal-fullscreen-lg-down .modal-footer {\n border-radius: 0;\n }\n .modal-fullscreen-lg-down .modal-body {\n overflow-y: auto;\n }\n}\n@media (max-width: 1199.98px) {\n .modal-fullscreen-xl-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-xl-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-xl-down .modal-header,\n .modal-fullscreen-xl-down .modal-footer {\n border-radius: 0;\n }\n .modal-fullscreen-xl-down .modal-body {\n overflow-y: auto;\n }\n}\n@media (max-width: 1399.98px) {\n .modal-fullscreen-xxl-down {\n width: 100vw;\n max-width: none;\n height: 100%;\n margin: 0;\n }\n .modal-fullscreen-xxl-down .modal-content {\n height: 100%;\n border: 0;\n border-radius: 0;\n }\n .modal-fullscreen-xxl-down .modal-header,\n .modal-fullscreen-xxl-down .modal-footer {\n border-radius: 0;\n }\n .modal-fullscreen-xxl-down .modal-body {\n overflow-y: auto;\n }\n}\n.tooltip {\n --bs-tooltip-zindex: 1080;\n --bs-tooltip-max-width: 200px;\n --bs-tooltip-padding-x: 0.5rem;\n --bs-tooltip-padding-y: 0.25rem;\n --bs-tooltip-margin: ;\n --bs-tooltip-font-size: 0.875rem;\n --bs-tooltip-color: var(--bs-body-bg);\n --bs-tooltip-bg: var(--bs-emphasis-color);\n --bs-tooltip-border-radius: var(--bs-border-radius);\n --bs-tooltip-opacity: 0.9;\n --bs-tooltip-arrow-width: 0.8rem;\n --bs-tooltip-arrow-height: 0.4rem;\n z-index: var(--bs-tooltip-zindex);\n display: block;\n margin: var(--bs-tooltip-margin);\n font-family: var(--bs-font-sans-serif);\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n white-space: normal;\n word-spacing: normal;\n line-break: auto;\n font-size: var(--bs-tooltip-font-size);\n word-wrap: break-word;\n opacity: 0;\n}\n.tooltip.show {\n opacity: var(--bs-tooltip-opacity);\n}\n.tooltip .tooltip-arrow {\n display: block;\n width: var(--bs-tooltip-arrow-width);\n height: var(--bs-tooltip-arrow-height);\n}\n.tooltip .tooltip-arrow::before {\n position: absolute;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n}\n\n.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow {\n bottom: calc(-1 * var(--bs-tooltip-arrow-height));\n}\n.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before {\n top: -1px;\n border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0;\n border-top-color: var(--bs-tooltip-bg);\n}\n\n/* rtl:begin:ignore */\n.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow {\n left: calc(-1 * var(--bs-tooltip-arrow-height));\n width: var(--bs-tooltip-arrow-height);\n height: var(--bs-tooltip-arrow-width);\n}\n.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before {\n right: -1px;\n border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0;\n border-right-color: var(--bs-tooltip-bg);\n}\n\n/* rtl:end:ignore */\n.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow {\n top: calc(-1 * var(--bs-tooltip-arrow-height));\n}\n.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before {\n bottom: -1px;\n border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height);\n border-bottom-color: var(--bs-tooltip-bg);\n}\n\n/* rtl:begin:ignore */\n.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow {\n right: calc(-1 * var(--bs-tooltip-arrow-height));\n width: var(--bs-tooltip-arrow-height);\n height: var(--bs-tooltip-arrow-width);\n}\n.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before {\n left: -1px;\n border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height);\n border-left-color: var(--bs-tooltip-bg);\n}\n\n/* rtl:end:ignore */\n.tooltip-inner {\n max-width: var(--bs-tooltip-max-width);\n padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x);\n color: var(--bs-tooltip-color);\n text-align: center;\n background-color: var(--bs-tooltip-bg);\n border-radius: var(--bs-tooltip-border-radius);\n}\n\n.popover {\n --bs-popover-zindex: 1070;\n --bs-popover-max-width: 276px;\n --bs-popover-font-size: 0.875rem;\n --bs-popover-bg: var(--bs-body-bg);\n --bs-popover-border-width: var(--bs-border-width);\n --bs-popover-border-color: var(--bs-border-color-translucent);\n --bs-popover-border-radius: var(--bs-border-radius-lg);\n --bs-popover-inner-border-radius: calc(var(--bs-border-radius-lg) - var(--bs-border-width));\n --bs-popover-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);\n --bs-popover-header-padding-x: 1rem;\n --bs-popover-header-padding-y: 0.5rem;\n --bs-popover-header-font-size: 1rem;\n --bs-popover-header-color: inherit;\n --bs-popover-header-bg: var(--bs-secondary-bg);\n --bs-popover-body-padding-x: 1rem;\n --bs-popover-body-padding-y: 1rem;\n --bs-popover-body-color: var(--bs-body-color);\n --bs-popover-arrow-width: 1rem;\n --bs-popover-arrow-height: 0.5rem;\n --bs-popover-arrow-border: var(--bs-popover-border-color);\n z-index: var(--bs-popover-zindex);\n display: block;\n max-width: var(--bs-popover-max-width);\n font-family: var(--bs-font-sans-serif);\n font-style: normal;\n font-weight: 400;\n line-height: 1.5;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n white-space: normal;\n word-spacing: normal;\n line-break: auto;\n font-size: var(--bs-popover-font-size);\n word-wrap: break-word;\n background-color: var(--bs-popover-bg);\n background-clip: padding-box;\n border: var(--bs-popover-border-width) solid var(--bs-popover-border-color);\n border-radius: var(--bs-popover-border-radius);\n}\n.popover .popover-arrow {\n display: block;\n width: var(--bs-popover-arrow-width);\n height: var(--bs-popover-arrow-height);\n}\n.popover .popover-arrow::before, .popover .popover-arrow::after {\n position: absolute;\n display: block;\n content: \"\";\n border-color: transparent;\n border-style: solid;\n border-width: 0;\n}\n\n.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow {\n bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n}\n.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {\n border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0;\n}\n.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before {\n bottom: 0;\n border-top-color: var(--bs-popover-arrow-border);\n}\n.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after {\n bottom: var(--bs-popover-border-width);\n border-top-color: var(--bs-popover-bg);\n}\n\n/* rtl:begin:ignore */\n.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow {\n left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n width: var(--bs-popover-arrow-height);\n height: var(--bs-popover-arrow-width);\n}\n.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {\n border-width: calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0;\n}\n.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before {\n left: 0;\n border-right-color: var(--bs-popover-arrow-border);\n}\n.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after {\n left: var(--bs-popover-border-width);\n border-right-color: var(--bs-popover-bg);\n}\n\n/* rtl:end:ignore */\n.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow {\n top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n}\n.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {\n border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height);\n}\n.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before {\n top: 0;\n border-bottom-color: var(--bs-popover-arrow-border);\n}\n.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after {\n top: var(--bs-popover-border-width);\n border-bottom-color: var(--bs-popover-bg);\n}\n.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before {\n position: absolute;\n top: 0;\n left: 50%;\n display: block;\n width: var(--bs-popover-arrow-width);\n margin-left: calc(-0.5 * var(--bs-popover-arrow-width));\n content: \"\";\n border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg);\n}\n\n/* rtl:begin:ignore */\n.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow {\n right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width));\n width: var(--bs-popover-arrow-height);\n height: var(--bs-popover-arrow-width);\n}\n.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {\n border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height);\n}\n.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before {\n right: 0;\n border-left-color: var(--bs-popover-arrow-border);\n}\n.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after {\n right: var(--bs-popover-border-width);\n border-left-color: var(--bs-popover-bg);\n}\n\n/* rtl:end:ignore */\n.popover-header {\n padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x);\n margin-bottom: 0;\n font-size: var(--bs-popover-header-font-size);\n color: var(--bs-popover-header-color);\n background-color: var(--bs-popover-header-bg);\n border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color);\n border-top-left-radius: var(--bs-popover-inner-border-radius);\n border-top-right-radius: var(--bs-popover-inner-border-radius);\n}\n.popover-header:empty {\n display: none;\n}\n\n.popover-body {\n padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x);\n color: var(--bs-popover-body-color);\n}\n\n.carousel {\n position: relative;\n}\n\n.carousel.pointer-event {\n touch-action: pan-y;\n}\n\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.carousel-item {\n position: relative;\n display: none;\n float: left;\n width: 100%;\n margin-right: -100%;\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n transition: transform 0.6s ease-in-out;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-item {\n transition: none;\n }\n}\n\n.carousel-item.active,\n.carousel-item-next,\n.carousel-item-prev {\n display: block;\n}\n\n.carousel-item-next:not(.carousel-item-start),\n.active.carousel-item-end {\n transform: translateX(100%);\n}\n\n.carousel-item-prev:not(.carousel-item-end),\n.active.carousel-item-start {\n transform: translateX(-100%);\n}\n\n.carousel-fade .carousel-item {\n opacity: 0;\n transition-property: opacity;\n transform: none;\n}\n.carousel-fade .carousel-item.active,\n.carousel-fade .carousel-item-next.carousel-item-start,\n.carousel-fade .carousel-item-prev.carousel-item-end {\n z-index: 1;\n opacity: 1;\n}\n.carousel-fade .active.carousel-item-start,\n.carousel-fade .active.carousel-item-end {\n z-index: 0;\n opacity: 0;\n transition: opacity 0s 0.6s;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-fade .active.carousel-item-start,\n .carousel-fade .active.carousel-item-end {\n transition: none;\n }\n}\n\n.carousel-control-prev,\n.carousel-control-next {\n position: absolute;\n top: 0;\n bottom: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 15%;\n padding: 0;\n color: #fff;\n text-align: center;\n background: none;\n border: 0;\n opacity: 0.5;\n transition: opacity 0.15s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-control-prev,\n .carousel-control-next {\n transition: none;\n }\n}\n.carousel-control-prev:hover, .carousel-control-prev:focus,\n.carousel-control-next:hover,\n.carousel-control-next:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n opacity: 0.9;\n}\n\n.carousel-control-prev {\n left: 0;\n}\n\n.carousel-control-next {\n right: 0;\n}\n\n.carousel-control-prev-icon,\n.carousel-control-next-icon {\n display: inline-block;\n width: 2rem;\n height: 2rem;\n background-repeat: no-repeat;\n background-position: 50%;\n background-size: 100% 100%;\n}\n\n/* rtl:options: {\n \"autoRename\": true,\n \"stringMap\":[ {\n \"name\" : \"prev-next\",\n \"search\" : \"prev\",\n \"replace\" : \"next\"\n } ]\n} */\n.carousel-control-prev-icon {\n 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\");\n}\n\n.carousel-control-next-icon {\n 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\");\n}\n\n.carousel-indicators {\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 2;\n display: flex;\n justify-content: center;\n padding: 0;\n margin-right: 15%;\n margin-bottom: 1rem;\n margin-left: 15%;\n}\n.carousel-indicators [data-bs-target] {\n box-sizing: content-box;\n flex: 0 1 auto;\n width: 30px;\n height: 3px;\n padding: 0;\n margin-right: 3px;\n margin-left: 3px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #fff;\n background-clip: padding-box;\n border: 0;\n border-top: 10px solid transparent;\n border-bottom: 10px solid transparent;\n opacity: 0.5;\n transition: opacity 0.6s ease;\n}\n@media (prefers-reduced-motion: reduce) {\n .carousel-indicators [data-bs-target] {\n transition: none;\n }\n}\n.carousel-indicators .active {\n opacity: 1;\n}\n\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 1.25rem;\n left: 15%;\n padding-top: 1.25rem;\n padding-bottom: 1.25rem;\n color: #fff;\n text-align: center;\n}\n\n.carousel-dark .carousel-control-prev-icon,\n.carousel-dark .carousel-control-next-icon {\n filter: invert(1) grayscale(100);\n}\n.carousel-dark .carousel-indicators [data-bs-target] {\n background-color: #000;\n}\n.carousel-dark .carousel-caption {\n color: #000;\n}\n\n[data-bs-theme=dark] .carousel .carousel-control-prev-icon,\n[data-bs-theme=dark] .carousel .carousel-control-next-icon, [data-bs-theme=dark].carousel .carousel-control-prev-icon,\n[data-bs-theme=dark].carousel .carousel-control-next-icon {\n filter: invert(1) grayscale(100);\n}\n[data-bs-theme=dark] .carousel .carousel-indicators [data-bs-target], [data-bs-theme=dark].carousel .carousel-indicators [data-bs-target] {\n background-color: #000;\n}\n[data-bs-theme=dark] .carousel .carousel-caption, [data-bs-theme=dark].carousel .carousel-caption {\n color: #000;\n}\n\n.spinner-grow,\n.spinner-border {\n display: inline-block;\n width: var(--bs-spinner-width);\n height: var(--bs-spinner-height);\n vertical-align: var(--bs-spinner-vertical-align);\n border-radius: 50%;\n animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name);\n}\n\n@keyframes spinner-border {\n to {\n transform: rotate(360deg) /* rtl:ignore */;\n }\n}\n.spinner-border {\n --bs-spinner-width: 2rem;\n --bs-spinner-height: 2rem;\n --bs-spinner-vertical-align: -0.125em;\n --bs-spinner-border-width: 0.25em;\n --bs-spinner-animation-speed: 0.75s;\n --bs-spinner-animation-name: spinner-border;\n border: var(--bs-spinner-border-width) solid currentcolor;\n border-right-color: transparent;\n}\n\n.spinner-border-sm {\n --bs-spinner-width: 1rem;\n --bs-spinner-height: 1rem;\n --bs-spinner-border-width: 0.2em;\n}\n\n@keyframes spinner-grow {\n 0% {\n transform: scale(0);\n }\n 50% {\n opacity: 1;\n transform: none;\n }\n}\n.spinner-grow {\n --bs-spinner-width: 2rem;\n --bs-spinner-height: 2rem;\n --bs-spinner-vertical-align: -0.125em;\n --bs-spinner-animation-speed: 0.75s;\n --bs-spinner-animation-name: spinner-grow;\n background-color: currentcolor;\n opacity: 0;\n}\n\n.spinner-grow-sm {\n --bs-spinner-width: 1rem;\n --bs-spinner-height: 1rem;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .spinner-border,\n .spinner-grow {\n --bs-spinner-animation-speed: 1.5s;\n }\n}\n.offcanvas, .offcanvas-xxl, .offcanvas-xl, .offcanvas-lg, .offcanvas-md, .offcanvas-sm {\n --bs-offcanvas-zindex: 1045;\n --bs-offcanvas-width: 400px;\n --bs-offcanvas-height: 30vh;\n --bs-offcanvas-padding-x: 1rem;\n --bs-offcanvas-padding-y: 1rem;\n --bs-offcanvas-color: var(--bs-body-color);\n --bs-offcanvas-bg: var(--bs-body-bg);\n --bs-offcanvas-border-width: var(--bs-border-width);\n --bs-offcanvas-border-color: var(--bs-border-color-translucent);\n --bs-offcanvas-box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075);\n --bs-offcanvas-transition: transform 0.3s ease-in-out;\n --bs-offcanvas-title-line-height: 1.5;\n}\n\n@media (max-width: 575.98px) {\n .offcanvas-sm {\n position: fixed;\n bottom: 0;\n z-index: var(--bs-offcanvas-zindex);\n display: flex;\n flex-direction: column;\n max-width: 100%;\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n background-clip: padding-box;\n outline: 0;\n transition: var(--bs-offcanvas-transition);\n }\n}\n@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) {\n .offcanvas-sm {\n transition: none;\n }\n}\n@media (max-width: 575.98px) {\n .offcanvas-sm.offcanvas-start {\n top: 0;\n left: 0;\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(-100%);\n }\n .offcanvas-sm.offcanvas-end {\n top: 0;\n right: 0;\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(100%);\n }\n .offcanvas-sm.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(-100%);\n }\n .offcanvas-sm.offcanvas-bottom {\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(100%);\n }\n .offcanvas-sm.showing, .offcanvas-sm.show:not(.hiding) {\n transform: none;\n }\n .offcanvas-sm.showing, .offcanvas-sm.hiding, .offcanvas-sm.show {\n visibility: visible;\n }\n}\n@media (min-width: 576px) {\n .offcanvas-sm {\n --bs-offcanvas-height: auto;\n --bs-offcanvas-border-width: 0;\n background-color: transparent !important;\n }\n .offcanvas-sm .offcanvas-header {\n display: none;\n }\n .offcanvas-sm .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n background-color: transparent !important;\n }\n}\n\n@media (max-width: 767.98px) {\n .offcanvas-md {\n position: fixed;\n bottom: 0;\n z-index: var(--bs-offcanvas-zindex);\n display: flex;\n flex-direction: column;\n max-width: 100%;\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n background-clip: padding-box;\n outline: 0;\n transition: var(--bs-offcanvas-transition);\n }\n}\n@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) {\n .offcanvas-md {\n transition: none;\n }\n}\n@media (max-width: 767.98px) {\n .offcanvas-md.offcanvas-start {\n top: 0;\n left: 0;\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(-100%);\n }\n .offcanvas-md.offcanvas-end {\n top: 0;\n right: 0;\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(100%);\n }\n .offcanvas-md.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(-100%);\n }\n .offcanvas-md.offcanvas-bottom {\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(100%);\n }\n .offcanvas-md.showing, .offcanvas-md.show:not(.hiding) {\n transform: none;\n }\n .offcanvas-md.showing, .offcanvas-md.hiding, .offcanvas-md.show {\n visibility: visible;\n }\n}\n@media (min-width: 768px) {\n .offcanvas-md {\n --bs-offcanvas-height: auto;\n --bs-offcanvas-border-width: 0;\n background-color: transparent !important;\n }\n .offcanvas-md .offcanvas-header {\n display: none;\n }\n .offcanvas-md .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n background-color: transparent !important;\n }\n}\n\n@media (max-width: 991.98px) {\n .offcanvas-lg {\n position: fixed;\n bottom: 0;\n z-index: var(--bs-offcanvas-zindex);\n display: flex;\n flex-direction: column;\n max-width: 100%;\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n background-clip: padding-box;\n outline: 0;\n transition: var(--bs-offcanvas-transition);\n }\n}\n@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) {\n .offcanvas-lg {\n transition: none;\n }\n}\n@media (max-width: 991.98px) {\n .offcanvas-lg.offcanvas-start {\n top: 0;\n left: 0;\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(-100%);\n }\n .offcanvas-lg.offcanvas-end {\n top: 0;\n right: 0;\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(100%);\n }\n .offcanvas-lg.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(-100%);\n }\n .offcanvas-lg.offcanvas-bottom {\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(100%);\n }\n .offcanvas-lg.showing, .offcanvas-lg.show:not(.hiding) {\n transform: none;\n }\n .offcanvas-lg.showing, .offcanvas-lg.hiding, .offcanvas-lg.show {\n visibility: visible;\n }\n}\n@media (min-width: 992px) {\n .offcanvas-lg {\n --bs-offcanvas-height: auto;\n --bs-offcanvas-border-width: 0;\n background-color: transparent !important;\n }\n .offcanvas-lg .offcanvas-header {\n display: none;\n }\n .offcanvas-lg .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n background-color: transparent !important;\n }\n}\n\n@media (max-width: 1199.98px) {\n .offcanvas-xl {\n position: fixed;\n bottom: 0;\n z-index: var(--bs-offcanvas-zindex);\n display: flex;\n flex-direction: column;\n max-width: 100%;\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n background-clip: padding-box;\n outline: 0;\n transition: var(--bs-offcanvas-transition);\n }\n}\n@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) {\n .offcanvas-xl {\n transition: none;\n }\n}\n@media (max-width: 1199.98px) {\n .offcanvas-xl.offcanvas-start {\n top: 0;\n left: 0;\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(-100%);\n }\n .offcanvas-xl.offcanvas-end {\n top: 0;\n right: 0;\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(100%);\n }\n .offcanvas-xl.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(-100%);\n }\n .offcanvas-xl.offcanvas-bottom {\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(100%);\n }\n .offcanvas-xl.showing, .offcanvas-xl.show:not(.hiding) {\n transform: none;\n }\n .offcanvas-xl.showing, .offcanvas-xl.hiding, .offcanvas-xl.show {\n visibility: visible;\n }\n}\n@media (min-width: 1200px) {\n .offcanvas-xl {\n --bs-offcanvas-height: auto;\n --bs-offcanvas-border-width: 0;\n background-color: transparent !important;\n }\n .offcanvas-xl .offcanvas-header {\n display: none;\n }\n .offcanvas-xl .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n background-color: transparent !important;\n }\n}\n\n@media (max-width: 1399.98px) {\n .offcanvas-xxl {\n position: fixed;\n bottom: 0;\n z-index: var(--bs-offcanvas-zindex);\n display: flex;\n flex-direction: column;\n max-width: 100%;\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n background-clip: padding-box;\n outline: 0;\n transition: var(--bs-offcanvas-transition);\n }\n}\n@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) {\n .offcanvas-xxl {\n transition: none;\n }\n}\n@media (max-width: 1399.98px) {\n .offcanvas-xxl.offcanvas-start {\n top: 0;\n left: 0;\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(-100%);\n }\n .offcanvas-xxl.offcanvas-end {\n top: 0;\n right: 0;\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(100%);\n }\n .offcanvas-xxl.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(-100%);\n }\n .offcanvas-xxl.offcanvas-bottom {\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(100%);\n }\n .offcanvas-xxl.showing, .offcanvas-xxl.show:not(.hiding) {\n transform: none;\n }\n .offcanvas-xxl.showing, .offcanvas-xxl.hiding, .offcanvas-xxl.show {\n visibility: visible;\n }\n}\n@media (min-width: 1400px) {\n .offcanvas-xxl {\n --bs-offcanvas-height: auto;\n --bs-offcanvas-border-width: 0;\n background-color: transparent !important;\n }\n .offcanvas-xxl .offcanvas-header {\n display: none;\n }\n .offcanvas-xxl .offcanvas-body {\n display: flex;\n flex-grow: 0;\n padding: 0;\n overflow-y: visible;\n background-color: transparent !important;\n }\n}\n\n.offcanvas {\n position: fixed;\n bottom: 0;\n z-index: var(--bs-offcanvas-zindex);\n display: flex;\n flex-direction: column;\n max-width: 100%;\n color: var(--bs-offcanvas-color);\n visibility: hidden;\n background-color: var(--bs-offcanvas-bg);\n background-clip: padding-box;\n outline: 0;\n transition: var(--bs-offcanvas-transition);\n}\n@media (prefers-reduced-motion: reduce) {\n .offcanvas {\n transition: none;\n }\n}\n.offcanvas.offcanvas-start {\n top: 0;\n left: 0;\n width: var(--bs-offcanvas-width);\n border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(-100%);\n}\n.offcanvas.offcanvas-end {\n top: 0;\n right: 0;\n width: var(--bs-offcanvas-width);\n border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateX(100%);\n}\n.offcanvas.offcanvas-top {\n top: 0;\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(-100%);\n}\n.offcanvas.offcanvas-bottom {\n right: 0;\n left: 0;\n height: var(--bs-offcanvas-height);\n max-height: 100%;\n border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color);\n transform: translateY(100%);\n}\n.offcanvas.showing, .offcanvas.show:not(.hiding) {\n transform: none;\n}\n.offcanvas.showing, .offcanvas.hiding, .offcanvas.show {\n visibility: visible;\n}\n\n.offcanvas-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n z-index: 1040;\n width: 100vw;\n height: 100vh;\n background-color: #000;\n}\n.offcanvas-backdrop.fade {\n opacity: 0;\n}\n.offcanvas-backdrop.show {\n opacity: 0.5;\n}\n\n.offcanvas-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);\n}\n.offcanvas-header .btn-close {\n padding: calc(var(--bs-offcanvas-padding-y) * 0.5) calc(var(--bs-offcanvas-padding-x) * 0.5);\n margin-top: calc(-0.5 * var(--bs-offcanvas-padding-y));\n margin-right: calc(-0.5 * var(--bs-offcanvas-padding-x));\n margin-bottom: calc(-0.5 * var(--bs-offcanvas-padding-y));\n}\n\n.offcanvas-title {\n margin-bottom: 0;\n line-height: var(--bs-offcanvas-title-line-height);\n}\n\n.offcanvas-body {\n flex-grow: 1;\n padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x);\n overflow-y: auto;\n}\n\n.placeholder {\n display: inline-block;\n min-height: 1em;\n vertical-align: middle;\n cursor: wait;\n background-color: currentcolor;\n opacity: 0.5;\n}\n.placeholder.btn::before {\n display: inline-block;\n content: \"\";\n}\n\n.placeholder-xs {\n min-height: 0.6em;\n}\n\n.placeholder-sm {\n min-height: 0.8em;\n}\n\n.placeholder-lg {\n min-height: 1.2em;\n}\n\n.placeholder-glow .placeholder {\n animation: placeholder-glow 2s ease-in-out infinite;\n}\n\n@keyframes placeholder-glow {\n 50% {\n opacity: 0.2;\n }\n}\n.placeholder-wave {\n -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);\n mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%);\n -webkit-mask-size: 200% 100%;\n mask-size: 200% 100%;\n animation: placeholder-wave 2s linear infinite;\n}\n\n@keyframes placeholder-wave {\n 100% {\n -webkit-mask-position: -200% 0%;\n mask-position: -200% 0%;\n }\n}\n.clearfix::after {\n display: block;\n clear: both;\n content: \"\";\n}\n\n.text-bg-primary {\n color: #fff !important;\n background-color: RGBA(13, 110, 253, var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-secondary {\n color: #fff !important;\n background-color: RGBA(108, 117, 125, var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-success {\n color: #fff !important;\n background-color: RGBA(25, 135, 84, var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-info {\n color: #000 !important;\n background-color: RGBA(13, 202, 240, var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-warning {\n color: #000 !important;\n background-color: RGBA(255, 193, 7, var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-danger {\n color: #fff !important;\n background-color: RGBA(220, 53, 69, var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-light {\n color: #000 !important;\n background-color: RGBA(248, 249, 250, var(--bs-bg-opacity, 1)) !important;\n}\n\n.text-bg-dark {\n color: #fff !important;\n background-color: RGBA(33, 37, 41, var(--bs-bg-opacity, 1)) !important;\n}\n\n.link-primary {\n color: RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-primary:hover, .link-primary:focus {\n color: RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-secondary {\n color: RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-secondary:hover, .link-secondary:focus {\n color: RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-success {\n color: RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-success:hover, .link-success:focus {\n color: RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-info {\n color: RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-info:hover, .link-info:focus {\n color: RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-warning {\n color: RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-warning:hover, .link-warning:focus {\n color: RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-danger {\n color: RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-danger:hover, .link-danger:focus {\n color: RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-light {\n color: RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-light:hover, .link-light:focus {\n color: RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-dark {\n color: RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-dark:hover, .link-dark:focus {\n color: RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-body-emphasis {\n color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n.link-body-emphasis:hover, .link-body-emphasis:focus {\n color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important;\n -webkit-text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important;\n text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important;\n}\n\n.focus-ring:focus {\n outline: 0;\n 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);\n}\n\n.icon-link {\n display: inline-flex;\n gap: 0.375rem;\n align-items: center;\n -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));\n text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5));\n text-underline-offset: 0.25em;\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n}\n.icon-link > .bi {\n flex-shrink: 0;\n width: 1em;\n height: 1em;\n fill: currentcolor;\n transition: 0.2s ease-in-out transform;\n}\n@media (prefers-reduced-motion: reduce) {\n .icon-link > .bi {\n transition: none;\n }\n}\n\n.icon-link-hover:hover > .bi, .icon-link-hover:focus-visible > .bi {\n transform: var(--bs-icon-link-transform, translate3d(0.25em, 0, 0));\n}\n\n.ratio {\n position: relative;\n width: 100%;\n}\n.ratio::before {\n display: block;\n padding-top: var(--bs-aspect-ratio);\n content: \"\";\n}\n.ratio > * {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n}\n\n.ratio-1x1 {\n --bs-aspect-ratio: 100%;\n}\n\n.ratio-4x3 {\n --bs-aspect-ratio: 75%;\n}\n\n.ratio-16x9 {\n --bs-aspect-ratio: 56.25%;\n}\n\n.ratio-21x9 {\n --bs-aspect-ratio: 42.8571428571%;\n}\n\n.fixed-top {\n position: fixed;\n top: 0;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n\n.fixed-bottom {\n position: fixed;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1030;\n}\n\n.sticky-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n}\n\n.sticky-bottom {\n position: -webkit-sticky;\n position: sticky;\n bottom: 0;\n z-index: 1020;\n}\n\n@media (min-width: 576px) {\n .sticky-sm-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n .sticky-sm-bottom {\n position: -webkit-sticky;\n position: sticky;\n bottom: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 768px) {\n .sticky-md-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n .sticky-md-bottom {\n position: -webkit-sticky;\n position: sticky;\n bottom: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 992px) {\n .sticky-lg-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n .sticky-lg-bottom {\n position: -webkit-sticky;\n position: sticky;\n bottom: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 1200px) {\n .sticky-xl-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n .sticky-xl-bottom {\n position: -webkit-sticky;\n position: sticky;\n bottom: 0;\n z-index: 1020;\n }\n}\n@media (min-width: 1400px) {\n .sticky-xxl-top {\n position: -webkit-sticky;\n position: sticky;\n top: 0;\n z-index: 1020;\n }\n .sticky-xxl-bottom {\n position: -webkit-sticky;\n position: sticky;\n bottom: 0;\n z-index: 1020;\n }\n}\n.hstack {\n display: flex;\n flex-direction: row;\n align-items: center;\n align-self: stretch;\n}\n\n.vstack {\n display: flex;\n flex: 1 1 auto;\n flex-direction: column;\n align-self: stretch;\n}\n\n.visually-hidden,\n.visually-hidden-focusable:not(:focus):not(:focus-within) {\n width: 1px !important;\n height: 1px !important;\n padding: 0 !important;\n margin: -1px !important;\n overflow: hidden !important;\n clip: rect(0, 0, 0, 0) !important;\n white-space: nowrap !important;\n border: 0 !important;\n}\n.visually-hidden:not(caption),\n.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption) {\n position: absolute !important;\n}\n\n.stretched-link::after {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1;\n content: \"\";\n}\n\n.text-truncate {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.vr {\n display: inline-block;\n align-self: stretch;\n width: 1px;\n min-height: 1em;\n background-color: currentcolor;\n opacity: 0.25;\n}\n\n.align-baseline {\n vertical-align: baseline !important;\n}\n\n.align-top {\n vertical-align: top !important;\n}\n\n.align-middle {\n vertical-align: middle !important;\n}\n\n.align-bottom {\n vertical-align: bottom !important;\n}\n\n.align-text-bottom {\n vertical-align: text-bottom !important;\n}\n\n.align-text-top {\n vertical-align: text-top !important;\n}\n\n.float-start {\n float: left !important;\n}\n\n.float-end {\n float: right !important;\n}\n\n.float-none {\n float: none !important;\n}\n\n.object-fit-contain {\n -o-object-fit: contain !important;\n object-fit: contain !important;\n}\n\n.object-fit-cover {\n -o-object-fit: cover !important;\n object-fit: cover !important;\n}\n\n.object-fit-fill {\n -o-object-fit: fill !important;\n object-fit: fill !important;\n}\n\n.object-fit-scale {\n -o-object-fit: scale-down !important;\n object-fit: scale-down !important;\n}\n\n.object-fit-none {\n -o-object-fit: none !important;\n object-fit: none !important;\n}\n\n.opacity-0 {\n opacity: 0 !important;\n}\n\n.opacity-25 {\n opacity: 0.25 !important;\n}\n\n.opacity-50 {\n opacity: 0.5 !important;\n}\n\n.opacity-75 {\n opacity: 0.75 !important;\n}\n\n.opacity-100 {\n opacity: 1 !important;\n}\n\n.overflow-auto {\n overflow: auto !important;\n}\n\n.overflow-hidden {\n overflow: hidden !important;\n}\n\n.overflow-visible {\n overflow: visible !important;\n}\n\n.overflow-scroll {\n overflow: scroll !important;\n}\n\n.overflow-x-auto {\n overflow-x: auto !important;\n}\n\n.overflow-x-hidden {\n overflow-x: hidden !important;\n}\n\n.overflow-x-visible {\n overflow-x: visible !important;\n}\n\n.overflow-x-scroll {\n overflow-x: scroll !important;\n}\n\n.overflow-y-auto {\n overflow-y: auto !important;\n}\n\n.overflow-y-hidden {\n overflow-y: hidden !important;\n}\n\n.overflow-y-visible {\n overflow-y: visible !important;\n}\n\n.overflow-y-scroll {\n overflow-y: scroll !important;\n}\n\n.d-inline {\n display: inline !important;\n}\n\n.d-inline-block {\n display: inline-block !important;\n}\n\n.d-block {\n display: block !important;\n}\n\n.d-grid {\n display: grid !important;\n}\n\n.d-inline-grid {\n display: inline-grid !important;\n}\n\n.d-table {\n display: table !important;\n}\n\n.d-table-row {\n display: table-row !important;\n}\n\n.d-table-cell {\n display: table-cell !important;\n}\n\n.d-flex {\n display: flex !important;\n}\n\n.d-inline-flex {\n display: inline-flex !important;\n}\n\n.d-none {\n display: none !important;\n}\n\n.shadow {\n box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important;\n}\n\n.shadow-sm {\n box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important;\n}\n\n.shadow-lg {\n box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important;\n}\n\n.shadow-none {\n box-shadow: none !important;\n}\n\n.focus-ring-primary {\n --bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-secondary {\n --bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-success {\n --bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-info {\n --bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-warning {\n --bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-danger {\n --bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-light {\n --bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity));\n}\n\n.focus-ring-dark {\n --bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity));\n}\n\n.position-static {\n position: static !important;\n}\n\n.position-relative {\n position: relative !important;\n}\n\n.position-absolute {\n position: absolute !important;\n}\n\n.position-fixed {\n position: fixed !important;\n}\n\n.position-sticky {\n position: -webkit-sticky !important;\n position: sticky !important;\n}\n\n.top-0 {\n top: 0 !important;\n}\n\n.top-50 {\n top: 50% !important;\n}\n\n.top-100 {\n top: 100% !important;\n}\n\n.bottom-0 {\n bottom: 0 !important;\n}\n\n.bottom-50 {\n bottom: 50% !important;\n}\n\n.bottom-100 {\n bottom: 100% !important;\n}\n\n.start-0 {\n left: 0 !important;\n}\n\n.start-50 {\n left: 50% !important;\n}\n\n.start-100 {\n left: 100% !important;\n}\n\n.end-0 {\n right: 0 !important;\n}\n\n.end-50 {\n right: 50% !important;\n}\n\n.end-100 {\n right: 100% !important;\n}\n\n.translate-middle {\n transform: translate(-50%, -50%) !important;\n}\n\n.translate-middle-x {\n transform: translateX(-50%) !important;\n}\n\n.translate-middle-y {\n transform: translateY(-50%) !important;\n}\n\n.border {\n border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-0 {\n border: 0 !important;\n}\n\n.border-top {\n border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-top-0 {\n border-top: 0 !important;\n}\n\n.border-end {\n border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-end-0 {\n border-right: 0 !important;\n}\n\n.border-bottom {\n border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-bottom-0 {\n border-bottom: 0 !important;\n}\n\n.border-start {\n border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important;\n}\n\n.border-start-0 {\n border-left: 0 !important;\n}\n\n.border-primary {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-secondary {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-success {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-info {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-warning {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-danger {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-light {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-dark {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-black {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-white {\n --bs-border-opacity: 1;\n border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important;\n}\n\n.border-primary-subtle {\n border-color: var(--bs-primary-border-subtle) !important;\n}\n\n.border-secondary-subtle {\n border-color: var(--bs-secondary-border-subtle) !important;\n}\n\n.border-success-subtle {\n border-color: var(--bs-success-border-subtle) !important;\n}\n\n.border-info-subtle {\n border-color: var(--bs-info-border-subtle) !important;\n}\n\n.border-warning-subtle {\n border-color: var(--bs-warning-border-subtle) !important;\n}\n\n.border-danger-subtle {\n border-color: var(--bs-danger-border-subtle) !important;\n}\n\n.border-light-subtle {\n border-color: var(--bs-light-border-subtle) !important;\n}\n\n.border-dark-subtle {\n border-color: var(--bs-dark-border-subtle) !important;\n}\n\n.border-1 {\n border-width: 1px !important;\n}\n\n.border-2 {\n border-width: 2px !important;\n}\n\n.border-3 {\n border-width: 3px !important;\n}\n\n.border-4 {\n border-width: 4px !important;\n}\n\n.border-5 {\n border-width: 5px !important;\n}\n\n.border-opacity-10 {\n --bs-border-opacity: 0.1;\n}\n\n.border-opacity-25 {\n --bs-border-opacity: 0.25;\n}\n\n.border-opacity-50 {\n --bs-border-opacity: 0.5;\n}\n\n.border-opacity-75 {\n --bs-border-opacity: 0.75;\n}\n\n.border-opacity-100 {\n --bs-border-opacity: 1;\n}\n\n.w-25 {\n width: 25% !important;\n}\n\n.w-50 {\n width: 50% !important;\n}\n\n.w-75 {\n width: 75% !important;\n}\n\n.w-100 {\n width: 100% !important;\n}\n\n.w-auto {\n width: auto !important;\n}\n\n.mw-100 {\n max-width: 100% !important;\n}\n\n.vw-100 {\n width: 100vw !important;\n}\n\n.min-vw-100 {\n min-width: 100vw !important;\n}\n\n.h-25 {\n height: 25% !important;\n}\n\n.h-50 {\n height: 50% !important;\n}\n\n.h-75 {\n height: 75% !important;\n}\n\n.h-100 {\n height: 100% !important;\n}\n\n.h-auto {\n height: auto !important;\n}\n\n.mh-100 {\n max-height: 100% !important;\n}\n\n.vh-100 {\n height: 100vh !important;\n}\n\n.min-vh-100 {\n min-height: 100vh !important;\n}\n\n.flex-fill {\n flex: 1 1 auto !important;\n}\n\n.flex-row {\n flex-direction: row !important;\n}\n\n.flex-column {\n flex-direction: column !important;\n}\n\n.flex-row-reverse {\n flex-direction: row-reverse !important;\n}\n\n.flex-column-reverse {\n flex-direction: column-reverse !important;\n}\n\n.flex-grow-0 {\n flex-grow: 0 !important;\n}\n\n.flex-grow-1 {\n flex-grow: 1 !important;\n}\n\n.flex-shrink-0 {\n flex-shrink: 0 !important;\n}\n\n.flex-shrink-1 {\n flex-shrink: 1 !important;\n}\n\n.flex-wrap {\n flex-wrap: wrap !important;\n}\n\n.flex-nowrap {\n flex-wrap: nowrap !important;\n}\n\n.flex-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n}\n\n.justify-content-start {\n justify-content: flex-start !important;\n}\n\n.justify-content-end {\n justify-content: flex-end !important;\n}\n\n.justify-content-center {\n justify-content: center !important;\n}\n\n.justify-content-between {\n justify-content: space-between !important;\n}\n\n.justify-content-around {\n justify-content: space-around !important;\n}\n\n.justify-content-evenly {\n justify-content: space-evenly !important;\n}\n\n.align-items-start {\n align-items: flex-start !important;\n}\n\n.align-items-end {\n align-items: flex-end !important;\n}\n\n.align-items-center {\n align-items: center !important;\n}\n\n.align-items-baseline {\n align-items: baseline !important;\n}\n\n.align-items-stretch {\n align-items: stretch !important;\n}\n\n.align-content-start {\n align-content: flex-start !important;\n}\n\n.align-content-end {\n align-content: flex-end !important;\n}\n\n.align-content-center {\n align-content: center !important;\n}\n\n.align-content-between {\n align-content: space-between !important;\n}\n\n.align-content-around {\n align-content: space-around !important;\n}\n\n.align-content-stretch {\n align-content: stretch !important;\n}\n\n.align-self-auto {\n align-self: auto !important;\n}\n\n.align-self-start {\n align-self: flex-start !important;\n}\n\n.align-self-end {\n align-self: flex-end !important;\n}\n\n.align-self-center {\n align-self: center !important;\n}\n\n.align-self-baseline {\n align-self: baseline !important;\n}\n\n.align-self-stretch {\n align-self: stretch !important;\n}\n\n.order-first {\n order: -1 !important;\n}\n\n.order-0 {\n order: 0 !important;\n}\n\n.order-1 {\n order: 1 !important;\n}\n\n.order-2 {\n order: 2 !important;\n}\n\n.order-3 {\n order: 3 !important;\n}\n\n.order-4 {\n order: 4 !important;\n}\n\n.order-5 {\n order: 5 !important;\n}\n\n.order-last {\n order: 6 !important;\n}\n\n.m-0 {\n margin: 0 !important;\n}\n\n.m-1 {\n margin: 0.25rem !important;\n}\n\n.m-2 {\n margin: 0.5rem !important;\n}\n\n.m-3 {\n margin: 1rem !important;\n}\n\n.m-4 {\n margin: 1.5rem !important;\n}\n\n.m-5 {\n margin: 3rem !important;\n}\n\n.m-auto {\n margin: auto !important;\n}\n\n.mx-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n}\n\n.mx-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n}\n\n.mx-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n}\n\n.mx-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n}\n\n.mx-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n}\n\n.mx-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n}\n\n.mx-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n}\n\n.my-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n.my-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n}\n\n.my-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n}\n\n.my-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n}\n\n.my-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n}\n\n.my-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n}\n\n.my-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n}\n\n.mt-0 {\n margin-top: 0 !important;\n}\n\n.mt-1 {\n margin-top: 0.25rem !important;\n}\n\n.mt-2 {\n margin-top: 0.5rem !important;\n}\n\n.mt-3 {\n margin-top: 1rem !important;\n}\n\n.mt-4 {\n margin-top: 1.5rem !important;\n}\n\n.mt-5 {\n margin-top: 3rem !important;\n}\n\n.mt-auto {\n margin-top: auto !important;\n}\n\n.me-0 {\n margin-right: 0 !important;\n}\n\n.me-1 {\n margin-right: 0.25rem !important;\n}\n\n.me-2 {\n margin-right: 0.5rem !important;\n}\n\n.me-3 {\n margin-right: 1rem !important;\n}\n\n.me-4 {\n margin-right: 1.5rem !important;\n}\n\n.me-5 {\n margin-right: 3rem !important;\n}\n\n.me-auto {\n margin-right: auto !important;\n}\n\n.mb-0 {\n margin-bottom: 0 !important;\n}\n\n.mb-1 {\n margin-bottom: 0.25rem !important;\n}\n\n.mb-2 {\n margin-bottom: 0.5rem !important;\n}\n\n.mb-3 {\n margin-bottom: 1rem !important;\n}\n\n.mb-4 {\n margin-bottom: 1.5rem !important;\n}\n\n.mb-5 {\n margin-bottom: 3rem !important;\n}\n\n.mb-auto {\n margin-bottom: auto !important;\n}\n\n.ms-0 {\n margin-left: 0 !important;\n}\n\n.ms-1 {\n margin-left: 0.25rem !important;\n}\n\n.ms-2 {\n margin-left: 0.5rem !important;\n}\n\n.ms-3 {\n margin-left: 1rem !important;\n}\n\n.ms-4 {\n margin-left: 1.5rem !important;\n}\n\n.ms-5 {\n margin-left: 3rem !important;\n}\n\n.ms-auto {\n margin-left: auto !important;\n}\n\n.p-0 {\n padding: 0 !important;\n}\n\n.p-1 {\n padding: 0.25rem !important;\n}\n\n.p-2 {\n padding: 0.5rem !important;\n}\n\n.p-3 {\n padding: 1rem !important;\n}\n\n.p-4 {\n padding: 1.5rem !important;\n}\n\n.p-5 {\n padding: 3rem !important;\n}\n\n.px-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n}\n\n.px-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n}\n\n.px-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n}\n\n.px-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n}\n\n.px-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n}\n\n.px-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n}\n\n.py-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n}\n\n.py-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n}\n\n.py-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n}\n\n.py-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n}\n\n.py-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n}\n\n.py-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n}\n\n.pt-0 {\n padding-top: 0 !important;\n}\n\n.pt-1 {\n padding-top: 0.25rem !important;\n}\n\n.pt-2 {\n padding-top: 0.5rem !important;\n}\n\n.pt-3 {\n padding-top: 1rem !important;\n}\n\n.pt-4 {\n padding-top: 1.5rem !important;\n}\n\n.pt-5 {\n padding-top: 3rem !important;\n}\n\n.pe-0 {\n padding-right: 0 !important;\n}\n\n.pe-1 {\n padding-right: 0.25rem !important;\n}\n\n.pe-2 {\n padding-right: 0.5rem !important;\n}\n\n.pe-3 {\n padding-right: 1rem !important;\n}\n\n.pe-4 {\n padding-right: 1.5rem !important;\n}\n\n.pe-5 {\n padding-right: 3rem !important;\n}\n\n.pb-0 {\n padding-bottom: 0 !important;\n}\n\n.pb-1 {\n padding-bottom: 0.25rem !important;\n}\n\n.pb-2 {\n padding-bottom: 0.5rem !important;\n}\n\n.pb-3 {\n padding-bottom: 1rem !important;\n}\n\n.pb-4 {\n padding-bottom: 1.5rem !important;\n}\n\n.pb-5 {\n padding-bottom: 3rem !important;\n}\n\n.ps-0 {\n padding-left: 0 !important;\n}\n\n.ps-1 {\n padding-left: 0.25rem !important;\n}\n\n.ps-2 {\n padding-left: 0.5rem !important;\n}\n\n.ps-3 {\n padding-left: 1rem !important;\n}\n\n.ps-4 {\n padding-left: 1.5rem !important;\n}\n\n.ps-5 {\n padding-left: 3rem !important;\n}\n\n.gap-0 {\n gap: 0 !important;\n}\n\n.gap-1 {\n gap: 0.25rem !important;\n}\n\n.gap-2 {\n gap: 0.5rem !important;\n}\n\n.gap-3 {\n gap: 1rem !important;\n}\n\n.gap-4 {\n gap: 1.5rem !important;\n}\n\n.gap-5 {\n gap: 3rem !important;\n}\n\n.row-gap-0 {\n row-gap: 0 !important;\n}\n\n.row-gap-1 {\n row-gap: 0.25rem !important;\n}\n\n.row-gap-2 {\n row-gap: 0.5rem !important;\n}\n\n.row-gap-3 {\n row-gap: 1rem !important;\n}\n\n.row-gap-4 {\n row-gap: 1.5rem !important;\n}\n\n.row-gap-5 {\n row-gap: 3rem !important;\n}\n\n.column-gap-0 {\n -moz-column-gap: 0 !important;\n column-gap: 0 !important;\n}\n\n.column-gap-1 {\n -moz-column-gap: 0.25rem !important;\n column-gap: 0.25rem !important;\n}\n\n.column-gap-2 {\n -moz-column-gap: 0.5rem !important;\n column-gap: 0.5rem !important;\n}\n\n.column-gap-3 {\n -moz-column-gap: 1rem !important;\n column-gap: 1rem !important;\n}\n\n.column-gap-4 {\n -moz-column-gap: 1.5rem !important;\n column-gap: 1.5rem !important;\n}\n\n.column-gap-5 {\n -moz-column-gap: 3rem !important;\n column-gap: 3rem !important;\n}\n\n.font-monospace {\n font-family: var(--bs-font-monospace) !important;\n}\n\n.fs-1 {\n font-size: calc(1.375rem + 1.5vw) !important;\n}\n\n.fs-2 {\n font-size: calc(1.325rem + 0.9vw) !important;\n}\n\n.fs-3 {\n font-size: calc(1.3rem + 0.6vw) !important;\n}\n\n.fs-4 {\n font-size: calc(1.275rem + 0.3vw) !important;\n}\n\n.fs-5 {\n font-size: 1.25rem !important;\n}\n\n.fs-6 {\n font-size: 1rem !important;\n}\n\n.fst-italic {\n font-style: italic !important;\n}\n\n.fst-normal {\n font-style: normal !important;\n}\n\n.fw-lighter {\n font-weight: lighter !important;\n}\n\n.fw-light {\n font-weight: 300 !important;\n}\n\n.fw-normal {\n font-weight: 400 !important;\n}\n\n.fw-medium {\n font-weight: 500 !important;\n}\n\n.fw-semibold {\n font-weight: 600 !important;\n}\n\n.fw-bold {\n font-weight: 700 !important;\n}\n\n.fw-bolder {\n font-weight: bolder !important;\n}\n\n.lh-1 {\n line-height: 1 !important;\n}\n\n.lh-sm {\n line-height: 1.25 !important;\n}\n\n.lh-base {\n line-height: 1.5 !important;\n}\n\n.lh-lg {\n line-height: 2 !important;\n}\n\n.text-start {\n text-align: left !important;\n}\n\n.text-end {\n text-align: right !important;\n}\n\n.text-center {\n text-align: center !important;\n}\n\n.text-decoration-none {\n text-decoration: none !important;\n}\n\n.text-decoration-underline {\n text-decoration: underline !important;\n}\n\n.text-decoration-line-through {\n text-decoration: line-through !important;\n}\n\n.text-lowercase {\n text-transform: lowercase !important;\n}\n\n.text-uppercase {\n text-transform: uppercase !important;\n}\n\n.text-capitalize {\n text-transform: capitalize !important;\n}\n\n.text-wrap {\n white-space: normal !important;\n}\n\n.text-nowrap {\n white-space: nowrap !important;\n}\n\n/* rtl:begin:remove */\n.text-break {\n word-wrap: break-word !important;\n word-break: break-word !important;\n}\n\n/* rtl:end:remove */\n.text-primary {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-secondary {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-success {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-info {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-warning {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-danger {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-light {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-dark {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-black {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-white {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-body {\n --bs-text-opacity: 1;\n color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important;\n}\n\n.text-muted {\n --bs-text-opacity: 1;\n color: var(--bs-secondary-color) !important;\n}\n\n.text-black-50 {\n --bs-text-opacity: 1;\n color: rgba(0, 0, 0, 0.5) !important;\n}\n\n.text-white-50 {\n --bs-text-opacity: 1;\n color: rgba(255, 255, 255, 0.5) !important;\n}\n\n.text-body-secondary {\n --bs-text-opacity: 1;\n color: var(--bs-secondary-color) !important;\n}\n\n.text-body-tertiary {\n --bs-text-opacity: 1;\n color: var(--bs-tertiary-color) !important;\n}\n\n.text-body-emphasis {\n --bs-text-opacity: 1;\n color: var(--bs-emphasis-color) !important;\n}\n\n.text-reset {\n --bs-text-opacity: 1;\n color: inherit !important;\n}\n\n.text-opacity-25 {\n --bs-text-opacity: 0.25;\n}\n\n.text-opacity-50 {\n --bs-text-opacity: 0.5;\n}\n\n.text-opacity-75 {\n --bs-text-opacity: 0.75;\n}\n\n.text-opacity-100 {\n --bs-text-opacity: 1;\n}\n\n.text-primary-emphasis {\n color: var(--bs-primary-text-emphasis) !important;\n}\n\n.text-secondary-emphasis {\n color: var(--bs-secondary-text-emphasis) !important;\n}\n\n.text-success-emphasis {\n color: var(--bs-success-text-emphasis) !important;\n}\n\n.text-info-emphasis {\n color: var(--bs-info-text-emphasis) !important;\n}\n\n.text-warning-emphasis {\n color: var(--bs-warning-text-emphasis) !important;\n}\n\n.text-danger-emphasis {\n color: var(--bs-danger-text-emphasis) !important;\n}\n\n.text-light-emphasis {\n color: var(--bs-light-text-emphasis) !important;\n}\n\n.text-dark-emphasis {\n color: var(--bs-dark-text-emphasis) !important;\n}\n\n.link-opacity-10 {\n --bs-link-opacity: 0.1;\n}\n\n.link-opacity-10-hover:hover {\n --bs-link-opacity: 0.1;\n}\n\n.link-opacity-25 {\n --bs-link-opacity: 0.25;\n}\n\n.link-opacity-25-hover:hover {\n --bs-link-opacity: 0.25;\n}\n\n.link-opacity-50 {\n --bs-link-opacity: 0.5;\n}\n\n.link-opacity-50-hover:hover {\n --bs-link-opacity: 0.5;\n}\n\n.link-opacity-75 {\n --bs-link-opacity: 0.75;\n}\n\n.link-opacity-75-hover:hover {\n --bs-link-opacity: 0.75;\n}\n\n.link-opacity-100 {\n --bs-link-opacity: 1;\n}\n\n.link-opacity-100-hover:hover {\n --bs-link-opacity: 1;\n}\n\n.link-offset-1 {\n text-underline-offset: 0.125em !important;\n}\n\n.link-offset-1-hover:hover {\n text-underline-offset: 0.125em !important;\n}\n\n.link-offset-2 {\n text-underline-offset: 0.25em !important;\n}\n\n.link-offset-2-hover:hover {\n text-underline-offset: 0.25em !important;\n}\n\n.link-offset-3 {\n text-underline-offset: 0.375em !important;\n}\n\n.link-offset-3-hover:hover {\n text-underline-offset: 0.375em !important;\n}\n\n.link-underline-primary {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-secondary {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-success {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-info {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-warning {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-danger {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-light {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline-dark {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important;\n text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important;\n}\n\n.link-underline {\n --bs-link-underline-opacity: 1;\n -webkit-text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important;\n}\n\n.link-underline-opacity-0 {\n --bs-link-underline-opacity: 0;\n}\n\n.link-underline-opacity-0-hover:hover {\n --bs-link-underline-opacity: 0;\n}\n\n.link-underline-opacity-10 {\n --bs-link-underline-opacity: 0.1;\n}\n\n.link-underline-opacity-10-hover:hover {\n --bs-link-underline-opacity: 0.1;\n}\n\n.link-underline-opacity-25 {\n --bs-link-underline-opacity: 0.25;\n}\n\n.link-underline-opacity-25-hover:hover {\n --bs-link-underline-opacity: 0.25;\n}\n\n.link-underline-opacity-50 {\n --bs-link-underline-opacity: 0.5;\n}\n\n.link-underline-opacity-50-hover:hover {\n --bs-link-underline-opacity: 0.5;\n}\n\n.link-underline-opacity-75 {\n --bs-link-underline-opacity: 0.75;\n}\n\n.link-underline-opacity-75-hover:hover {\n --bs-link-underline-opacity: 0.75;\n}\n\n.link-underline-opacity-100 {\n --bs-link-underline-opacity: 1;\n}\n\n.link-underline-opacity-100-hover:hover {\n --bs-link-underline-opacity: 1;\n}\n\n.bg-primary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-secondary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-success {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-info {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-warning {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-danger {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-light {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-dark {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-black {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-white {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-transparent {\n --bs-bg-opacity: 1;\n background-color: transparent !important;\n}\n\n.bg-body-secondary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-body-tertiary {\n --bs-bg-opacity: 1;\n background-color: rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important;\n}\n\n.bg-opacity-10 {\n --bs-bg-opacity: 0.1;\n}\n\n.bg-opacity-25 {\n --bs-bg-opacity: 0.25;\n}\n\n.bg-opacity-50 {\n --bs-bg-opacity: 0.5;\n}\n\n.bg-opacity-75 {\n --bs-bg-opacity: 0.75;\n}\n\n.bg-opacity-100 {\n --bs-bg-opacity: 1;\n}\n\n.bg-primary-subtle {\n background-color: var(--bs-primary-bg-subtle) !important;\n}\n\n.bg-secondary-subtle {\n background-color: var(--bs-secondary-bg-subtle) !important;\n}\n\n.bg-success-subtle {\n background-color: var(--bs-success-bg-subtle) !important;\n}\n\n.bg-info-subtle {\n background-color: var(--bs-info-bg-subtle) !important;\n}\n\n.bg-warning-subtle {\n background-color: var(--bs-warning-bg-subtle) !important;\n}\n\n.bg-danger-subtle {\n background-color: var(--bs-danger-bg-subtle) !important;\n}\n\n.bg-light-subtle {\n background-color: var(--bs-light-bg-subtle) !important;\n}\n\n.bg-dark-subtle {\n background-color: var(--bs-dark-bg-subtle) !important;\n}\n\n.bg-gradient {\n background-image: var(--bs-gradient) !important;\n}\n\n.user-select-all {\n -webkit-user-select: all !important;\n -moz-user-select: all !important;\n user-select: all !important;\n}\n\n.user-select-auto {\n -webkit-user-select: auto !important;\n -moz-user-select: auto !important;\n user-select: auto !important;\n}\n\n.user-select-none {\n -webkit-user-select: none !important;\n -moz-user-select: none !important;\n user-select: none !important;\n}\n\n.pe-none {\n pointer-events: none !important;\n}\n\n.pe-auto {\n pointer-events: auto !important;\n}\n\n.rounded {\n border-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-0 {\n border-radius: 0 !important;\n}\n\n.rounded-1 {\n border-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-2 {\n border-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-3 {\n border-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-4 {\n border-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-5 {\n border-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-circle {\n border-radius: 50% !important;\n}\n\n.rounded-pill {\n border-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-top {\n border-top-left-radius: var(--bs-border-radius) !important;\n border-top-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-top-0 {\n border-top-left-radius: 0 !important;\n border-top-right-radius: 0 !important;\n}\n\n.rounded-top-1 {\n border-top-left-radius: var(--bs-border-radius-sm) !important;\n border-top-right-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-top-2 {\n border-top-left-radius: var(--bs-border-radius) !important;\n border-top-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-top-3 {\n border-top-left-radius: var(--bs-border-radius-lg) !important;\n border-top-right-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-top-4 {\n border-top-left-radius: var(--bs-border-radius-xl) !important;\n border-top-right-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-top-5 {\n border-top-left-radius: var(--bs-border-radius-xxl) !important;\n border-top-right-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-top-circle {\n border-top-left-radius: 50% !important;\n border-top-right-radius: 50% !important;\n}\n\n.rounded-top-pill {\n border-top-left-radius: var(--bs-border-radius-pill) !important;\n border-top-right-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-end {\n border-top-right-radius: var(--bs-border-radius) !important;\n border-bottom-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-end-0 {\n border-top-right-radius: 0 !important;\n border-bottom-right-radius: 0 !important;\n}\n\n.rounded-end-1 {\n border-top-right-radius: var(--bs-border-radius-sm) !important;\n border-bottom-right-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-end-2 {\n border-top-right-radius: var(--bs-border-radius) !important;\n border-bottom-right-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-end-3 {\n border-top-right-radius: var(--bs-border-radius-lg) !important;\n border-bottom-right-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-end-4 {\n border-top-right-radius: var(--bs-border-radius-xl) !important;\n border-bottom-right-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-end-5 {\n border-top-right-radius: var(--bs-border-radius-xxl) !important;\n border-bottom-right-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-end-circle {\n border-top-right-radius: 50% !important;\n border-bottom-right-radius: 50% !important;\n}\n\n.rounded-end-pill {\n border-top-right-radius: var(--bs-border-radius-pill) !important;\n border-bottom-right-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-bottom {\n border-bottom-right-radius: var(--bs-border-radius) !important;\n border-bottom-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-bottom-0 {\n border-bottom-right-radius: 0 !important;\n border-bottom-left-radius: 0 !important;\n}\n\n.rounded-bottom-1 {\n border-bottom-right-radius: var(--bs-border-radius-sm) !important;\n border-bottom-left-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-bottom-2 {\n border-bottom-right-radius: var(--bs-border-radius) !important;\n border-bottom-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-bottom-3 {\n border-bottom-right-radius: var(--bs-border-radius-lg) !important;\n border-bottom-left-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-bottom-4 {\n border-bottom-right-radius: var(--bs-border-radius-xl) !important;\n border-bottom-left-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-bottom-5 {\n border-bottom-right-radius: var(--bs-border-radius-xxl) !important;\n border-bottom-left-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-bottom-circle {\n border-bottom-right-radius: 50% !important;\n border-bottom-left-radius: 50% !important;\n}\n\n.rounded-bottom-pill {\n border-bottom-right-radius: var(--bs-border-radius-pill) !important;\n border-bottom-left-radius: var(--bs-border-radius-pill) !important;\n}\n\n.rounded-start {\n border-bottom-left-radius: var(--bs-border-radius) !important;\n border-top-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-start-0 {\n border-bottom-left-radius: 0 !important;\n border-top-left-radius: 0 !important;\n}\n\n.rounded-start-1 {\n border-bottom-left-radius: var(--bs-border-radius-sm) !important;\n border-top-left-radius: var(--bs-border-radius-sm) !important;\n}\n\n.rounded-start-2 {\n border-bottom-left-radius: var(--bs-border-radius) !important;\n border-top-left-radius: var(--bs-border-radius) !important;\n}\n\n.rounded-start-3 {\n border-bottom-left-radius: var(--bs-border-radius-lg) !important;\n border-top-left-radius: var(--bs-border-radius-lg) !important;\n}\n\n.rounded-start-4 {\n border-bottom-left-radius: var(--bs-border-radius-xl) !important;\n border-top-left-radius: var(--bs-border-radius-xl) !important;\n}\n\n.rounded-start-5 {\n border-bottom-left-radius: var(--bs-border-radius-xxl) !important;\n border-top-left-radius: var(--bs-border-radius-xxl) !important;\n}\n\n.rounded-start-circle {\n border-bottom-left-radius: 50% !important;\n border-top-left-radius: 50% !important;\n}\n\n.rounded-start-pill {\n border-bottom-left-radius: var(--bs-border-radius-pill) !important;\n border-top-left-radius: var(--bs-border-radius-pill) !important;\n}\n\n.visible {\n visibility: visible !important;\n}\n\n.invisible {\n visibility: hidden !important;\n}\n\n.z-n1 {\n z-index: -1 !important;\n}\n\n.z-0 {\n z-index: 0 !important;\n}\n\n.z-1 {\n z-index: 1 !important;\n}\n\n.z-2 {\n z-index: 2 !important;\n}\n\n.z-3 {\n z-index: 3 !important;\n}\n\n@media (min-width: 576px) {\n .float-sm-start {\n float: left !important;\n }\n .float-sm-end {\n float: right !important;\n }\n .float-sm-none {\n float: none !important;\n }\n .object-fit-sm-contain {\n -o-object-fit: contain !important;\n object-fit: contain !important;\n }\n .object-fit-sm-cover {\n -o-object-fit: cover !important;\n object-fit: cover !important;\n }\n .object-fit-sm-fill {\n -o-object-fit: fill !important;\n object-fit: fill !important;\n }\n .object-fit-sm-scale {\n -o-object-fit: scale-down !important;\n object-fit: scale-down !important;\n }\n .object-fit-sm-none {\n -o-object-fit: none !important;\n object-fit: none !important;\n }\n .d-sm-inline {\n display: inline !important;\n }\n .d-sm-inline-block {\n display: inline-block !important;\n }\n .d-sm-block {\n display: block !important;\n }\n .d-sm-grid {\n display: grid !important;\n }\n .d-sm-inline-grid {\n display: inline-grid !important;\n }\n .d-sm-table {\n display: table !important;\n }\n .d-sm-table-row {\n display: table-row !important;\n }\n .d-sm-table-cell {\n display: table-cell !important;\n }\n .d-sm-flex {\n display: flex !important;\n }\n .d-sm-inline-flex {\n display: inline-flex !important;\n }\n .d-sm-none {\n display: none !important;\n }\n .flex-sm-fill {\n flex: 1 1 auto !important;\n }\n .flex-sm-row {\n flex-direction: row !important;\n }\n .flex-sm-column {\n flex-direction: column !important;\n }\n .flex-sm-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-sm-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-sm-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-sm-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-sm-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-sm-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-sm-wrap {\n flex-wrap: wrap !important;\n }\n .flex-sm-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-sm-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-sm-start {\n justify-content: flex-start !important;\n }\n .justify-content-sm-end {\n justify-content: flex-end !important;\n }\n .justify-content-sm-center {\n justify-content: center !important;\n }\n .justify-content-sm-between {\n justify-content: space-between !important;\n }\n .justify-content-sm-around {\n justify-content: space-around !important;\n }\n .justify-content-sm-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-sm-start {\n align-items: flex-start !important;\n }\n .align-items-sm-end {\n align-items: flex-end !important;\n }\n .align-items-sm-center {\n align-items: center !important;\n }\n .align-items-sm-baseline {\n align-items: baseline !important;\n }\n .align-items-sm-stretch {\n align-items: stretch !important;\n }\n .align-content-sm-start {\n align-content: flex-start !important;\n }\n .align-content-sm-end {\n align-content: flex-end !important;\n }\n .align-content-sm-center {\n align-content: center !important;\n }\n .align-content-sm-between {\n align-content: space-between !important;\n }\n .align-content-sm-around {\n align-content: space-around !important;\n }\n .align-content-sm-stretch {\n align-content: stretch !important;\n }\n .align-self-sm-auto {\n align-self: auto !important;\n }\n .align-self-sm-start {\n align-self: flex-start !important;\n }\n .align-self-sm-end {\n align-self: flex-end !important;\n }\n .align-self-sm-center {\n align-self: center !important;\n }\n .align-self-sm-baseline {\n align-self: baseline !important;\n }\n .align-self-sm-stretch {\n align-self: stretch !important;\n }\n .order-sm-first {\n order: -1 !important;\n }\n .order-sm-0 {\n order: 0 !important;\n }\n .order-sm-1 {\n order: 1 !important;\n }\n .order-sm-2 {\n order: 2 !important;\n }\n .order-sm-3 {\n order: 3 !important;\n }\n .order-sm-4 {\n order: 4 !important;\n }\n .order-sm-5 {\n order: 5 !important;\n }\n .order-sm-last {\n order: 6 !important;\n }\n .m-sm-0 {\n margin: 0 !important;\n }\n .m-sm-1 {\n margin: 0.25rem !important;\n }\n .m-sm-2 {\n margin: 0.5rem !important;\n }\n .m-sm-3 {\n margin: 1rem !important;\n }\n .m-sm-4 {\n margin: 1.5rem !important;\n }\n .m-sm-5 {\n margin: 3rem !important;\n }\n .m-sm-auto {\n margin: auto !important;\n }\n .mx-sm-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-sm-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-sm-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-sm-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-sm-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-sm-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-sm-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-sm-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-sm-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-sm-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-sm-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-sm-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-sm-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-sm-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-sm-0 {\n margin-top: 0 !important;\n }\n .mt-sm-1 {\n margin-top: 0.25rem !important;\n }\n .mt-sm-2 {\n margin-top: 0.5rem !important;\n }\n .mt-sm-3 {\n margin-top: 1rem !important;\n }\n .mt-sm-4 {\n margin-top: 1.5rem !important;\n }\n .mt-sm-5 {\n margin-top: 3rem !important;\n }\n .mt-sm-auto {\n margin-top: auto !important;\n }\n .me-sm-0 {\n margin-right: 0 !important;\n }\n .me-sm-1 {\n margin-right: 0.25rem !important;\n }\n .me-sm-2 {\n margin-right: 0.5rem !important;\n }\n .me-sm-3 {\n margin-right: 1rem !important;\n }\n .me-sm-4 {\n margin-right: 1.5rem !important;\n }\n .me-sm-5 {\n margin-right: 3rem !important;\n }\n .me-sm-auto {\n margin-right: auto !important;\n }\n .mb-sm-0 {\n margin-bottom: 0 !important;\n }\n .mb-sm-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-sm-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-sm-3 {\n margin-bottom: 1rem !important;\n }\n .mb-sm-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-sm-5 {\n margin-bottom: 3rem !important;\n }\n .mb-sm-auto {\n margin-bottom: auto !important;\n }\n .ms-sm-0 {\n margin-left: 0 !important;\n }\n .ms-sm-1 {\n margin-left: 0.25rem !important;\n }\n .ms-sm-2 {\n margin-left: 0.5rem !important;\n }\n .ms-sm-3 {\n margin-left: 1rem !important;\n }\n .ms-sm-4 {\n margin-left: 1.5rem !important;\n }\n .ms-sm-5 {\n margin-left: 3rem !important;\n }\n .ms-sm-auto {\n margin-left: auto !important;\n }\n .p-sm-0 {\n padding: 0 !important;\n }\n .p-sm-1 {\n padding: 0.25rem !important;\n }\n .p-sm-2 {\n padding: 0.5rem !important;\n }\n .p-sm-3 {\n padding: 1rem !important;\n }\n .p-sm-4 {\n padding: 1.5rem !important;\n }\n .p-sm-5 {\n padding: 3rem !important;\n }\n .px-sm-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-sm-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-sm-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-sm-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-sm-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-sm-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-sm-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-sm-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-sm-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-sm-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-sm-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-sm-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-sm-0 {\n padding-top: 0 !important;\n }\n .pt-sm-1 {\n padding-top: 0.25rem !important;\n }\n .pt-sm-2 {\n padding-top: 0.5rem !important;\n }\n .pt-sm-3 {\n padding-top: 1rem !important;\n }\n .pt-sm-4 {\n padding-top: 1.5rem !important;\n }\n .pt-sm-5 {\n padding-top: 3rem !important;\n }\n .pe-sm-0 {\n padding-right: 0 !important;\n }\n .pe-sm-1 {\n padding-right: 0.25rem !important;\n }\n .pe-sm-2 {\n padding-right: 0.5rem !important;\n }\n .pe-sm-3 {\n padding-right: 1rem !important;\n }\n .pe-sm-4 {\n padding-right: 1.5rem !important;\n }\n .pe-sm-5 {\n padding-right: 3rem !important;\n }\n .pb-sm-0 {\n padding-bottom: 0 !important;\n }\n .pb-sm-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-sm-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-sm-3 {\n padding-bottom: 1rem !important;\n }\n .pb-sm-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-sm-5 {\n padding-bottom: 3rem !important;\n }\n .ps-sm-0 {\n padding-left: 0 !important;\n }\n .ps-sm-1 {\n padding-left: 0.25rem !important;\n }\n .ps-sm-2 {\n padding-left: 0.5rem !important;\n }\n .ps-sm-3 {\n padding-left: 1rem !important;\n }\n .ps-sm-4 {\n padding-left: 1.5rem !important;\n }\n .ps-sm-5 {\n padding-left: 3rem !important;\n }\n .gap-sm-0 {\n gap: 0 !important;\n }\n .gap-sm-1 {\n gap: 0.25rem !important;\n }\n .gap-sm-2 {\n gap: 0.5rem !important;\n }\n .gap-sm-3 {\n gap: 1rem !important;\n }\n .gap-sm-4 {\n gap: 1.5rem !important;\n }\n .gap-sm-5 {\n gap: 3rem !important;\n }\n .row-gap-sm-0 {\n row-gap: 0 !important;\n }\n .row-gap-sm-1 {\n row-gap: 0.25rem !important;\n }\n .row-gap-sm-2 {\n row-gap: 0.5rem !important;\n }\n .row-gap-sm-3 {\n row-gap: 1rem !important;\n }\n .row-gap-sm-4 {\n row-gap: 1.5rem !important;\n }\n .row-gap-sm-5 {\n row-gap: 3rem !important;\n }\n .column-gap-sm-0 {\n -moz-column-gap: 0 !important;\n column-gap: 0 !important;\n }\n .column-gap-sm-1 {\n -moz-column-gap: 0.25rem !important;\n column-gap: 0.25rem !important;\n }\n .column-gap-sm-2 {\n -moz-column-gap: 0.5rem !important;\n column-gap: 0.5rem !important;\n }\n .column-gap-sm-3 {\n -moz-column-gap: 1rem !important;\n column-gap: 1rem !important;\n }\n .column-gap-sm-4 {\n -moz-column-gap: 1.5rem !important;\n column-gap: 1.5rem !important;\n }\n .column-gap-sm-5 {\n -moz-column-gap: 3rem !important;\n column-gap: 3rem !important;\n }\n .text-sm-start {\n text-align: left !important;\n }\n .text-sm-end {\n text-align: right !important;\n }\n .text-sm-center {\n text-align: center !important;\n }\n}\n@media (min-width: 768px) {\n .float-md-start {\n float: left !important;\n }\n .float-md-end {\n float: right !important;\n }\n .float-md-none {\n float: none !important;\n }\n .object-fit-md-contain {\n -o-object-fit: contain !important;\n object-fit: contain !important;\n }\n .object-fit-md-cover {\n -o-object-fit: cover !important;\n object-fit: cover !important;\n }\n .object-fit-md-fill {\n -o-object-fit: fill !important;\n object-fit: fill !important;\n }\n .object-fit-md-scale {\n -o-object-fit: scale-down !important;\n object-fit: scale-down !important;\n }\n .object-fit-md-none {\n -o-object-fit: none !important;\n object-fit: none !important;\n }\n .d-md-inline {\n display: inline !important;\n }\n .d-md-inline-block {\n display: inline-block !important;\n }\n .d-md-block {\n display: block !important;\n }\n .d-md-grid {\n display: grid !important;\n }\n .d-md-inline-grid {\n display: inline-grid !important;\n }\n .d-md-table {\n display: table !important;\n }\n .d-md-table-row {\n display: table-row !important;\n }\n .d-md-table-cell {\n display: table-cell !important;\n }\n .d-md-flex {\n display: flex !important;\n }\n .d-md-inline-flex {\n display: inline-flex !important;\n }\n .d-md-none {\n display: none !important;\n }\n .flex-md-fill {\n flex: 1 1 auto !important;\n }\n .flex-md-row {\n flex-direction: row !important;\n }\n .flex-md-column {\n flex-direction: column !important;\n }\n .flex-md-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-md-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-md-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-md-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-md-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-md-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-md-wrap {\n flex-wrap: wrap !important;\n }\n .flex-md-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-md-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-md-start {\n justify-content: flex-start !important;\n }\n .justify-content-md-end {\n justify-content: flex-end !important;\n }\n .justify-content-md-center {\n justify-content: center !important;\n }\n .justify-content-md-between {\n justify-content: space-between !important;\n }\n .justify-content-md-around {\n justify-content: space-around !important;\n }\n .justify-content-md-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-md-start {\n align-items: flex-start !important;\n }\n .align-items-md-end {\n align-items: flex-end !important;\n }\n .align-items-md-center {\n align-items: center !important;\n }\n .align-items-md-baseline {\n align-items: baseline !important;\n }\n .align-items-md-stretch {\n align-items: stretch !important;\n }\n .align-content-md-start {\n align-content: flex-start !important;\n }\n .align-content-md-end {\n align-content: flex-end !important;\n }\n .align-content-md-center {\n align-content: center !important;\n }\n .align-content-md-between {\n align-content: space-between !important;\n }\n .align-content-md-around {\n align-content: space-around !important;\n }\n .align-content-md-stretch {\n align-content: stretch !important;\n }\n .align-self-md-auto {\n align-self: auto !important;\n }\n .align-self-md-start {\n align-self: flex-start !important;\n }\n .align-self-md-end {\n align-self: flex-end !important;\n }\n .align-self-md-center {\n align-self: center !important;\n }\n .align-self-md-baseline {\n align-self: baseline !important;\n }\n .align-self-md-stretch {\n align-self: stretch !important;\n }\n .order-md-first {\n order: -1 !important;\n }\n .order-md-0 {\n order: 0 !important;\n }\n .order-md-1 {\n order: 1 !important;\n }\n .order-md-2 {\n order: 2 !important;\n }\n .order-md-3 {\n order: 3 !important;\n }\n .order-md-4 {\n order: 4 !important;\n }\n .order-md-5 {\n order: 5 !important;\n }\n .order-md-last {\n order: 6 !important;\n }\n .m-md-0 {\n margin: 0 !important;\n }\n .m-md-1 {\n margin: 0.25rem !important;\n }\n .m-md-2 {\n margin: 0.5rem !important;\n }\n .m-md-3 {\n margin: 1rem !important;\n }\n .m-md-4 {\n margin: 1.5rem !important;\n }\n .m-md-5 {\n margin: 3rem !important;\n }\n .m-md-auto {\n margin: auto !important;\n }\n .mx-md-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-md-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-md-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-md-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-md-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-md-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-md-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-md-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-md-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-md-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-md-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-md-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-md-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-md-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-md-0 {\n margin-top: 0 !important;\n }\n .mt-md-1 {\n margin-top: 0.25rem !important;\n }\n .mt-md-2 {\n margin-top: 0.5rem !important;\n }\n .mt-md-3 {\n margin-top: 1rem !important;\n }\n .mt-md-4 {\n margin-top: 1.5rem !important;\n }\n .mt-md-5 {\n margin-top: 3rem !important;\n }\n .mt-md-auto {\n margin-top: auto !important;\n }\n .me-md-0 {\n margin-right: 0 !important;\n }\n .me-md-1 {\n margin-right: 0.25rem !important;\n }\n .me-md-2 {\n margin-right: 0.5rem !important;\n }\n .me-md-3 {\n margin-right: 1rem !important;\n }\n .me-md-4 {\n margin-right: 1.5rem !important;\n }\n .me-md-5 {\n margin-right: 3rem !important;\n }\n .me-md-auto {\n margin-right: auto !important;\n }\n .mb-md-0 {\n margin-bottom: 0 !important;\n }\n .mb-md-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-md-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-md-3 {\n margin-bottom: 1rem !important;\n }\n .mb-md-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-md-5 {\n margin-bottom: 3rem !important;\n }\n .mb-md-auto {\n margin-bottom: auto !important;\n }\n .ms-md-0 {\n margin-left: 0 !important;\n }\n .ms-md-1 {\n margin-left: 0.25rem !important;\n }\n .ms-md-2 {\n margin-left: 0.5rem !important;\n }\n .ms-md-3 {\n margin-left: 1rem !important;\n }\n .ms-md-4 {\n margin-left: 1.5rem !important;\n }\n .ms-md-5 {\n margin-left: 3rem !important;\n }\n .ms-md-auto {\n margin-left: auto !important;\n }\n .p-md-0 {\n padding: 0 !important;\n }\n .p-md-1 {\n padding: 0.25rem !important;\n }\n .p-md-2 {\n padding: 0.5rem !important;\n }\n .p-md-3 {\n padding: 1rem !important;\n }\n .p-md-4 {\n padding: 1.5rem !important;\n }\n .p-md-5 {\n padding: 3rem !important;\n }\n .px-md-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-md-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-md-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-md-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-md-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-md-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-md-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-md-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-md-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-md-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-md-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-md-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-md-0 {\n padding-top: 0 !important;\n }\n .pt-md-1 {\n padding-top: 0.25rem !important;\n }\n .pt-md-2 {\n padding-top: 0.5rem !important;\n }\n .pt-md-3 {\n padding-top: 1rem !important;\n }\n .pt-md-4 {\n padding-top: 1.5rem !important;\n }\n .pt-md-5 {\n padding-top: 3rem !important;\n }\n .pe-md-0 {\n padding-right: 0 !important;\n }\n .pe-md-1 {\n padding-right: 0.25rem !important;\n }\n .pe-md-2 {\n padding-right: 0.5rem !important;\n }\n .pe-md-3 {\n padding-right: 1rem !important;\n }\n .pe-md-4 {\n padding-right: 1.5rem !important;\n }\n .pe-md-5 {\n padding-right: 3rem !important;\n }\n .pb-md-0 {\n padding-bottom: 0 !important;\n }\n .pb-md-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-md-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-md-3 {\n padding-bottom: 1rem !important;\n }\n .pb-md-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-md-5 {\n padding-bottom: 3rem !important;\n }\n .ps-md-0 {\n padding-left: 0 !important;\n }\n .ps-md-1 {\n padding-left: 0.25rem !important;\n }\n .ps-md-2 {\n padding-left: 0.5rem !important;\n }\n .ps-md-3 {\n padding-left: 1rem !important;\n }\n .ps-md-4 {\n padding-left: 1.5rem !important;\n }\n .ps-md-5 {\n padding-left: 3rem !important;\n }\n .gap-md-0 {\n gap: 0 !important;\n }\n .gap-md-1 {\n gap: 0.25rem !important;\n }\n .gap-md-2 {\n gap: 0.5rem !important;\n }\n .gap-md-3 {\n gap: 1rem !important;\n }\n .gap-md-4 {\n gap: 1.5rem !important;\n }\n .gap-md-5 {\n gap: 3rem !important;\n }\n .row-gap-md-0 {\n row-gap: 0 !important;\n }\n .row-gap-md-1 {\n row-gap: 0.25rem !important;\n }\n .row-gap-md-2 {\n row-gap: 0.5rem !important;\n }\n .row-gap-md-3 {\n row-gap: 1rem !important;\n }\n .row-gap-md-4 {\n row-gap: 1.5rem !important;\n }\n .row-gap-md-5 {\n row-gap: 3rem !important;\n }\n .column-gap-md-0 {\n -moz-column-gap: 0 !important;\n column-gap: 0 !important;\n }\n .column-gap-md-1 {\n -moz-column-gap: 0.25rem !important;\n column-gap: 0.25rem !important;\n }\n .column-gap-md-2 {\n -moz-column-gap: 0.5rem !important;\n column-gap: 0.5rem !important;\n }\n .column-gap-md-3 {\n -moz-column-gap: 1rem !important;\n column-gap: 1rem !important;\n }\n .column-gap-md-4 {\n -moz-column-gap: 1.5rem !important;\n column-gap: 1.5rem !important;\n }\n .column-gap-md-5 {\n -moz-column-gap: 3rem !important;\n column-gap: 3rem !important;\n }\n .text-md-start {\n text-align: left !important;\n }\n .text-md-end {\n text-align: right !important;\n }\n .text-md-center {\n text-align: center !important;\n }\n}\n@media (min-width: 992px) {\n .float-lg-start {\n float: left !important;\n }\n .float-lg-end {\n float: right !important;\n }\n .float-lg-none {\n float: none !important;\n }\n .object-fit-lg-contain {\n -o-object-fit: contain !important;\n object-fit: contain !important;\n }\n .object-fit-lg-cover {\n -o-object-fit: cover !important;\n object-fit: cover !important;\n }\n .object-fit-lg-fill {\n -o-object-fit: fill !important;\n object-fit: fill !important;\n }\n .object-fit-lg-scale {\n -o-object-fit: scale-down !important;\n object-fit: scale-down !important;\n }\n .object-fit-lg-none {\n -o-object-fit: none !important;\n object-fit: none !important;\n }\n .d-lg-inline {\n display: inline !important;\n }\n .d-lg-inline-block {\n display: inline-block !important;\n }\n .d-lg-block {\n display: block !important;\n }\n .d-lg-grid {\n display: grid !important;\n }\n .d-lg-inline-grid {\n display: inline-grid !important;\n }\n .d-lg-table {\n display: table !important;\n }\n .d-lg-table-row {\n display: table-row !important;\n }\n .d-lg-table-cell {\n display: table-cell !important;\n }\n .d-lg-flex {\n display: flex !important;\n }\n .d-lg-inline-flex {\n display: inline-flex !important;\n }\n .d-lg-none {\n display: none !important;\n }\n .flex-lg-fill {\n flex: 1 1 auto !important;\n }\n .flex-lg-row {\n flex-direction: row !important;\n }\n .flex-lg-column {\n flex-direction: column !important;\n }\n .flex-lg-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-lg-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-lg-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-lg-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-lg-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-lg-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-lg-wrap {\n flex-wrap: wrap !important;\n }\n .flex-lg-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-lg-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-lg-start {\n justify-content: flex-start !important;\n }\n .justify-content-lg-end {\n justify-content: flex-end !important;\n }\n .justify-content-lg-center {\n justify-content: center !important;\n }\n .justify-content-lg-between {\n justify-content: space-between !important;\n }\n .justify-content-lg-around {\n justify-content: space-around !important;\n }\n .justify-content-lg-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-lg-start {\n align-items: flex-start !important;\n }\n .align-items-lg-end {\n align-items: flex-end !important;\n }\n .align-items-lg-center {\n align-items: center !important;\n }\n .align-items-lg-baseline {\n align-items: baseline !important;\n }\n .align-items-lg-stretch {\n align-items: stretch !important;\n }\n .align-content-lg-start {\n align-content: flex-start !important;\n }\n .align-content-lg-end {\n align-content: flex-end !important;\n }\n .align-content-lg-center {\n align-content: center !important;\n }\n .align-content-lg-between {\n align-content: space-between !important;\n }\n .align-content-lg-around {\n align-content: space-around !important;\n }\n .align-content-lg-stretch {\n align-content: stretch !important;\n }\n .align-self-lg-auto {\n align-self: auto !important;\n }\n .align-self-lg-start {\n align-self: flex-start !important;\n }\n .align-self-lg-end {\n align-self: flex-end !important;\n }\n .align-self-lg-center {\n align-self: center !important;\n }\n .align-self-lg-baseline {\n align-self: baseline !important;\n }\n .align-self-lg-stretch {\n align-self: stretch !important;\n }\n .order-lg-first {\n order: -1 !important;\n }\n .order-lg-0 {\n order: 0 !important;\n }\n .order-lg-1 {\n order: 1 !important;\n }\n .order-lg-2 {\n order: 2 !important;\n }\n .order-lg-3 {\n order: 3 !important;\n }\n .order-lg-4 {\n order: 4 !important;\n }\n .order-lg-5 {\n order: 5 !important;\n }\n .order-lg-last {\n order: 6 !important;\n }\n .m-lg-0 {\n margin: 0 !important;\n }\n .m-lg-1 {\n margin: 0.25rem !important;\n }\n .m-lg-2 {\n margin: 0.5rem !important;\n }\n .m-lg-3 {\n margin: 1rem !important;\n }\n .m-lg-4 {\n margin: 1.5rem !important;\n }\n .m-lg-5 {\n margin: 3rem !important;\n }\n .m-lg-auto {\n margin: auto !important;\n }\n .mx-lg-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-lg-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-lg-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-lg-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-lg-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-lg-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-lg-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-lg-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-lg-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-lg-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-lg-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-lg-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-lg-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-lg-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-lg-0 {\n margin-top: 0 !important;\n }\n .mt-lg-1 {\n margin-top: 0.25rem !important;\n }\n .mt-lg-2 {\n margin-top: 0.5rem !important;\n }\n .mt-lg-3 {\n margin-top: 1rem !important;\n }\n .mt-lg-4 {\n margin-top: 1.5rem !important;\n }\n .mt-lg-5 {\n margin-top: 3rem !important;\n }\n .mt-lg-auto {\n margin-top: auto !important;\n }\n .me-lg-0 {\n margin-right: 0 !important;\n }\n .me-lg-1 {\n margin-right: 0.25rem !important;\n }\n .me-lg-2 {\n margin-right: 0.5rem !important;\n }\n .me-lg-3 {\n margin-right: 1rem !important;\n }\n .me-lg-4 {\n margin-right: 1.5rem !important;\n }\n .me-lg-5 {\n margin-right: 3rem !important;\n }\n .me-lg-auto {\n margin-right: auto !important;\n }\n .mb-lg-0 {\n margin-bottom: 0 !important;\n }\n .mb-lg-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-lg-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-lg-3 {\n margin-bottom: 1rem !important;\n }\n .mb-lg-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-lg-5 {\n margin-bottom: 3rem !important;\n }\n .mb-lg-auto {\n margin-bottom: auto !important;\n }\n .ms-lg-0 {\n margin-left: 0 !important;\n }\n .ms-lg-1 {\n margin-left: 0.25rem !important;\n }\n .ms-lg-2 {\n margin-left: 0.5rem !important;\n }\n .ms-lg-3 {\n margin-left: 1rem !important;\n }\n .ms-lg-4 {\n margin-left: 1.5rem !important;\n }\n .ms-lg-5 {\n margin-left: 3rem !important;\n }\n .ms-lg-auto {\n margin-left: auto !important;\n }\n .p-lg-0 {\n padding: 0 !important;\n }\n .p-lg-1 {\n padding: 0.25rem !important;\n }\n .p-lg-2 {\n padding: 0.5rem !important;\n }\n .p-lg-3 {\n padding: 1rem !important;\n }\n .p-lg-4 {\n padding: 1.5rem !important;\n }\n .p-lg-5 {\n padding: 3rem !important;\n }\n .px-lg-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-lg-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-lg-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-lg-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-lg-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-lg-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-lg-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-lg-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-lg-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-lg-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-lg-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-lg-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-lg-0 {\n padding-top: 0 !important;\n }\n .pt-lg-1 {\n padding-top: 0.25rem !important;\n }\n .pt-lg-2 {\n padding-top: 0.5rem !important;\n }\n .pt-lg-3 {\n padding-top: 1rem !important;\n }\n .pt-lg-4 {\n padding-top: 1.5rem !important;\n }\n .pt-lg-5 {\n padding-top: 3rem !important;\n }\n .pe-lg-0 {\n padding-right: 0 !important;\n }\n .pe-lg-1 {\n padding-right: 0.25rem !important;\n }\n .pe-lg-2 {\n padding-right: 0.5rem !important;\n }\n .pe-lg-3 {\n padding-right: 1rem !important;\n }\n .pe-lg-4 {\n padding-right: 1.5rem !important;\n }\n .pe-lg-5 {\n padding-right: 3rem !important;\n }\n .pb-lg-0 {\n padding-bottom: 0 !important;\n }\n .pb-lg-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-lg-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-lg-3 {\n padding-bottom: 1rem !important;\n }\n .pb-lg-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-lg-5 {\n padding-bottom: 3rem !important;\n }\n .ps-lg-0 {\n padding-left: 0 !important;\n }\n .ps-lg-1 {\n padding-left: 0.25rem !important;\n }\n .ps-lg-2 {\n padding-left: 0.5rem !important;\n }\n .ps-lg-3 {\n padding-left: 1rem !important;\n }\n .ps-lg-4 {\n padding-left: 1.5rem !important;\n }\n .ps-lg-5 {\n padding-left: 3rem !important;\n }\n .gap-lg-0 {\n gap: 0 !important;\n }\n .gap-lg-1 {\n gap: 0.25rem !important;\n }\n .gap-lg-2 {\n gap: 0.5rem !important;\n }\n .gap-lg-3 {\n gap: 1rem !important;\n }\n .gap-lg-4 {\n gap: 1.5rem !important;\n }\n .gap-lg-5 {\n gap: 3rem !important;\n }\n .row-gap-lg-0 {\n row-gap: 0 !important;\n }\n .row-gap-lg-1 {\n row-gap: 0.25rem !important;\n }\n .row-gap-lg-2 {\n row-gap: 0.5rem !important;\n }\n .row-gap-lg-3 {\n row-gap: 1rem !important;\n }\n .row-gap-lg-4 {\n row-gap: 1.5rem !important;\n }\n .row-gap-lg-5 {\n row-gap: 3rem !important;\n }\n .column-gap-lg-0 {\n -moz-column-gap: 0 !important;\n column-gap: 0 !important;\n }\n .column-gap-lg-1 {\n -moz-column-gap: 0.25rem !important;\n column-gap: 0.25rem !important;\n }\n .column-gap-lg-2 {\n -moz-column-gap: 0.5rem !important;\n column-gap: 0.5rem !important;\n }\n .column-gap-lg-3 {\n -moz-column-gap: 1rem !important;\n column-gap: 1rem !important;\n }\n .column-gap-lg-4 {\n -moz-column-gap: 1.5rem !important;\n column-gap: 1.5rem !important;\n }\n .column-gap-lg-5 {\n -moz-column-gap: 3rem !important;\n column-gap: 3rem !important;\n }\n .text-lg-start {\n text-align: left !important;\n }\n .text-lg-end {\n text-align: right !important;\n }\n .text-lg-center {\n text-align: center !important;\n }\n}\n@media (min-width: 1200px) {\n .float-xl-start {\n float: left !important;\n }\n .float-xl-end {\n float: right !important;\n }\n .float-xl-none {\n float: none !important;\n }\n .object-fit-xl-contain {\n -o-object-fit: contain !important;\n object-fit: contain !important;\n }\n .object-fit-xl-cover {\n -o-object-fit: cover !important;\n object-fit: cover !important;\n }\n .object-fit-xl-fill {\n -o-object-fit: fill !important;\n object-fit: fill !important;\n }\n .object-fit-xl-scale {\n -o-object-fit: scale-down !important;\n object-fit: scale-down !important;\n }\n .object-fit-xl-none {\n -o-object-fit: none !important;\n object-fit: none !important;\n }\n .d-xl-inline {\n display: inline !important;\n }\n .d-xl-inline-block {\n display: inline-block !important;\n }\n .d-xl-block {\n display: block !important;\n }\n .d-xl-grid {\n display: grid !important;\n }\n .d-xl-inline-grid {\n display: inline-grid !important;\n }\n .d-xl-table {\n display: table !important;\n }\n .d-xl-table-row {\n display: table-row !important;\n }\n .d-xl-table-cell {\n display: table-cell !important;\n }\n .d-xl-flex {\n display: flex !important;\n }\n .d-xl-inline-flex {\n display: inline-flex !important;\n }\n .d-xl-none {\n display: none !important;\n }\n .flex-xl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xl-row {\n flex-direction: row !important;\n }\n .flex-xl-column {\n flex-direction: column !important;\n }\n .flex-xl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xl-center {\n justify-content: center !important;\n }\n .justify-content-xl-between {\n justify-content: space-between !important;\n }\n .justify-content-xl-around {\n justify-content: space-around !important;\n }\n .justify-content-xl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xl-start {\n align-items: flex-start !important;\n }\n .align-items-xl-end {\n align-items: flex-end !important;\n }\n .align-items-xl-center {\n align-items: center !important;\n }\n .align-items-xl-baseline {\n align-items: baseline !important;\n }\n .align-items-xl-stretch {\n align-items: stretch !important;\n }\n .align-content-xl-start {\n align-content: flex-start !important;\n }\n .align-content-xl-end {\n align-content: flex-end !important;\n }\n .align-content-xl-center {\n align-content: center !important;\n }\n .align-content-xl-between {\n align-content: space-between !important;\n }\n .align-content-xl-around {\n align-content: space-around !important;\n }\n .align-content-xl-stretch {\n align-content: stretch !important;\n }\n .align-self-xl-auto {\n align-self: auto !important;\n }\n .align-self-xl-start {\n align-self: flex-start !important;\n }\n .align-self-xl-end {\n align-self: flex-end !important;\n }\n .align-self-xl-center {\n align-self: center !important;\n }\n .align-self-xl-baseline {\n align-self: baseline !important;\n }\n .align-self-xl-stretch {\n align-self: stretch !important;\n }\n .order-xl-first {\n order: -1 !important;\n }\n .order-xl-0 {\n order: 0 !important;\n }\n .order-xl-1 {\n order: 1 !important;\n }\n .order-xl-2 {\n order: 2 !important;\n }\n .order-xl-3 {\n order: 3 !important;\n }\n .order-xl-4 {\n order: 4 !important;\n }\n .order-xl-5 {\n order: 5 !important;\n }\n .order-xl-last {\n order: 6 !important;\n }\n .m-xl-0 {\n margin: 0 !important;\n }\n .m-xl-1 {\n margin: 0.25rem !important;\n }\n .m-xl-2 {\n margin: 0.5rem !important;\n }\n .m-xl-3 {\n margin: 1rem !important;\n }\n .m-xl-4 {\n margin: 1.5rem !important;\n }\n .m-xl-5 {\n margin: 3rem !important;\n }\n .m-xl-auto {\n margin: auto !important;\n }\n .mx-xl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xl-0 {\n margin-top: 0 !important;\n }\n .mt-xl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xl-3 {\n margin-top: 1rem !important;\n }\n .mt-xl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xl-5 {\n margin-top: 3rem !important;\n }\n .mt-xl-auto {\n margin-top: auto !important;\n }\n .me-xl-0 {\n margin-right: 0 !important;\n }\n .me-xl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xl-3 {\n margin-right: 1rem !important;\n }\n .me-xl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xl-5 {\n margin-right: 3rem !important;\n }\n .me-xl-auto {\n margin-right: auto !important;\n }\n .mb-xl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xl-auto {\n margin-bottom: auto !important;\n }\n .ms-xl-0 {\n margin-left: 0 !important;\n }\n .ms-xl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xl-3 {\n margin-left: 1rem !important;\n }\n .ms-xl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xl-5 {\n margin-left: 3rem !important;\n }\n .ms-xl-auto {\n margin-left: auto !important;\n }\n .p-xl-0 {\n padding: 0 !important;\n }\n .p-xl-1 {\n padding: 0.25rem !important;\n }\n .p-xl-2 {\n padding: 0.5rem !important;\n }\n .p-xl-3 {\n padding: 1rem !important;\n }\n .p-xl-4 {\n padding: 1.5rem !important;\n }\n .p-xl-5 {\n padding: 3rem !important;\n }\n .px-xl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xl-0 {\n padding-top: 0 !important;\n }\n .pt-xl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xl-3 {\n padding-top: 1rem !important;\n }\n .pt-xl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xl-5 {\n padding-top: 3rem !important;\n }\n .pe-xl-0 {\n padding-right: 0 !important;\n }\n .pe-xl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xl-3 {\n padding-right: 1rem !important;\n }\n .pe-xl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xl-5 {\n padding-right: 3rem !important;\n }\n .pb-xl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xl-0 {\n padding-left: 0 !important;\n }\n .ps-xl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xl-3 {\n padding-left: 1rem !important;\n }\n .ps-xl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xl-5 {\n padding-left: 3rem !important;\n }\n .gap-xl-0 {\n gap: 0 !important;\n }\n .gap-xl-1 {\n gap: 0.25rem !important;\n }\n .gap-xl-2 {\n gap: 0.5rem !important;\n }\n .gap-xl-3 {\n gap: 1rem !important;\n }\n .gap-xl-4 {\n gap: 1.5rem !important;\n }\n .gap-xl-5 {\n gap: 3rem !important;\n }\n .row-gap-xl-0 {\n row-gap: 0 !important;\n }\n .row-gap-xl-1 {\n row-gap: 0.25rem !important;\n }\n .row-gap-xl-2 {\n row-gap: 0.5rem !important;\n }\n .row-gap-xl-3 {\n row-gap: 1rem !important;\n }\n .row-gap-xl-4 {\n row-gap: 1.5rem !important;\n }\n .row-gap-xl-5 {\n row-gap: 3rem !important;\n }\n .column-gap-xl-0 {\n -moz-column-gap: 0 !important;\n column-gap: 0 !important;\n }\n .column-gap-xl-1 {\n -moz-column-gap: 0.25rem !important;\n column-gap: 0.25rem !important;\n }\n .column-gap-xl-2 {\n -moz-column-gap: 0.5rem !important;\n column-gap: 0.5rem !important;\n }\n .column-gap-xl-3 {\n -moz-column-gap: 1rem !important;\n column-gap: 1rem !important;\n }\n .column-gap-xl-4 {\n -moz-column-gap: 1.5rem !important;\n column-gap: 1.5rem !important;\n }\n .column-gap-xl-5 {\n -moz-column-gap: 3rem !important;\n column-gap: 3rem !important;\n }\n .text-xl-start {\n text-align: left !important;\n }\n .text-xl-end {\n text-align: right !important;\n }\n .text-xl-center {\n text-align: center !important;\n }\n}\n@media (min-width: 1400px) {\n .float-xxl-start {\n float: left !important;\n }\n .float-xxl-end {\n float: right !important;\n }\n .float-xxl-none {\n float: none !important;\n }\n .object-fit-xxl-contain {\n -o-object-fit: contain !important;\n object-fit: contain !important;\n }\n .object-fit-xxl-cover {\n -o-object-fit: cover !important;\n object-fit: cover !important;\n }\n .object-fit-xxl-fill {\n -o-object-fit: fill !important;\n object-fit: fill !important;\n }\n .object-fit-xxl-scale {\n -o-object-fit: scale-down !important;\n object-fit: scale-down !important;\n }\n .object-fit-xxl-none {\n -o-object-fit: none !important;\n object-fit: none !important;\n }\n .d-xxl-inline {\n display: inline !important;\n }\n .d-xxl-inline-block {\n display: inline-block !important;\n }\n .d-xxl-block {\n display: block !important;\n }\n .d-xxl-grid {\n display: grid !important;\n }\n .d-xxl-inline-grid {\n display: inline-grid !important;\n }\n .d-xxl-table {\n display: table !important;\n }\n .d-xxl-table-row {\n display: table-row !important;\n }\n .d-xxl-table-cell {\n display: table-cell !important;\n }\n .d-xxl-flex {\n display: flex !important;\n }\n .d-xxl-inline-flex {\n display: inline-flex !important;\n }\n .d-xxl-none {\n display: none !important;\n }\n .flex-xxl-fill {\n flex: 1 1 auto !important;\n }\n .flex-xxl-row {\n flex-direction: row !important;\n }\n .flex-xxl-column {\n flex-direction: column !important;\n }\n .flex-xxl-row-reverse {\n flex-direction: row-reverse !important;\n }\n .flex-xxl-column-reverse {\n flex-direction: column-reverse !important;\n }\n .flex-xxl-grow-0 {\n flex-grow: 0 !important;\n }\n .flex-xxl-grow-1 {\n flex-grow: 1 !important;\n }\n .flex-xxl-shrink-0 {\n flex-shrink: 0 !important;\n }\n .flex-xxl-shrink-1 {\n flex-shrink: 1 !important;\n }\n .flex-xxl-wrap {\n flex-wrap: wrap !important;\n }\n .flex-xxl-nowrap {\n flex-wrap: nowrap !important;\n }\n .flex-xxl-wrap-reverse {\n flex-wrap: wrap-reverse !important;\n }\n .justify-content-xxl-start {\n justify-content: flex-start !important;\n }\n .justify-content-xxl-end {\n justify-content: flex-end !important;\n }\n .justify-content-xxl-center {\n justify-content: center !important;\n }\n .justify-content-xxl-between {\n justify-content: space-between !important;\n }\n .justify-content-xxl-around {\n justify-content: space-around !important;\n }\n .justify-content-xxl-evenly {\n justify-content: space-evenly !important;\n }\n .align-items-xxl-start {\n align-items: flex-start !important;\n }\n .align-items-xxl-end {\n align-items: flex-end !important;\n }\n .align-items-xxl-center {\n align-items: center !important;\n }\n .align-items-xxl-baseline {\n align-items: baseline !important;\n }\n .align-items-xxl-stretch {\n align-items: stretch !important;\n }\n .align-content-xxl-start {\n align-content: flex-start !important;\n }\n .align-content-xxl-end {\n align-content: flex-end !important;\n }\n .align-content-xxl-center {\n align-content: center !important;\n }\n .align-content-xxl-between {\n align-content: space-between !important;\n }\n .align-content-xxl-around {\n align-content: space-around !important;\n }\n .align-content-xxl-stretch {\n align-content: stretch !important;\n }\n .align-self-xxl-auto {\n align-self: auto !important;\n }\n .align-self-xxl-start {\n align-self: flex-start !important;\n }\n .align-self-xxl-end {\n align-self: flex-end !important;\n }\n .align-self-xxl-center {\n align-self: center !important;\n }\n .align-self-xxl-baseline {\n align-self: baseline !important;\n }\n .align-self-xxl-stretch {\n align-self: stretch !important;\n }\n .order-xxl-first {\n order: -1 !important;\n }\n .order-xxl-0 {\n order: 0 !important;\n }\n .order-xxl-1 {\n order: 1 !important;\n }\n .order-xxl-2 {\n order: 2 !important;\n }\n .order-xxl-3 {\n order: 3 !important;\n }\n .order-xxl-4 {\n order: 4 !important;\n }\n .order-xxl-5 {\n order: 5 !important;\n }\n .order-xxl-last {\n order: 6 !important;\n }\n .m-xxl-0 {\n margin: 0 !important;\n }\n .m-xxl-1 {\n margin: 0.25rem !important;\n }\n .m-xxl-2 {\n margin: 0.5rem !important;\n }\n .m-xxl-3 {\n margin: 1rem !important;\n }\n .m-xxl-4 {\n margin: 1.5rem !important;\n }\n .m-xxl-5 {\n margin: 3rem !important;\n }\n .m-xxl-auto {\n margin: auto !important;\n }\n .mx-xxl-0 {\n margin-right: 0 !important;\n margin-left: 0 !important;\n }\n .mx-xxl-1 {\n margin-right: 0.25rem !important;\n margin-left: 0.25rem !important;\n }\n .mx-xxl-2 {\n margin-right: 0.5rem !important;\n margin-left: 0.5rem !important;\n }\n .mx-xxl-3 {\n margin-right: 1rem !important;\n margin-left: 1rem !important;\n }\n .mx-xxl-4 {\n margin-right: 1.5rem !important;\n margin-left: 1.5rem !important;\n }\n .mx-xxl-5 {\n margin-right: 3rem !important;\n margin-left: 3rem !important;\n }\n .mx-xxl-auto {\n margin-right: auto !important;\n margin-left: auto !important;\n }\n .my-xxl-0 {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n }\n .my-xxl-1 {\n margin-top: 0.25rem !important;\n margin-bottom: 0.25rem !important;\n }\n .my-xxl-2 {\n margin-top: 0.5rem !important;\n margin-bottom: 0.5rem !important;\n }\n .my-xxl-3 {\n margin-top: 1rem !important;\n margin-bottom: 1rem !important;\n }\n .my-xxl-4 {\n margin-top: 1.5rem !important;\n margin-bottom: 1.5rem !important;\n }\n .my-xxl-5 {\n margin-top: 3rem !important;\n margin-bottom: 3rem !important;\n }\n .my-xxl-auto {\n margin-top: auto !important;\n margin-bottom: auto !important;\n }\n .mt-xxl-0 {\n margin-top: 0 !important;\n }\n .mt-xxl-1 {\n margin-top: 0.25rem !important;\n }\n .mt-xxl-2 {\n margin-top: 0.5rem !important;\n }\n .mt-xxl-3 {\n margin-top: 1rem !important;\n }\n .mt-xxl-4 {\n margin-top: 1.5rem !important;\n }\n .mt-xxl-5 {\n margin-top: 3rem !important;\n }\n .mt-xxl-auto {\n margin-top: auto !important;\n }\n .me-xxl-0 {\n margin-right: 0 !important;\n }\n .me-xxl-1 {\n margin-right: 0.25rem !important;\n }\n .me-xxl-2 {\n margin-right: 0.5rem !important;\n }\n .me-xxl-3 {\n margin-right: 1rem !important;\n }\n .me-xxl-4 {\n margin-right: 1.5rem !important;\n }\n .me-xxl-5 {\n margin-right: 3rem !important;\n }\n .me-xxl-auto {\n margin-right: auto !important;\n }\n .mb-xxl-0 {\n margin-bottom: 0 !important;\n }\n .mb-xxl-1 {\n margin-bottom: 0.25rem !important;\n }\n .mb-xxl-2 {\n margin-bottom: 0.5rem !important;\n }\n .mb-xxl-3 {\n margin-bottom: 1rem !important;\n }\n .mb-xxl-4 {\n margin-bottom: 1.5rem !important;\n }\n .mb-xxl-5 {\n margin-bottom: 3rem !important;\n }\n .mb-xxl-auto {\n margin-bottom: auto !important;\n }\n .ms-xxl-0 {\n margin-left: 0 !important;\n }\n .ms-xxl-1 {\n margin-left: 0.25rem !important;\n }\n .ms-xxl-2 {\n margin-left: 0.5rem !important;\n }\n .ms-xxl-3 {\n margin-left: 1rem !important;\n }\n .ms-xxl-4 {\n margin-left: 1.5rem !important;\n }\n .ms-xxl-5 {\n margin-left: 3rem !important;\n }\n .ms-xxl-auto {\n margin-left: auto !important;\n }\n .p-xxl-0 {\n padding: 0 !important;\n }\n .p-xxl-1 {\n padding: 0.25rem !important;\n }\n .p-xxl-2 {\n padding: 0.5rem !important;\n }\n .p-xxl-3 {\n padding: 1rem !important;\n }\n .p-xxl-4 {\n padding: 1.5rem !important;\n }\n .p-xxl-5 {\n padding: 3rem !important;\n }\n .px-xxl-0 {\n padding-right: 0 !important;\n padding-left: 0 !important;\n }\n .px-xxl-1 {\n padding-right: 0.25rem !important;\n padding-left: 0.25rem !important;\n }\n .px-xxl-2 {\n padding-right: 0.5rem !important;\n padding-left: 0.5rem !important;\n }\n .px-xxl-3 {\n padding-right: 1rem !important;\n padding-left: 1rem !important;\n }\n .px-xxl-4 {\n padding-right: 1.5rem !important;\n padding-left: 1.5rem !important;\n }\n .px-xxl-5 {\n padding-right: 3rem !important;\n padding-left: 3rem !important;\n }\n .py-xxl-0 {\n padding-top: 0 !important;\n padding-bottom: 0 !important;\n }\n .py-xxl-1 {\n padding-top: 0.25rem !important;\n padding-bottom: 0.25rem !important;\n }\n .py-xxl-2 {\n padding-top: 0.5rem !important;\n padding-bottom: 0.5rem !important;\n }\n .py-xxl-3 {\n padding-top: 1rem !important;\n padding-bottom: 1rem !important;\n }\n .py-xxl-4 {\n padding-top: 1.5rem !important;\n padding-bottom: 1.5rem !important;\n }\n .py-xxl-5 {\n padding-top: 3rem !important;\n padding-bottom: 3rem !important;\n }\n .pt-xxl-0 {\n padding-top: 0 !important;\n }\n .pt-xxl-1 {\n padding-top: 0.25rem !important;\n }\n .pt-xxl-2 {\n padding-top: 0.5rem !important;\n }\n .pt-xxl-3 {\n padding-top: 1rem !important;\n }\n .pt-xxl-4 {\n padding-top: 1.5rem !important;\n }\n .pt-xxl-5 {\n padding-top: 3rem !important;\n }\n .pe-xxl-0 {\n padding-right: 0 !important;\n }\n .pe-xxl-1 {\n padding-right: 0.25rem !important;\n }\n .pe-xxl-2 {\n padding-right: 0.5rem !important;\n }\n .pe-xxl-3 {\n padding-right: 1rem !important;\n }\n .pe-xxl-4 {\n padding-right: 1.5rem !important;\n }\n .pe-xxl-5 {\n padding-right: 3rem !important;\n }\n .pb-xxl-0 {\n padding-bottom: 0 !important;\n }\n .pb-xxl-1 {\n padding-bottom: 0.25rem !important;\n }\n .pb-xxl-2 {\n padding-bottom: 0.5rem !important;\n }\n .pb-xxl-3 {\n padding-bottom: 1rem !important;\n }\n .pb-xxl-4 {\n padding-bottom: 1.5rem !important;\n }\n .pb-xxl-5 {\n padding-bottom: 3rem !important;\n }\n .ps-xxl-0 {\n padding-left: 0 !important;\n }\n .ps-xxl-1 {\n padding-left: 0.25rem !important;\n }\n .ps-xxl-2 {\n padding-left: 0.5rem !important;\n }\n .ps-xxl-3 {\n padding-left: 1rem !important;\n }\n .ps-xxl-4 {\n padding-left: 1.5rem !important;\n }\n .ps-xxl-5 {\n padding-left: 3rem !important;\n }\n .gap-xxl-0 {\n gap: 0 !important;\n }\n .gap-xxl-1 {\n gap: 0.25rem !important;\n }\n .gap-xxl-2 {\n gap: 0.5rem !important;\n }\n .gap-xxl-3 {\n gap: 1rem !important;\n }\n .gap-xxl-4 {\n gap: 1.5rem !important;\n }\n .gap-xxl-5 {\n gap: 3rem !important;\n }\n .row-gap-xxl-0 {\n row-gap: 0 !important;\n }\n .row-gap-xxl-1 {\n row-gap: 0.25rem !important;\n }\n .row-gap-xxl-2 {\n row-gap: 0.5rem !important;\n }\n .row-gap-xxl-3 {\n row-gap: 1rem !important;\n }\n .row-gap-xxl-4 {\n row-gap: 1.5rem !important;\n }\n .row-gap-xxl-5 {\n row-gap: 3rem !important;\n }\n .column-gap-xxl-0 {\n -moz-column-gap: 0 !important;\n column-gap: 0 !important;\n }\n .column-gap-xxl-1 {\n -moz-column-gap: 0.25rem !important;\n column-gap: 0.25rem !important;\n }\n .column-gap-xxl-2 {\n -moz-column-gap: 0.5rem !important;\n column-gap: 0.5rem !important;\n }\n .column-gap-xxl-3 {\n -moz-column-gap: 1rem !important;\n column-gap: 1rem !important;\n }\n .column-gap-xxl-4 {\n -moz-column-gap: 1.5rem !important;\n column-gap: 1.5rem !important;\n }\n .column-gap-xxl-5 {\n -moz-column-gap: 3rem !important;\n column-gap: 3rem !important;\n }\n .text-xxl-start {\n text-align: left !important;\n }\n .text-xxl-end {\n text-align: right !important;\n }\n .text-xxl-center {\n text-align: center !important;\n }\n}\n@media (min-width: 1200px) {\n .fs-1 {\n font-size: 2.5rem !important;\n }\n .fs-2 {\n font-size: 2rem !important;\n }\n .fs-3 {\n font-size: 1.75rem !important;\n }\n .fs-4 {\n font-size: 1.5rem !important;\n }\n}\n@media print {\n .d-print-inline {\n display: inline !important;\n }\n .d-print-inline-block {\n display: inline-block !important;\n }\n .d-print-block {\n display: block !important;\n }\n .d-print-grid {\n display: grid !important;\n }\n .d-print-inline-grid {\n display: inline-grid !important;\n }\n .d-print-table {\n display: table !important;\n }\n .d-print-table-row {\n display: table-row !important;\n }\n .d-print-table-cell {\n display: table-cell !important;\n }\n .d-print-flex {\n display: flex !important;\n }\n .d-print-inline-flex {\n display: inline-flex !important;\n }\n .d-print-none {\n display: none !important;\n }\n}\n\n/*# sourceMappingURL=bootstrap.css.map */","// stylelint-disable declaration-no-important, selector-no-qualifying-type, property-no-vendor-prefix\n\n\n// Reboot\n//\n// Normalization of HTML elements, manually forked from Normalize.css to remove\n// styles targeting irrelevant browsers while applying new styles.\n//\n// Normalize is licensed MIT. https://github.com/necolas/normalize.css\n\n\n// Document\n//\n// Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n\n// Root\n//\n// Ability to the value of the root font sizes, affecting the value of `rem`.\n// null by default, thus nothing is generated.\n\n:root {\n @if $font-size-root != null {\n @include font-size(var(--#{$prefix}root-font-size));\n }\n\n @if $enable-smooth-scroll {\n @media (prefers-reduced-motion: no-preference) {\n scroll-behavior: smooth;\n }\n }\n}\n\n\n// Body\n//\n// 1. Remove the margin in all browsers.\n// 2. As a best practice, apply a default `background-color`.\n// 3. Prevent adjustments of font size after orientation changes in iOS.\n// 4. Change the default tap highlight to be completely transparent in iOS.\n\n// scss-docs-start reboot-body-rules\nbody {\n margin: 0; // 1\n font-family: var(--#{$prefix}body-font-family);\n @include font-size(var(--#{$prefix}body-font-size));\n font-weight: var(--#{$prefix}body-font-weight);\n line-height: var(--#{$prefix}body-line-height);\n color: var(--#{$prefix}body-color);\n text-align: var(--#{$prefix}body-text-align);\n background-color: var(--#{$prefix}body-bg); // 2\n -webkit-text-size-adjust: 100%; // 3\n -webkit-tap-highlight-color: rgba($black, 0); // 4\n}\n// scss-docs-end reboot-body-rules\n\n\n// Content grouping\n//\n// 1. Reset Firefox's gray color\n\nhr {\n margin: $hr-margin-y 0;\n color: $hr-color; // 1\n border: 0;\n border-top: $hr-border-width solid $hr-border-color;\n opacity: $hr-opacity;\n}\n\n\n// Typography\n//\n// 1. Remove top margins from headings\n// By default, `

`-`

` all receive top and bottom margins. We nuke the top\n// margin for easier control within type scales as it avoids margin collapsing.\n\n%heading {\n margin-top: 0; // 1\n margin-bottom: $headings-margin-bottom;\n font-family: $headings-font-family;\n font-style: $headings-font-style;\n font-weight: $headings-font-weight;\n line-height: $headings-line-height;\n color: var(--#{$prefix}heading-color);\n}\n\nh1 {\n @extend %heading;\n @include font-size($h1-font-size);\n}\n\nh2 {\n @extend %heading;\n @include font-size($h2-font-size);\n}\n\nh3 {\n @extend %heading;\n @include font-size($h3-font-size);\n}\n\nh4 {\n @extend %heading;\n @include font-size($h4-font-size);\n}\n\nh5 {\n @extend %heading;\n @include font-size($h5-font-size);\n}\n\nh6 {\n @extend %heading;\n @include font-size($h6-font-size);\n}\n\n\n// Reset margins on paragraphs\n//\n// Similarly, the top margin on `

`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\n\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n\n// Abbreviations\n//\n// 1. Add the correct text decoration in Chrome, Edge, Opera, and Safari.\n// 2. Add explicit cursor to indicate changed behavior.\n// 3. Prevent the text-decoration to be skipped.\n\nabbr[title] {\n text-decoration: underline dotted; // 1\n cursor: help; // 2\n text-decoration-skip-ink: none; // 3\n}\n\n\n// Address\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\n\n// Lists\n\nol,\nul {\n padding-left: 2rem;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\n// 1. Undo browser default\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // 1\n}\n\n\n// Blockquote\n\nblockquote {\n margin: 0 0 1rem;\n}\n\n\n// Strong\n//\n// Add the correct font weight in Chrome, Edge, and Safari\n\nb,\nstrong {\n font-weight: $font-weight-bolder;\n}\n\n\n// Small\n//\n// Add the correct font size in all browsers\n\nsmall {\n @include font-size($small-font-size);\n}\n\n\n// Mark\n\nmark {\n padding: $mark-padding;\n background-color: var(--#{$prefix}highlight-bg);\n}\n\n\n// Sub and Sup\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n\nsub,\nsup {\n position: relative;\n @include font-size($sub-sup-font-size);\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n// Links\n\na {\n color: rgba(var(--#{$prefix}link-color-rgb), var(--#{$prefix}link-opacity, 1));\n text-decoration: $link-decoration;\n\n &:hover {\n --#{$prefix}link-color-rgb: var(--#{$prefix}link-hover-color-rgb);\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([class]) {\n &,\n &:hover {\n color: inherit;\n text-decoration: none;\n }\n}\n\n\n// Code\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-code;\n @include font-size(1em); // Correct the odd `em` font sizing in all browsers.\n}\n\n// 1. Remove browser default top margin\n// 2. Reset browser default of `1em` to use `rem`s\n// 3. Don't allow content to break outside\n\npre {\n display: block;\n margin-top: 0; // 1\n margin-bottom: 1rem; // 2\n overflow: auto; // 3\n @include font-size($code-font-size);\n color: $pre-color;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n @include font-size(inherit);\n color: inherit;\n word-break: normal;\n }\n}\n\ncode {\n @include font-size($code-font-size);\n color: var(--#{$prefix}code-color);\n word-wrap: break-word;\n\n // Streamline the style when inside anchors to avoid broken underline and more\n a > & {\n color: inherit;\n }\n}\n\nkbd {\n padding: $kbd-padding-y $kbd-padding-x;\n @include font-size($kbd-font-size);\n color: $kbd-color;\n background-color: $kbd-bg;\n @include border-radius($border-radius-sm);\n\n kbd {\n padding: 0;\n @include font-size(1em);\n font-weight: $nested-kbd-font-weight;\n }\n}\n\n\n// Figures\n//\n// Apply a consistent margin strategy (matches our type styles).\n\nfigure {\n margin: 0 0 1rem;\n}\n\n\n// Images and content\n\nimg,\nsvg {\n vertical-align: middle;\n}\n\n\n// Tables\n//\n// Prevent double borders\n\ntable {\n caption-side: bottom;\n border-collapse: collapse;\n}\n\ncaption {\n padding-top: $table-cell-padding-y;\n padding-bottom: $table-cell-padding-y;\n color: $table-caption-color;\n text-align: left;\n}\n\n// 1. Removes font-weight bold by inheriting\n// 2. Matches default `` alignment by inheriting `text-align`.\n// 3. Fix alignment for Safari\n\nth {\n font-weight: $table-th-font-weight; // 1\n text-align: inherit; // 2\n text-align: -webkit-match-parent; // 3\n}\n\nthead,\ntbody,\ntfoot,\ntr,\ntd,\nth {\n border-color: inherit;\n border-style: solid;\n border-width: 0;\n}\n\n\n// Forms\n//\n// 1. Allow labels to use `margin` for spacing.\n\nlabel {\n display: inline-block; // 1\n}\n\n// Remove the default `border-radius` that macOS Chrome adds.\n// See https://github.com/twbs/bootstrap/issues/24093\n\nbutton {\n // stylelint-disable-next-line property-disallowed-list\n border-radius: 0;\n}\n\n// Explicitly remove focus outline in Chromium when it shouldn't be\n// visible (e.g. as result of mouse click or touch tap). It already\n// should be doing this automatically, but seems to currently be\n// confused and applies its very visible two-tone outline anyway.\n\nbutton:focus:not(:focus-visible) {\n outline: 0;\n}\n\n// 1. Remove the margin in Firefox and Safari\n\ninput,\nbutton,\nselect,\noptgroup,\ntextarea {\n margin: 0; // 1\n font-family: inherit;\n @include font-size(inherit);\n line-height: inherit;\n}\n\n// Remove the inheritance of text transform in Firefox\nbutton,\nselect {\n text-transform: none;\n}\n// Set the cursor for non-`\n \n \n \n )\n }\n}\n\nconst getElements = (graph) => {\n const elements = [];\n if (graph.nodes && graph.edges) {\n graph.nodes.forEach(node => {\n elements.push({\n data: {\n id: node.id,\n label: getLabel(node.label),\n parent: node.parent,\n attributes: node.attributes,\n properties: node.properties,\n node_type: node.node_type,\n highlight: String(node.highlight),\n border_color: node.node_type === 'group_node' ? '#5B69FF' : customColor[getHash(node.label)],\n color: node.node_type === 'group_node' ? '#fff' : customColor[getHash(node.label)],\n },\n grabbable: false,\n });\n });\n graph.edges.forEach(edge => {\n elements.push({\n data: {\n source: edge.source,\n target: edge.target,\n }\n });\n });\n }\n return elements;\n}\n\nfunction getHash(input) {\n var hash = 0, len = input.length;\n for (var i = 0; i < len; i++) {\n hash = ((hash << 5) - hash) + input.charCodeAt(i);\n hash |= 0;\n }\n hash = Math.abs(hash);\n return hash % customColor.length;\n}\n\n","// -* - coding: utf - 8 -* -\n// Copyright(c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport React, { useEffect, useState } from 'react';\nimport './OpDetails.scss';\nimport Button from 'react-bootstrap/esm/Button';\nimport { api } from './../../App';\n\nexport default function OpDetails({ selectedWorkload, selectedOp, setHistogramType, setSelectedPattern, setWarningText }) {\n const [opDetails, setOpDetails] = useState({\n \"OP name\": \"\",\n \"Pattern\": {\n \"sequence\": [],\n \"precision\": \"\"\n },\n \"Weights\": {\n \"dtype\": \"\",\n \"granularity\": \"\"\n },\n \"Activation\": {\n \"dtype\": \"\"\n }\n });\n\n useEffect(() => {\n if (selectedOp?.length) {\n api.post('api/diagnosis/op_details?token=' + localStorage.getItem('token'), { workload_id: selectedWorkload.uuid, op_name: selectedOp })\n .then(\n response => {\n setOpDetails(response.data);\n setSelectedPattern(response.data.Pattern.sequence);\n setHistogramType(null);\n })\n .catch(error => {\n setWarningText(error.message);\n });\n }\n }, [selectedOp]);\n\n return (\n

\n {selectedOp &&\n
\n

OP details

\n
\n {selectedWorkload.framework !== 'PyTorch' &&\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
OP name{opDetails['OP name']}
Pattern
Sequence\n {opDetails.Pattern.sequence.map(\n sequence => {\n return {sequence} \n }\n )}\n
Precision{opDetails.Pattern.precision}
\n Weights\n
Dtype{opDetails.Weights.dtype}\n \n
Granularity{opDetails.Weights.granularity}
\n Activation\n
Dtype{opDetails.Activation.dtype}\n \n
\n }\n {selectedWorkload.framework === 'PyTorch' &&\n <>\n \n \n \n \n \n \n \n
OP name{opDetails['OP name']}
\n
\n \n
\n
\n \n \n }\n
\n }\n
\n );\n}\n","import classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Table = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n className,\n striped,\n bordered,\n borderless,\n hover,\n size,\n variant,\n responsive,\n ...props\n}, ref) => {\n const decoratedBsPrefix = useBootstrapPrefix(bsPrefix, 'table');\n const classes = classNames(className, decoratedBsPrefix, variant && `${decoratedBsPrefix}-${variant}`, size && `${decoratedBsPrefix}-${size}`, striped && `${decoratedBsPrefix}-${typeof striped === 'string' ? `striped-${striped}` : 'striped'}`, bordered && `${decoratedBsPrefix}-bordered`, borderless && `${decoratedBsPrefix}-borderless`, hover && `${decoratedBsPrefix}-hover`);\n const table = /*#__PURE__*/_jsx(\"table\", {\n ...props,\n className: classes,\n ref: ref\n });\n if (responsive) {\n let responsiveClass = `${decoratedBsPrefix}-responsive`;\n if (typeof responsive === 'string') {\n responsiveClass = `${responsiveClass}-${responsive}`;\n }\n return /*#__PURE__*/_jsx(\"div\", {\n className: responsiveClass,\n children: table\n });\n }\n return table;\n});\nexport default Table;","// -* - coding: utf - 8 -* -\n// Copyright(c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport React, { useEffect, useState } from 'react';\nimport { api } from '../../App';\nimport Table from 'react-bootstrap/Table';\nimport Spinner from 'react-bootstrap/Spinner';\n\nexport default function OpList({ selectedWorkload, setSelectedOp, selectedOp, setWarningText }) {\n const [opList, setOpList] = useState([]);\n\n useEffect(() => {\n if (selectedWorkload) {\n setOpList([]);\n api.post('api/diagnosis/op_list?token=' + localStorage.getItem('token'), { workload_id: selectedWorkload.uuid })\n .then(\n response => {\n setOpList(response.data.sort((a, b) => b.MSE - a.MSE));\n })\n .catch(error => {\n if (selectedWorkload?.status !== 'wip') {\n setWarningText(error.message + ': ' + error?.response?.data);\n }\n });\n }\n }, [selectedWorkload, selectedOp]);\n\n const tableContent =\n opList.map(opData => {\n return (\n {\n setSelectedOp(opData['OP name']);\n setTimeout(() => {\n document.getElementById('opDetails').scrollIntoView({ behavior: 'smooth' });\n }, 500)\n }}>\n {opData['OP name']}\n {opData['MSE'].toExponential(3)}\n {typeof opList[0]['Activation Min'] !== 'undefined' &&\n {opData['Activation Min'].toFixed(2)}\n }\n {typeof opList[0]['Activation Max'] !== 'undefined' &&\n {opData['Activation Max'].toFixed(2)}\n }\n \n )\n });\n\n return (\n
\n {opList.length === 0 &&\n
\n \n
\n }\n {opList.length > 0 &&\n \n \n \n \n \n {typeof opList[0]['Activation Min'] !== 'undefined' &&\n \n }\n {typeof opList[0]['Activation Max'] !== 'undefined' &&\n \n }\n \n \n \n {tableContent}\n \n
OP NameMSEActivation MinActivation Max
\n }\n
\n );\n}","// -* - coding: utf - 8 -* -\n// Copyright(c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport React, { useEffect, useState } from 'react';\nimport './Histogram.scss';\nimport Plot from 'react-plotly.js';\nimport { api } from './../../App';\nimport Spinner from 'react-bootstrap/Spinner';\n\nfunction Histogram({ selectedWorkload, selectedOp, histogramType, setWarningText }) {\n const [histogramData, setHistogramData] = useState(null);\n\n useEffect(() => {\n if (selectedOp.length && histogramType.length) {\n setHistogramData(null);\n api.post('api/diagnosis/histogram?token=' + localStorage.getItem('token'), { workload_id: selectedWorkload.uuid, op_name: selectedOp, type: histogramType })\n .then(\n response => {\n setHistogramData(response.data);\n })\n .catch(error => {\n setWarningText(error?.response?.data);\n });\n }\n }, [histogramType, selectedOp]);\n\n return (\n
\n

{histogramType.charAt(0).toUpperCase() + histogramType.slice(1)} histogram

\n {!histogramData && }\n\n {histogramData?.length === 0 &&

No histogram data for this OP.

}\n\n {histogramData?.length > 0 &&\n
\n
\n When you hover over the chart a menu will appear in the top right corner.
\n You can zoom the chart, save it as .png file or hide channels by clicking them in the legend.\n
\n\n
\n \n \n
\n
\n }\n
\n )\n};\n\nconst getHistogramData = (histogramData) => {\n const data = [];\n if (histogramData.length) {\n const colorPalette = generateColor(histogramData[0].histograms.length);\n histogramData[0].histograms.forEach((series, index) => {\n data.push(\n {\n x: series.data,\n type: 'violin',\n orientation: 'h',\n side: 'negative',\n y0: 'channel ' + index,\n name: 'channel ' + index,\n width: 100,\n opacity: 0.8,\n fillcolor: colorPalette[index],\n hoverinfo: 'none',\n line: {\n width: 1,\n color: series.data.length === 1 ? colorPalette[index] : '#fff',\n },\n points: false,\n spanmode: 'hard'\n }\n );\n });\n }\n return data;\n}\n\nconst layout = {\n height: 450,\n responsive: true,\n yaxis: {\n autorange: 'reversed',\n showgrid: true,\n },\n legend: {\n tracegroupgap: 0,\n },\n violinmode: 'overlay',\n opacity: 1,\n margin: {\n l: 150,\n r: 50,\n b: 20,\n t: 30,\n pad: 0\n }\n};\n\nconst generateColor = (num) => {\n const colorPalette = [];\n const step = 100 / num;\n for (let i = num; i > 0; --i) {\n colorPalette.push(`rgb(${20 + (step * i)}, ${100 - (step * i * 0.1)}, ${200 - (step * i * 0.1)})`);\n }\n return colorPalette;\n}\n\nHistogram.propTypes = {};\n\nHistogram.defaultProps = {};\n\nexport default Histogram;\n","import superPropBase from \"./superPropBase.js\";\nexport default function _get() {\n if (typeof Reflect !== \"undefined\" && Reflect.get) {\n _get = Reflect.get.bind();\n } else {\n _get = function _get(target, property, receiver) {\n var base = superPropBase(target, property);\n if (!base) return;\n var desc = Object.getOwnPropertyDescriptor(base, property);\n if (desc.get) {\n return desc.get.call(arguments.length < 3 ? target : receiver);\n }\n return desc.value;\n };\n }\n return _get.apply(this, arguments);\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nexport default function _superPropBase(object, property) {\n while (!Object.prototype.hasOwnProperty.call(object, property)) {\n object = getPrototypeOf(object);\n if (object === null) break;\n }\n return object;\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nimport isNativeReflectConstruct from \"./isNativeReflectConstruct.js\";\nexport default function _construct(Parent, args, Class) {\n if (isNativeReflectConstruct()) {\n _construct = Reflect.construct.bind();\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n return _construct.apply(null, arguments);\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nimport setPrototypeOf from \"./setPrototypeOf.js\";\nimport isNativeFunction from \"./isNativeFunction.js\";\nimport construct from \"./construct.js\";\nexport default function _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !isNativeFunction(Class)) return Class;\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n _cache.set(Class, Wrapper);\n }\n function Wrapper() {\n return construct(Class, arguments, getPrototypeOf(this).constructor);\n }\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return setPrototypeOf(Wrapper, Class);\n };\n return _wrapNativeSuper(Class);\n}","export default function _isNativeFunction(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}","const PACKET_TYPES = Object.create(null); // no Map = no polyfill\nPACKET_TYPES[\"open\"] = \"0\";\nPACKET_TYPES[\"close\"] = \"1\";\nPACKET_TYPES[\"ping\"] = \"2\";\nPACKET_TYPES[\"pong\"] = \"3\";\nPACKET_TYPES[\"message\"] = \"4\";\nPACKET_TYPES[\"upgrade\"] = \"5\";\nPACKET_TYPES[\"noop\"] = \"6\";\nconst PACKET_TYPES_REVERSE = Object.create(null);\nObject.keys(PACKET_TYPES).forEach(key => {\n PACKET_TYPES_REVERSE[PACKET_TYPES[key]] = key;\n});\nconst ERROR_PACKET = { type: \"error\", data: \"parser error\" };\nexport { PACKET_TYPES, PACKET_TYPES_REVERSE, ERROR_PACKET };\n","import { PACKET_TYPES } from \"./commons.js\";\nconst withNativeBlob = typeof Blob === \"function\" ||\n (typeof Blob !== \"undefined\" &&\n Object.prototype.toString.call(Blob) === \"[object BlobConstructor]\");\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\n// ArrayBuffer.isView method is not defined in IE10\nconst isView = obj => {\n return typeof ArrayBuffer.isView === \"function\"\n ? ArrayBuffer.isView(obj)\n : obj && obj.buffer instanceof ArrayBuffer;\n};\nconst encodePacket = ({ type, data }, supportsBinary, callback) => {\n if (withNativeBlob && data instanceof Blob) {\n if (supportsBinary) {\n return callback(data);\n }\n else {\n return encodeBlobAsBase64(data, callback);\n }\n }\n else if (withNativeArrayBuffer &&\n (data instanceof ArrayBuffer || isView(data))) {\n if (supportsBinary) {\n return callback(data);\n }\n else {\n return encodeBlobAsBase64(new Blob([data]), callback);\n }\n }\n // plain string\n return callback(PACKET_TYPES[type] + (data || \"\"));\n};\nconst encodeBlobAsBase64 = (data, callback) => {\n const fileReader = new FileReader();\n fileReader.onload = function () {\n const content = fileReader.result.split(\",\")[1];\n callback(\"b\" + (content || \"\"));\n };\n return fileReader.readAsDataURL(data);\n};\nfunction toArray(data) {\n if (data instanceof Uint8Array) {\n return data;\n }\n else if (data instanceof ArrayBuffer) {\n return new Uint8Array(data);\n }\n else {\n return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n }\n}\nlet TEXT_ENCODER;\nexport function encodePacketToBinary(packet, callback) {\n if (withNativeBlob && packet.data instanceof Blob) {\n return packet.data\n .arrayBuffer()\n .then(toArray)\n .then(callback);\n }\n else if (withNativeArrayBuffer &&\n (packet.data instanceof ArrayBuffer || isView(packet.data))) {\n return callback(toArray(packet.data));\n }\n encodePacket(packet, false, encoded => {\n if (!TEXT_ENCODER) {\n TEXT_ENCODER = new TextEncoder();\n }\n callback(TEXT_ENCODER.encode(encoded));\n });\n}\nexport { encodePacket };\n","// imported from https://github.com/socketio/base64-arraybuffer\nconst chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nconst lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (let i = 0; i < chars.length; i++) {\n lookup[chars.charCodeAt(i)] = i;\n}\nexport const encode = (arraybuffer) => {\n let bytes = new Uint8Array(arraybuffer), i, len = bytes.length, base64 = '';\n for (i = 0; i < len; i += 3) {\n base64 += chars[bytes[i] >> 2];\n base64 += chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];\n base64 += chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];\n base64 += chars[bytes[i + 2] & 63];\n }\n if (len % 3 === 2) {\n base64 = base64.substring(0, base64.length - 1) + '=';\n }\n else if (len % 3 === 1) {\n base64 = base64.substring(0, base64.length - 2) + '==';\n }\n return base64;\n};\nexport const decode = (base64) => {\n let bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;\n if (base64[base64.length - 1] === '=') {\n bufferLength--;\n if (base64[base64.length - 2] === '=') {\n bufferLength--;\n }\n }\n const arraybuffer = new ArrayBuffer(bufferLength), bytes = new Uint8Array(arraybuffer);\n for (i = 0; i < len; i += 4) {\n encoded1 = lookup[base64.charCodeAt(i)];\n encoded2 = lookup[base64.charCodeAt(i + 1)];\n encoded3 = lookup[base64.charCodeAt(i + 2)];\n encoded4 = lookup[base64.charCodeAt(i + 3)];\n bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n }\n return arraybuffer;\n};\n","import { encodePacket, encodePacketToBinary } from \"./encodePacket.js\";\nimport { decodePacket } from \"./decodePacket.js\";\nconst SEPARATOR = String.fromCharCode(30); // see https://en.wikipedia.org/wiki/Delimiter#ASCII_delimited_text\nconst encodePayload = (packets, callback) => {\n // some packets may be added to the array while encoding, so the initial length must be saved\n const length = packets.length;\n const encodedPackets = new Array(length);\n let count = 0;\n packets.forEach((packet, i) => {\n // force base64 encoding for binary packets\n encodePacket(packet, false, encodedPacket => {\n encodedPackets[i] = encodedPacket;\n if (++count === length) {\n callback(encodedPackets.join(SEPARATOR));\n }\n });\n });\n};\nconst decodePayload = (encodedPayload, binaryType) => {\n const encodedPackets = encodedPayload.split(SEPARATOR);\n const packets = [];\n for (let i = 0; i < encodedPackets.length; i++) {\n const decodedPacket = decodePacket(encodedPackets[i], binaryType);\n packets.push(decodedPacket);\n if (decodedPacket.type === \"error\") {\n break;\n }\n }\n return packets;\n};\nlet TEXT_DECODER;\nexport function decodePacketFromBinary(data, isBinary, binaryType) {\n if (!TEXT_DECODER) {\n // lazily created for compatibility with old browser platforms\n TEXT_DECODER = new TextDecoder();\n }\n // 48 === \"0\".charCodeAt(0) (OPEN packet type)\n // 54 === \"6\".charCodeAt(0) (NOOP packet type)\n const isPlainBinary = isBinary || data[0] < 48 || data[0] > 54;\n return decodePacket(isPlainBinary ? data : TEXT_DECODER.decode(data), binaryType);\n}\nexport const protocol = 4;\nexport { encodePacket, encodePacketToBinary, encodePayload, decodePacket, decodePayload };\n","import { ERROR_PACKET, PACKET_TYPES_REVERSE } from \"./commons.js\";\nimport { decode } from \"./contrib/base64-arraybuffer.js\";\nconst withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\nexport const decodePacket = (encodedPacket, binaryType) => {\n if (typeof encodedPacket !== \"string\") {\n return {\n type: \"message\",\n data: mapBinary(encodedPacket, binaryType)\n };\n }\n const type = encodedPacket.charAt(0);\n if (type === \"b\") {\n return {\n type: \"message\",\n data: decodeBase64Packet(encodedPacket.substring(1), binaryType)\n };\n }\n const packetType = PACKET_TYPES_REVERSE[type];\n if (!packetType) {\n return ERROR_PACKET;\n }\n return encodedPacket.length > 1\n ? {\n type: PACKET_TYPES_REVERSE[type],\n data: encodedPacket.substring(1)\n }\n : {\n type: PACKET_TYPES_REVERSE[type]\n };\n};\nconst decodeBase64Packet = (data, binaryType) => {\n if (withNativeArrayBuffer) {\n const decoded = decode(data);\n return mapBinary(decoded, binaryType);\n }\n else {\n return { base64: true, data }; // fallback for old browsers\n }\n};\nconst mapBinary = (data, binaryType) => {\n switch (binaryType) {\n case \"blob\":\n if (data instanceof Blob) {\n // from WebSocket + binaryType \"blob\"\n return data;\n }\n else {\n // from HTTP long-polling or WebTransport\n return new Blob([data]);\n }\n case \"arraybuffer\":\n default:\n if (data instanceof ArrayBuffer) {\n // from HTTP long-polling (base64) or WebSocket + binaryType \"arraybuffer\"\n return data;\n }\n else {\n // from WebTransport (Uint8Array)\n return data.buffer;\n }\n }\n};\n","/**\n * Initialize a new `Emitter`.\n *\n * @api public\n */\n\nexport function Emitter(obj) {\n if (obj) return mixin(obj);\n}\n\n/**\n * Mixin the emitter properties.\n *\n * @param {Object} obj\n * @return {Object}\n * @api private\n */\n\nfunction mixin(obj) {\n for (var key in Emitter.prototype) {\n obj[key] = Emitter.prototype[key];\n }\n return obj;\n}\n\n/**\n * Listen on the given `event` with `fn`.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.on =\nEmitter.prototype.addEventListener = function(event, fn){\n this._callbacks = this._callbacks || {};\n (this._callbacks['$' + event] = this._callbacks['$' + event] || [])\n .push(fn);\n return this;\n};\n\n/**\n * Adds an `event` listener that will be invoked a single\n * time then automatically removed.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.once = function(event, fn){\n function on() {\n this.off(event, on);\n fn.apply(this, arguments);\n }\n\n on.fn = fn;\n this.on(event, on);\n return this;\n};\n\n/**\n * Remove the given callback for `event` or all\n * registered callbacks.\n *\n * @param {String} event\n * @param {Function} fn\n * @return {Emitter}\n * @api public\n */\n\nEmitter.prototype.off =\nEmitter.prototype.removeListener =\nEmitter.prototype.removeAllListeners =\nEmitter.prototype.removeEventListener = function(event, fn){\n this._callbacks = this._callbacks || {};\n\n // all\n if (0 == arguments.length) {\n this._callbacks = {};\n return this;\n }\n\n // specific event\n var callbacks = this._callbacks['$' + event];\n if (!callbacks) return this;\n\n // remove all handlers\n if (1 == arguments.length) {\n delete this._callbacks['$' + event];\n return this;\n }\n\n // remove specific handler\n var cb;\n for (var i = 0; i < callbacks.length; i++) {\n cb = callbacks[i];\n if (cb === fn || cb.fn === fn) {\n callbacks.splice(i, 1);\n break;\n }\n }\n\n // Remove event specific arrays for event types that no\n // one is subscribed for to avoid memory leak.\n if (callbacks.length === 0) {\n delete this._callbacks['$' + event];\n }\n\n return this;\n};\n\n/**\n * Emit `event` with the given args.\n *\n * @param {String} event\n * @param {Mixed} ...\n * @return {Emitter}\n */\n\nEmitter.prototype.emit = function(event){\n this._callbacks = this._callbacks || {};\n\n var args = new Array(arguments.length - 1)\n , callbacks = this._callbacks['$' + event];\n\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n\n if (callbacks) {\n callbacks = callbacks.slice(0);\n for (var i = 0, len = callbacks.length; i < len; ++i) {\n callbacks[i].apply(this, args);\n }\n }\n\n return this;\n};\n\n// alias used for reserved events (protected method)\nEmitter.prototype.emitReserved = Emitter.prototype.emit;\n\n/**\n * Return array of callbacks for `event`.\n *\n * @param {String} event\n * @return {Array}\n * @api public\n */\n\nEmitter.prototype.listeners = function(event){\n this._callbacks = this._callbacks || {};\n return this._callbacks['$' + event] || [];\n};\n\n/**\n * Check if this emitter has `event` handlers.\n *\n * @param {String} event\n * @return {Boolean}\n * @api public\n */\n\nEmitter.prototype.hasListeners = function(event){\n return !! this.listeners(event).length;\n};\n","export const globalThisShim = (() => {\n if (typeof self !== \"undefined\") {\n return self;\n }\n else if (typeof window !== \"undefined\") {\n return window;\n }\n else {\n return Function(\"return this\")();\n }\n})();\n","import { globalThisShim as globalThis } from \"./globalThis.js\";\nexport function pick(obj, ...attr) {\n return attr.reduce((acc, k) => {\n if (obj.hasOwnProperty(k)) {\n acc[k] = obj[k];\n }\n return acc;\n }, {});\n}\n// Keep a reference to the real timeout functions so they can be used when overridden\nconst NATIVE_SET_TIMEOUT = globalThis.setTimeout;\nconst NATIVE_CLEAR_TIMEOUT = globalThis.clearTimeout;\nexport function installTimerFunctions(obj, opts) {\n if (opts.useNativeTimers) {\n obj.setTimeoutFn = NATIVE_SET_TIMEOUT.bind(globalThis);\n obj.clearTimeoutFn = NATIVE_CLEAR_TIMEOUT.bind(globalThis);\n }\n else {\n obj.setTimeoutFn = globalThis.setTimeout.bind(globalThis);\n obj.clearTimeoutFn = globalThis.clearTimeout.bind(globalThis);\n }\n}\n// base64 encoded buffers are about 33% bigger (https://en.wikipedia.org/wiki/Base64)\nconst BASE64_OVERHEAD = 1.33;\n// we could also have used `new Blob([obj]).size`, but it isn't supported in IE9\nexport function byteLength(obj) {\n if (typeof obj === \"string\") {\n return utf8Length(obj);\n }\n // arraybuffer or blob\n return Math.ceil((obj.byteLength || obj.size) * BASE64_OVERHEAD);\n}\nfunction utf8Length(str) {\n let c = 0, length = 0;\n for (let i = 0, l = str.length; i < l; i++) {\n c = str.charCodeAt(i);\n if (c < 0x80) {\n length += 1;\n }\n else if (c < 0x800) {\n length += 2;\n }\n else if (c < 0xd800 || c >= 0xe000) {\n length += 3;\n }\n else {\n i++;\n length += 4;\n }\n }\n return length;\n}\n","import { decodePacket } from \"engine.io-parser\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { installTimerFunctions } from \"./util.js\";\nimport { encode } from \"./contrib/parseqs.js\";\nclass TransportError extends Error {\n constructor(reason, description, context) {\n super(reason);\n this.description = description;\n this.context = context;\n this.type = \"TransportError\";\n }\n}\nexport class Transport extends Emitter {\n /**\n * Transport abstract constructor.\n *\n * @param {Object} opts - options\n * @protected\n */\n constructor(opts) {\n super();\n this.writable = false;\n installTimerFunctions(this, opts);\n this.opts = opts;\n this.query = opts.query;\n this.socket = opts.socket;\n }\n /**\n * Emits an error.\n *\n * @param {String} reason\n * @param description\n * @param context - the error context\n * @return {Transport} for chaining\n * @protected\n */\n onError(reason, description, context) {\n super.emitReserved(\"error\", new TransportError(reason, description, context));\n return this;\n }\n /**\n * Opens the transport.\n */\n open() {\n this.readyState = \"opening\";\n this.doOpen();\n return this;\n }\n /**\n * Closes the transport.\n */\n close() {\n if (this.readyState === \"opening\" || this.readyState === \"open\") {\n this.doClose();\n this.onClose();\n }\n return this;\n }\n /**\n * Sends multiple packets.\n *\n * @param {Array} packets\n */\n send(packets) {\n if (this.readyState === \"open\") {\n this.write(packets);\n }\n else {\n // this might happen if the transport was silently closed in the beforeunload event handler\n }\n }\n /**\n * Called upon open\n *\n * @protected\n */\n onOpen() {\n this.readyState = \"open\";\n this.writable = true;\n super.emitReserved(\"open\");\n }\n /**\n * Called with data.\n *\n * @param {String} data\n * @protected\n */\n onData(data) {\n const packet = decodePacket(data, this.socket.binaryType);\n this.onPacket(packet);\n }\n /**\n * Called with a decoded packet.\n *\n * @protected\n */\n onPacket(packet) {\n super.emitReserved(\"packet\", packet);\n }\n /**\n * Called upon close.\n *\n * @protected\n */\n onClose(details) {\n this.readyState = \"closed\";\n super.emitReserved(\"close\", details);\n }\n /**\n * Pauses the transport, in order not to lose packets during an upgrade.\n *\n * @param onPause\n */\n pause(onPause) { }\n createUri(schema, query = {}) {\n return (schema +\n \"://\" +\n this._hostname() +\n this._port() +\n this.opts.path +\n this._query(query));\n }\n _hostname() {\n const hostname = this.opts.hostname;\n return hostname.indexOf(\":\") === -1 ? hostname : \"[\" + hostname + \"]\";\n }\n _port() {\n if (this.opts.port &&\n ((this.opts.secure && Number(this.opts.port !== 443)) ||\n (!this.opts.secure && Number(this.opts.port) !== 80))) {\n return \":\" + this.opts.port;\n }\n else {\n return \"\";\n }\n }\n _query(query) {\n const encodedQuery = encode(query);\n return encodedQuery.length ? \"?\" + encodedQuery : \"\";\n }\n}\n","// imported from https://github.com/unshiftio/yeast\n'use strict';\nconst alphabet = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_'.split(''), length = 64, map = {};\nlet seed = 0, i = 0, prev;\n/**\n * Return a string representing the specified number.\n *\n * @param {Number} num The number to convert.\n * @returns {String} The string representation of the number.\n * @api public\n */\nexport function encode(num) {\n let encoded = '';\n do {\n encoded = alphabet[num % length] + encoded;\n num = Math.floor(num / length);\n } while (num > 0);\n return encoded;\n}\n/**\n * Return the integer value specified by the given string.\n *\n * @param {String} str The string to convert.\n * @returns {Number} The integer value represented by the string.\n * @api public\n */\nexport function decode(str) {\n let decoded = 0;\n for (i = 0; i < str.length; i++) {\n decoded = decoded * length + map[str.charAt(i)];\n }\n return decoded;\n}\n/**\n * Yeast: A tiny growing id generator.\n *\n * @returns {String} A unique id.\n * @api public\n */\nexport function yeast() {\n const now = encode(+new Date());\n if (now !== prev)\n return seed = 0, prev = now;\n return now + '.' + encode(seed++);\n}\n//\n// Map each character to its index.\n//\nfor (; i < length; i++)\n map[alphabet[i]] = i;\n","// imported from https://github.com/galkn/querystring\n/**\n * Compiles a querystring\n * Returns string representation of the object\n *\n * @param {Object}\n * @api private\n */\nexport function encode(obj) {\n let str = '';\n for (let i in obj) {\n if (obj.hasOwnProperty(i)) {\n if (str.length)\n str += '&';\n str += encodeURIComponent(i) + '=' + encodeURIComponent(obj[i]);\n }\n }\n return str;\n}\n/**\n * Parses a simple querystring into an object\n *\n * @param {String} qs\n * @api private\n */\nexport function decode(qs) {\n let qry = {};\n let pairs = qs.split('&');\n for (let i = 0, l = pairs.length; i < l; i++) {\n let pair = pairs[i].split('=');\n qry[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]);\n }\n return qry;\n}\n","// imported from https://github.com/component/has-cors\nlet value = false;\ntry {\n value = typeof XMLHttpRequest !== 'undefined' &&\n 'withCredentials' in new XMLHttpRequest();\n}\ncatch (err) {\n // if XMLHttp support is disabled in IE then it will throw\n // when trying to create\n}\nexport const hasCORS = value;\n","// browser shim for xmlhttprequest module\nimport { hasCORS } from \"../contrib/has-cors.js\";\nimport { globalThisShim as globalThis } from \"../globalThis.js\";\nexport function XHR(opts) {\n const xdomain = opts.xdomain;\n // XMLHttpRequest can be disabled on IE\n try {\n if (\"undefined\" !== typeof XMLHttpRequest && (!xdomain || hasCORS)) {\n return new XMLHttpRequest();\n }\n }\n catch (e) { }\n if (!xdomain) {\n try {\n return new globalThis[[\"Active\"].concat(\"Object\").join(\"X\")](\"Microsoft.XMLHTTP\");\n }\n catch (e) { }\n }\n}\nexport function createCookieJar() { }\n","import { Transport } from \"../transport.js\";\nimport { yeast } from \"../contrib/yeast.js\";\nimport { encodePayload, decodePayload } from \"engine.io-parser\";\nimport { createCookieJar, XHR as XMLHttpRequest, } from \"./xmlhttprequest.js\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { installTimerFunctions, pick } from \"../util.js\";\nimport { globalThisShim as globalThis } from \"../globalThis.js\";\nfunction empty() { }\nconst hasXHR2 = (function () {\n const xhr = new XMLHttpRequest({\n xdomain: false,\n });\n return null != xhr.responseType;\n})();\nexport class Polling extends Transport {\n /**\n * XHR Polling constructor.\n *\n * @param {Object} opts\n * @package\n */\n constructor(opts) {\n super(opts);\n this.polling = false;\n if (typeof location !== \"undefined\") {\n const isSSL = \"https:\" === location.protocol;\n let port = location.port;\n // some user agents have empty `location.port`\n if (!port) {\n port = isSSL ? \"443\" : \"80\";\n }\n this.xd =\n (typeof location !== \"undefined\" &&\n opts.hostname !== location.hostname) ||\n port !== opts.port;\n }\n /**\n * XHR supports binary\n */\n const forceBase64 = opts && opts.forceBase64;\n this.supportsBinary = hasXHR2 && !forceBase64;\n if (this.opts.withCredentials) {\n this.cookieJar = createCookieJar();\n }\n }\n get name() {\n return \"polling\";\n }\n /**\n * Opens the socket (triggers polling). We write a PING message to determine\n * when the transport is open.\n *\n * @protected\n */\n doOpen() {\n this.poll();\n }\n /**\n * Pauses polling.\n *\n * @param {Function} onPause - callback upon buffers are flushed and transport is paused\n * @package\n */\n pause(onPause) {\n this.readyState = \"pausing\";\n const pause = () => {\n this.readyState = \"paused\";\n onPause();\n };\n if (this.polling || !this.writable) {\n let total = 0;\n if (this.polling) {\n total++;\n this.once(\"pollComplete\", function () {\n --total || pause();\n });\n }\n if (!this.writable) {\n total++;\n this.once(\"drain\", function () {\n --total || pause();\n });\n }\n }\n else {\n pause();\n }\n }\n /**\n * Starts polling cycle.\n *\n * @private\n */\n poll() {\n this.polling = true;\n this.doPoll();\n this.emitReserved(\"poll\");\n }\n /**\n * Overloads onData to detect payloads.\n *\n * @protected\n */\n onData(data) {\n const callback = (packet) => {\n // if its the first message we consider the transport open\n if (\"opening\" === this.readyState && packet.type === \"open\") {\n this.onOpen();\n }\n // if its a close packet, we close the ongoing requests\n if (\"close\" === packet.type) {\n this.onClose({ description: \"transport closed by the server\" });\n return false;\n }\n // otherwise bypass onData and handle the message\n this.onPacket(packet);\n };\n // decode payload\n decodePayload(data, this.socket.binaryType).forEach(callback);\n // if an event did not trigger closing\n if (\"closed\" !== this.readyState) {\n // if we got data we're not polling\n this.polling = false;\n this.emitReserved(\"pollComplete\");\n if (\"open\" === this.readyState) {\n this.poll();\n }\n else {\n }\n }\n }\n /**\n * For polling, send a close packet.\n *\n * @protected\n */\n doClose() {\n const close = () => {\n this.write([{ type: \"close\" }]);\n };\n if (\"open\" === this.readyState) {\n close();\n }\n else {\n // in case we're trying to close while\n // handshaking is in progress (GH-164)\n this.once(\"open\", close);\n }\n }\n /**\n * Writes a packets payload.\n *\n * @param {Array} packets - data packets\n * @protected\n */\n write(packets) {\n this.writable = false;\n encodePayload(packets, (data) => {\n this.doWrite(data, () => {\n this.writable = true;\n this.emitReserved(\"drain\");\n });\n });\n }\n /**\n * Generates uri for connection.\n *\n * @private\n */\n uri() {\n const schema = this.opts.secure ? \"https\" : \"http\";\n const query = this.query || {};\n // cache busting is forced\n if (false !== this.opts.timestampRequests) {\n query[this.opts.timestampParam] = yeast();\n }\n if (!this.supportsBinary && !query.sid) {\n query.b64 = 1;\n }\n return this.createUri(schema, query);\n }\n /**\n * Creates a request.\n *\n * @param {String} method\n * @private\n */\n request(opts = {}) {\n Object.assign(opts, { xd: this.xd, cookieJar: this.cookieJar }, this.opts);\n return new Request(this.uri(), opts);\n }\n /**\n * Sends data.\n *\n * @param {String} data to send.\n * @param {Function} called upon flush.\n * @private\n */\n doWrite(data, fn) {\n const req = this.request({\n method: \"POST\",\n data: data,\n });\n req.on(\"success\", fn);\n req.on(\"error\", (xhrStatus, context) => {\n this.onError(\"xhr post error\", xhrStatus, context);\n });\n }\n /**\n * Starts a poll cycle.\n *\n * @private\n */\n doPoll() {\n const req = this.request();\n req.on(\"data\", this.onData.bind(this));\n req.on(\"error\", (xhrStatus, context) => {\n this.onError(\"xhr poll error\", xhrStatus, context);\n });\n this.pollXhr = req;\n }\n}\nexport class Request extends Emitter {\n /**\n * Request constructor\n *\n * @param {Object} options\n * @package\n */\n constructor(uri, opts) {\n super();\n installTimerFunctions(this, opts);\n this.opts = opts;\n this.method = opts.method || \"GET\";\n this.uri = uri;\n this.data = undefined !== opts.data ? opts.data : null;\n this.create();\n }\n /**\n * Creates the XHR object and sends the request.\n *\n * @private\n */\n create() {\n var _a;\n const opts = pick(this.opts, \"agent\", \"pfx\", \"key\", \"passphrase\", \"cert\", \"ca\", \"ciphers\", \"rejectUnauthorized\", \"autoUnref\");\n opts.xdomain = !!this.opts.xd;\n const xhr = (this.xhr = new XMLHttpRequest(opts));\n try {\n xhr.open(this.method, this.uri, true);\n try {\n if (this.opts.extraHeaders) {\n xhr.setDisableHeaderCheck && xhr.setDisableHeaderCheck(true);\n for (let i in this.opts.extraHeaders) {\n if (this.opts.extraHeaders.hasOwnProperty(i)) {\n xhr.setRequestHeader(i, this.opts.extraHeaders[i]);\n }\n }\n }\n }\n catch (e) { }\n if (\"POST\" === this.method) {\n try {\n xhr.setRequestHeader(\"Content-type\", \"text/plain;charset=UTF-8\");\n }\n catch (e) { }\n }\n try {\n xhr.setRequestHeader(\"Accept\", \"*/*\");\n }\n catch (e) { }\n (_a = this.opts.cookieJar) === null || _a === void 0 ? void 0 : _a.addCookies(xhr);\n // ie6 check\n if (\"withCredentials\" in xhr) {\n xhr.withCredentials = this.opts.withCredentials;\n }\n if (this.opts.requestTimeout) {\n xhr.timeout = this.opts.requestTimeout;\n }\n xhr.onreadystatechange = () => {\n var _a;\n if (xhr.readyState === 3) {\n (_a = this.opts.cookieJar) === null || _a === void 0 ? void 0 : _a.parseCookies(xhr);\n }\n if (4 !== xhr.readyState)\n return;\n if (200 === xhr.status || 1223 === xhr.status) {\n this.onLoad();\n }\n else {\n // make sure the `error` event handler that's user-set\n // does not throw in the same tick and gets caught here\n this.setTimeoutFn(() => {\n this.onError(typeof xhr.status === \"number\" ? xhr.status : 0);\n }, 0);\n }\n };\n xhr.send(this.data);\n }\n catch (e) {\n // Need to defer since .create() is called directly from the constructor\n // and thus the 'error' event can only be only bound *after* this exception\n // occurs. Therefore, also, we cannot throw here at all.\n this.setTimeoutFn(() => {\n this.onError(e);\n }, 0);\n return;\n }\n if (typeof document !== \"undefined\") {\n this.index = Request.requestsCount++;\n Request.requests[this.index] = this;\n }\n }\n /**\n * Called upon error.\n *\n * @private\n */\n onError(err) {\n this.emitReserved(\"error\", err, this.xhr);\n this.cleanup(true);\n }\n /**\n * Cleans up house.\n *\n * @private\n */\n cleanup(fromError) {\n if (\"undefined\" === typeof this.xhr || null === this.xhr) {\n return;\n }\n this.xhr.onreadystatechange = empty;\n if (fromError) {\n try {\n this.xhr.abort();\n }\n catch (e) { }\n }\n if (typeof document !== \"undefined\") {\n delete Request.requests[this.index];\n }\n this.xhr = null;\n }\n /**\n * Called upon load.\n *\n * @private\n */\n onLoad() {\n const data = this.xhr.responseText;\n if (data !== null) {\n this.emitReserved(\"data\", data);\n this.emitReserved(\"success\");\n this.cleanup();\n }\n }\n /**\n * Aborts the request.\n *\n * @package\n */\n abort() {\n this.cleanup();\n }\n}\nRequest.requestsCount = 0;\nRequest.requests = {};\n/**\n * Aborts pending requests when unloading the window. This is needed to prevent\n * memory leaks (e.g. when using IE) and to ensure that no spurious error is\n * emitted.\n */\nif (typeof document !== \"undefined\") {\n // @ts-ignore\n if (typeof attachEvent === \"function\") {\n // @ts-ignore\n attachEvent(\"onunload\", unloadHandler);\n }\n else if (typeof addEventListener === \"function\") {\n const terminationEvent = \"onpagehide\" in globalThis ? \"pagehide\" : \"unload\";\n addEventListener(terminationEvent, unloadHandler, false);\n }\n}\nfunction unloadHandler() {\n for (let i in Request.requests) {\n if (Request.requests.hasOwnProperty(i)) {\n Request.requests[i].abort();\n }\n }\n}\n","import { globalThisShim as globalThis } from \"../globalThis.js\";\nexport const nextTick = (() => {\n const isPromiseAvailable = typeof Promise === \"function\" && typeof Promise.resolve === \"function\";\n if (isPromiseAvailable) {\n return (cb) => Promise.resolve().then(cb);\n }\n else {\n return (cb, setTimeoutFn) => setTimeoutFn(cb, 0);\n }\n})();\nexport const WebSocket = globalThis.WebSocket || globalThis.MozWebSocket;\nexport const usingBrowserWebSocket = true;\nexport const defaultBinaryType = \"arraybuffer\";\n","import { Transport } from \"../transport.js\";\nimport { yeast } from \"../contrib/yeast.js\";\nimport { pick } from \"../util.js\";\nimport { defaultBinaryType, nextTick, usingBrowserWebSocket, WebSocket, } from \"./websocket-constructor.js\";\nimport { encodePacket } from \"engine.io-parser\";\n// detect ReactNative environment\nconst isReactNative = typeof navigator !== \"undefined\" &&\n typeof navigator.product === \"string\" &&\n navigator.product.toLowerCase() === \"reactnative\";\nexport class WS extends Transport {\n /**\n * WebSocket transport constructor.\n *\n * @param {Object} opts - connection options\n * @protected\n */\n constructor(opts) {\n super(opts);\n this.supportsBinary = !opts.forceBase64;\n }\n get name() {\n return \"websocket\";\n }\n doOpen() {\n if (!this.check()) {\n // let probe timeout\n return;\n }\n const uri = this.uri();\n const protocols = this.opts.protocols;\n // React Native only supports the 'headers' option, and will print a warning if anything else is passed\n const opts = isReactNative\n ? {}\n : pick(this.opts, \"agent\", \"perMessageDeflate\", \"pfx\", \"key\", \"passphrase\", \"cert\", \"ca\", \"ciphers\", \"rejectUnauthorized\", \"localAddress\", \"protocolVersion\", \"origin\", \"maxPayload\", \"family\", \"checkServerIdentity\");\n if (this.opts.extraHeaders) {\n opts.headers = this.opts.extraHeaders;\n }\n try {\n this.ws =\n usingBrowserWebSocket && !isReactNative\n ? protocols\n ? new WebSocket(uri, protocols)\n : new WebSocket(uri)\n : new WebSocket(uri, protocols, opts);\n }\n catch (err) {\n return this.emitReserved(\"error\", err);\n }\n this.ws.binaryType = this.socket.binaryType || defaultBinaryType;\n this.addEventListeners();\n }\n /**\n * Adds event listeners to the socket\n *\n * @private\n */\n addEventListeners() {\n this.ws.onopen = () => {\n if (this.opts.autoUnref) {\n this.ws._socket.unref();\n }\n this.onOpen();\n };\n this.ws.onclose = (closeEvent) => this.onClose({\n description: \"websocket connection closed\",\n context: closeEvent,\n });\n this.ws.onmessage = (ev) => this.onData(ev.data);\n this.ws.onerror = (e) => this.onError(\"websocket error\", e);\n }\n write(packets) {\n this.writable = false;\n // encodePacket efficient as it uses WS framing\n // no need for encodePayload\n for (let i = 0; i < packets.length; i++) {\n const packet = packets[i];\n const lastPacket = i === packets.length - 1;\n encodePacket(packet, this.supportsBinary, (data) => {\n // always create a new object (GH-437)\n const opts = {};\n if (!usingBrowserWebSocket) {\n if (packet.options) {\n opts.compress = packet.options.compress;\n }\n if (this.opts.perMessageDeflate) {\n const len = \n // @ts-ignore\n \"string\" === typeof data ? Buffer.byteLength(data) : data.length;\n if (len < this.opts.perMessageDeflate.threshold) {\n opts.compress = false;\n }\n }\n }\n // Sometimes the websocket has already been closed but the browser didn't\n // have a chance of informing us about it yet, in that case send will\n // throw an error\n try {\n if (usingBrowserWebSocket) {\n // TypeError is thrown when passing the second argument on Safari\n this.ws.send(data);\n }\n else {\n this.ws.send(data, opts);\n }\n }\n catch (e) {\n }\n if (lastPacket) {\n // fake drain\n // defer to next tick to allow Socket to clear writeBuffer\n nextTick(() => {\n this.writable = true;\n this.emitReserved(\"drain\");\n }, this.setTimeoutFn);\n }\n });\n }\n }\n doClose() {\n if (typeof this.ws !== \"undefined\") {\n this.ws.close();\n this.ws = null;\n }\n }\n /**\n * Generates uri for connection.\n *\n * @private\n */\n uri() {\n const schema = this.opts.secure ? \"wss\" : \"ws\";\n const query = this.query || {};\n // append timestamp to URI\n if (this.opts.timestampRequests) {\n query[this.opts.timestampParam] = yeast();\n }\n // communicate binary support capabilities\n if (!this.supportsBinary) {\n query.b64 = 1;\n }\n return this.createUri(schema, query);\n }\n /**\n * Feature detection for WebSocket.\n *\n * @return {Boolean} whether this transport is available.\n * @private\n */\n check() {\n return !!WebSocket;\n }\n}\n","import { Transport } from \"../transport.js\";\nimport { nextTick } from \"./websocket-constructor.js\";\nimport { encodePacketToBinary, decodePacketFromBinary, } from \"engine.io-parser\";\nfunction shouldIncludeBinaryHeader(packet, encoded) {\n // 48 === \"0\".charCodeAt(0) (OPEN packet type)\n // 54 === \"6\".charCodeAt(0) (NOOP packet type)\n return (packet.type === \"message\" &&\n typeof packet.data !== \"string\" &&\n encoded[0] >= 48 &&\n encoded[0] <= 54);\n}\nexport class WT extends Transport {\n get name() {\n return \"webtransport\";\n }\n doOpen() {\n // @ts-ignore\n if (typeof WebTransport !== \"function\") {\n return;\n }\n // @ts-ignore\n this.transport = new WebTransport(this.createUri(\"https\"), this.opts.transportOptions[this.name]);\n this.transport.closed\n .then(() => {\n this.onClose();\n })\n .catch((err) => {\n this.onError(\"webtransport error\", err);\n });\n // note: we could have used async/await, but that would require some additional polyfills\n this.transport.ready.then(() => {\n this.transport.createBidirectionalStream().then((stream) => {\n const reader = stream.readable.getReader();\n this.writer = stream.writable.getWriter();\n let binaryFlag;\n const read = () => {\n reader\n .read()\n .then(({ done, value }) => {\n if (done) {\n return;\n }\n if (!binaryFlag && value.byteLength === 1 && value[0] === 54) {\n binaryFlag = true;\n }\n else {\n // TODO expose binarytype\n this.onPacket(decodePacketFromBinary(value, binaryFlag, \"arraybuffer\"));\n binaryFlag = false;\n }\n read();\n })\n .catch((err) => {\n });\n };\n read();\n const handshake = this.query.sid ? `0{\"sid\":\"${this.query.sid}\"}` : \"0\";\n this.writer\n .write(new TextEncoder().encode(handshake))\n .then(() => this.onOpen());\n });\n });\n }\n write(packets) {\n this.writable = false;\n for (let i = 0; i < packets.length; i++) {\n const packet = packets[i];\n const lastPacket = i === packets.length - 1;\n encodePacketToBinary(packet, (data) => {\n if (shouldIncludeBinaryHeader(packet, data)) {\n this.writer.write(Uint8Array.of(54));\n }\n this.writer.write(data).then(() => {\n if (lastPacket) {\n nextTick(() => {\n this.writable = true;\n this.emitReserved(\"drain\");\n }, this.setTimeoutFn);\n }\n });\n });\n }\n }\n doClose() {\n var _a;\n (_a = this.transport) === null || _a === void 0 ? void 0 : _a.close();\n }\n}\n","import { Polling } from \"./polling.js\";\nimport { WS } from \"./websocket.js\";\nimport { WT } from \"./webtransport.js\";\nexport const transports = {\n websocket: WS,\n webtransport: WT,\n polling: Polling,\n};\n","// imported from https://github.com/galkn/parseuri\n/**\n * Parses a URI\n *\n * Note: we could also have used the built-in URL object, but it isn't supported on all platforms.\n *\n * See:\n * - https://developer.mozilla.org/en-US/docs/Web/API/URL\n * - https://caniuse.com/url\n * - https://www.rfc-editor.org/rfc/rfc3986#appendix-B\n *\n * History of the parse() method:\n * - first commit: https://github.com/socketio/socket.io-client/commit/4ee1d5d94b3906a9c052b459f1a818b15f38f91c\n * - export into its own module: https://github.com/socketio/engine.io-client/commit/de2c561e4564efeb78f1bdb1ba39ef81b2822cb3\n * - reimport: https://github.com/socketio/engine.io-client/commit/df32277c3f6d622eec5ed09f493cae3f3391d242\n *\n * @author Steven Levithan (MIT license)\n * @api private\n */\nconst re = /^(?:(?![^:@\\/?#]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@\\/?#]*)(?::([^:@\\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;\nconst parts = [\n 'source', 'protocol', 'authority', 'userInfo', 'user', 'password', 'host', 'port', 'relative', 'path', 'directory', 'file', 'query', 'anchor'\n];\nexport function parse(str) {\n const src = str, b = str.indexOf('['), e = str.indexOf(']');\n if (b != -1 && e != -1) {\n str = str.substring(0, b) + str.substring(b, e).replace(/:/g, ';') + str.substring(e, str.length);\n }\n let m = re.exec(str || ''), uri = {}, i = 14;\n while (i--) {\n uri[parts[i]] = m[i] || '';\n }\n if (b != -1 && e != -1) {\n uri.source = src;\n uri.host = uri.host.substring(1, uri.host.length - 1).replace(/;/g, ':');\n uri.authority = uri.authority.replace('[', '').replace(']', '').replace(/;/g, ':');\n uri.ipv6uri = true;\n }\n uri.pathNames = pathNames(uri, uri['path']);\n uri.queryKey = queryKey(uri, uri['query']);\n return uri;\n}\nfunction pathNames(obj, path) {\n const regx = /\\/{2,9}/g, names = path.replace(regx, \"/\").split(\"/\");\n if (path.slice(0, 1) == '/' || path.length === 0) {\n names.splice(0, 1);\n }\n if (path.slice(-1) == '/') {\n names.splice(names.length - 1, 1);\n }\n return names;\n}\nfunction queryKey(uri, query) {\n const data = {};\n query.replace(/(?:^|&)([^&=]*)=?([^&]*)/g, function ($0, $1, $2) {\n if ($1) {\n data[$1] = $2;\n }\n });\n return data;\n}\n","import { transports } from \"./transports/index.js\";\nimport { installTimerFunctions, byteLength } from \"./util.js\";\nimport { decode } from \"./contrib/parseqs.js\";\nimport { parse } from \"./contrib/parseuri.js\";\nimport { Emitter } from \"@socket.io/component-emitter\";\nimport { protocol } from \"engine.io-parser\";\nexport class Socket extends Emitter {\n /**\n * Socket constructor.\n *\n * @param {String|Object} uri - uri or options\n * @param {Object} opts - options\n */\n constructor(uri, opts = {}) {\n super();\n this.writeBuffer = [];\n if (uri && \"object\" === typeof uri) {\n opts = uri;\n uri = null;\n }\n if (uri) {\n uri = parse(uri);\n opts.hostname = uri.host;\n opts.secure = uri.protocol === \"https\" || uri.protocol === \"wss\";\n opts.port = uri.port;\n if (uri.query)\n opts.query = uri.query;\n }\n else if (opts.host) {\n opts.hostname = parse(opts.host).host;\n }\n installTimerFunctions(this, opts);\n this.secure =\n null != opts.secure\n ? opts.secure\n : typeof location !== \"undefined\" && \"https:\" === location.protocol;\n if (opts.hostname && !opts.port) {\n // if no port is specified manually, use the protocol default\n opts.port = this.secure ? \"443\" : \"80\";\n }\n this.hostname =\n opts.hostname ||\n (typeof location !== \"undefined\" ? location.hostname : \"localhost\");\n this.port =\n opts.port ||\n (typeof location !== \"undefined\" && location.port\n ? location.port\n : this.secure\n ? \"443\"\n : \"80\");\n this.transports = opts.transports || [\n \"polling\",\n \"websocket\",\n \"webtransport\",\n ];\n this.writeBuffer = [];\n this.prevBufferLen = 0;\n this.opts = Object.assign({\n path: \"/engine.io\",\n agent: false,\n withCredentials: false,\n upgrade: true,\n timestampParam: \"t\",\n rememberUpgrade: false,\n addTrailingSlash: true,\n rejectUnauthorized: true,\n perMessageDeflate: {\n threshold: 1024,\n },\n transportOptions: {},\n closeOnBeforeunload: false,\n }, opts);\n this.opts.path =\n this.opts.path.replace(/\\/$/, \"\") +\n (this.opts.addTrailingSlash ? \"/\" : \"\");\n if (typeof this.opts.query === \"string\") {\n this.opts.query = decode(this.opts.query);\n }\n // set on handshake\n this.id = null;\n this.upgrades = null;\n this.pingInterval = null;\n this.pingTimeout = null;\n // set on heartbeat\n this.pingTimeoutTimer = null;\n if (typeof addEventListener === \"function\") {\n if (this.opts.closeOnBeforeunload) {\n // Firefox closes the connection when the \"beforeunload\" event is emitted but not Chrome. This event listener\n // ensures every browser behaves the same (no \"disconnect\" event at the Socket.IO level when the page is\n // closed/reloaded)\n this.beforeunloadEventListener = () => {\n if (this.transport) {\n // silently close the transport\n this.transport.removeAllListeners();\n this.transport.close();\n }\n };\n addEventListener(\"beforeunload\", this.beforeunloadEventListener, false);\n }\n if (this.hostname !== \"localhost\") {\n this.offlineEventListener = () => {\n this.onClose(\"transport close\", {\n description: \"network connection lost\",\n });\n };\n addEventListener(\"offline\", this.offlineEventListener, false);\n }\n }\n this.open();\n }\n /**\n * Creates transport of the given type.\n *\n * @param {String} name - transport name\n * @return {Transport}\n * @private\n */\n createTransport(name) {\n const query = Object.assign({}, this.opts.query);\n // append engine.io protocol identifier\n query.EIO = protocol;\n // transport name\n query.transport = name;\n // session id if we already have one\n if (this.id)\n query.sid = this.id;\n const opts = Object.assign({}, this.opts, {\n query,\n socket: this,\n hostname: this.hostname,\n secure: this.secure,\n port: this.port,\n }, this.opts.transportOptions[name]);\n return new transports[name](opts);\n }\n /**\n * Initializes transport to use and starts probe.\n *\n * @private\n */\n open() {\n let transport;\n if (this.opts.rememberUpgrade &&\n Socket.priorWebsocketSuccess &&\n this.transports.indexOf(\"websocket\") !== -1) {\n transport = \"websocket\";\n }\n else if (0 === this.transports.length) {\n // Emit error on next tick so it can be listened to\n this.setTimeoutFn(() => {\n this.emitReserved(\"error\", \"No transports available\");\n }, 0);\n return;\n }\n else {\n transport = this.transports[0];\n }\n this.readyState = \"opening\";\n // Retry with the next transport if the transport is disabled (jsonp: false)\n try {\n transport = this.createTransport(transport);\n }\n catch (e) {\n this.transports.shift();\n this.open();\n return;\n }\n transport.open();\n this.setTransport(transport);\n }\n /**\n * Sets the current transport. Disables the existing one (if any).\n *\n * @private\n */\n setTransport(transport) {\n if (this.transport) {\n this.transport.removeAllListeners();\n }\n // set up transport\n this.transport = transport;\n // set up transport listeners\n transport\n .on(\"drain\", this.onDrain.bind(this))\n .on(\"packet\", this.onPacket.bind(this))\n .on(\"error\", this.onError.bind(this))\n .on(\"close\", (reason) => this.onClose(\"transport close\", reason));\n }\n /**\n * Probes a transport.\n *\n * @param {String} name - transport name\n * @private\n */\n probe(name) {\n let transport = this.createTransport(name);\n let failed = false;\n Socket.priorWebsocketSuccess = false;\n const onTransportOpen = () => {\n if (failed)\n return;\n transport.send([{ type: \"ping\", data: \"probe\" }]);\n transport.once(\"packet\", (msg) => {\n if (failed)\n return;\n if (\"pong\" === msg.type && \"probe\" === msg.data) {\n this.upgrading = true;\n this.emitReserved(\"upgrading\", transport);\n if (!transport)\n return;\n Socket.priorWebsocketSuccess = \"websocket\" === transport.name;\n this.transport.pause(() => {\n if (failed)\n return;\n if (\"closed\" === this.readyState)\n return;\n cleanup();\n this.setTransport(transport);\n transport.send([{ type: \"upgrade\" }]);\n this.emitReserved(\"upgrade\", transport);\n transport = null;\n this.upgrading = false;\n this.flush();\n });\n }\n else {\n const err = new Error(\"probe error\");\n // @ts-ignore\n err.transport = transport.name;\n this.emitReserved(\"upgradeError\", err);\n }\n });\n };\n function freezeTransport() {\n if (failed)\n return;\n // Any callback called by transport should be ignored since now\n failed = true;\n cleanup();\n transport.close();\n transport = null;\n }\n // Handle any error that happens while probing\n const onerror = (err) => {\n const error = new Error(\"probe error: \" + err);\n // @ts-ignore\n error.transport = transport.name;\n freezeTransport();\n this.emitReserved(\"upgradeError\", error);\n };\n function onTransportClose() {\n onerror(\"transport closed\");\n }\n // When the socket is closed while we're probing\n function onclose() {\n onerror(\"socket closed\");\n }\n // When the socket is upgraded while we're probing\n function onupgrade(to) {\n if (transport && to.name !== transport.name) {\n freezeTransport();\n }\n }\n // Remove all listeners on the transport and on self\n const cleanup = () => {\n transport.removeListener(\"open\", onTransportOpen);\n transport.removeListener(\"error\", onerror);\n transport.removeListener(\"close\", onTransportClose);\n this.off(\"close\", onclose);\n this.off(\"upgrading\", onupgrade);\n };\n transport.once(\"open\", onTransportOpen);\n transport.once(\"error\", onerror);\n transport.once(\"close\", onTransportClose);\n this.once(\"close\", onclose);\n this.once(\"upgrading\", onupgrade);\n if (this.upgrades.indexOf(\"webtransport\") !== -1 &&\n name !== \"webtransport\") {\n // favor WebTransport\n this.setTimeoutFn(() => {\n if (!failed) {\n transport.open();\n }\n }, 200);\n }\n else {\n transport.open();\n }\n }\n /**\n * Called when connection is deemed open.\n *\n * @private\n */\n onOpen() {\n this.readyState = \"open\";\n Socket.priorWebsocketSuccess = \"websocket\" === this.transport.name;\n this.emitReserved(\"open\");\n this.flush();\n // we check for `readyState` in case an `open`\n // listener already closed the socket\n if (\"open\" === this.readyState && this.opts.upgrade) {\n let i = 0;\n const l = this.upgrades.length;\n for (; i < l; i++) {\n this.probe(this.upgrades[i]);\n }\n }\n }\n /**\n * Handles a packet.\n *\n * @private\n */\n onPacket(packet) {\n if (\"opening\" === this.readyState ||\n \"open\" === this.readyState ||\n \"closing\" === this.readyState) {\n this.emitReserved(\"packet\", packet);\n // Socket is live - any packet counts\n this.emitReserved(\"heartbeat\");\n switch (packet.type) {\n case \"open\":\n this.onHandshake(JSON.parse(packet.data));\n break;\n case \"ping\":\n this.resetPingTimeout();\n this.sendPacket(\"pong\");\n this.emitReserved(\"ping\");\n this.emitReserved(\"pong\");\n break;\n case \"error\":\n const err = new Error(\"server error\");\n // @ts-ignore\n err.code = packet.data;\n this.onError(err);\n break;\n case \"message\":\n this.emitReserved(\"data\", packet.data);\n this.emitReserved(\"message\", packet.data);\n break;\n }\n }\n else {\n }\n }\n /**\n * Called upon handshake completion.\n *\n * @param {Object} data - handshake obj\n * @private\n */\n onHandshake(data) {\n this.emitReserved(\"handshake\", data);\n this.id = data.sid;\n this.transport.query.sid = data.sid;\n this.upgrades = this.filterUpgrades(data.upgrades);\n this.pingInterval = data.pingInterval;\n this.pingTimeout = data.pingTimeout;\n this.maxPayload = data.maxPayload;\n this.onOpen();\n // In case open handler closes socket\n if (\"closed\" === this.readyState)\n return;\n this.resetPingTimeout();\n }\n /**\n * Sets and resets ping timeout timer based on server pings.\n *\n * @private\n */\n resetPingTimeout() {\n this.clearTimeoutFn(this.pingTimeoutTimer);\n this.pingTimeoutTimer = this.setTimeoutFn(() => {\n this.onClose(\"ping timeout\");\n }, this.pingInterval + this.pingTimeout);\n if (this.opts.autoUnref) {\n this.pingTimeoutTimer.unref();\n }\n }\n /**\n * Called on `drain` event\n *\n * @private\n */\n onDrain() {\n this.writeBuffer.splice(0, this.prevBufferLen);\n // setting prevBufferLen = 0 is very important\n // for example, when upgrading, upgrade packet is sent over,\n // and a nonzero prevBufferLen could cause problems on `drain`\n this.prevBufferLen = 0;\n if (0 === this.writeBuffer.length) {\n this.emitReserved(\"drain\");\n }\n else {\n this.flush();\n }\n }\n /**\n * Flush write buffers.\n *\n * @private\n */\n flush() {\n if (\"closed\" !== this.readyState &&\n this.transport.writable &&\n !this.upgrading &&\n this.writeBuffer.length) {\n const packets = this.getWritablePackets();\n this.transport.send(packets);\n // keep track of current length of writeBuffer\n // splice writeBuffer and callbackBuffer on `drain`\n this.prevBufferLen = packets.length;\n this.emitReserved(\"flush\");\n }\n }\n /**\n * Ensure the encoded size of the writeBuffer is below the maxPayload value sent by the server (only for HTTP\n * long-polling)\n *\n * @private\n */\n getWritablePackets() {\n const shouldCheckPayloadSize = this.maxPayload &&\n this.transport.name === \"polling\" &&\n this.writeBuffer.length > 1;\n if (!shouldCheckPayloadSize) {\n return this.writeBuffer;\n }\n let payloadSize = 1; // first packet type\n for (let i = 0; i < this.writeBuffer.length; i++) {\n const data = this.writeBuffer[i].data;\n if (data) {\n payloadSize += byteLength(data);\n }\n if (i > 0 && payloadSize > this.maxPayload) {\n return this.writeBuffer.slice(0, i);\n }\n payloadSize += 2; // separator + packet type\n }\n return this.writeBuffer;\n }\n /**\n * Sends a message.\n *\n * @param {String} msg - message.\n * @param {Object} options.\n * @param {Function} callback function.\n * @return {Socket} for chaining.\n */\n write(msg, options, fn) {\n this.sendPacket(\"message\", msg, options, fn);\n return this;\n }\n send(msg, options, fn) {\n this.sendPacket(\"message\", msg, options, fn);\n return this;\n }\n /**\n * Sends a packet.\n *\n * @param {String} type: packet type.\n * @param {String} data.\n * @param {Object} options.\n * @param {Function} fn - callback function.\n * @private\n */\n sendPacket(type, data, options, fn) {\n if (\"function\" === typeof data) {\n fn = data;\n data = undefined;\n }\n if (\"function\" === typeof options) {\n fn = options;\n options = null;\n }\n if (\"closing\" === this.readyState || \"closed\" === this.readyState) {\n return;\n }\n options = options || {};\n options.compress = false !== options.compress;\n const packet = {\n type: type,\n data: data,\n options: options,\n };\n this.emitReserved(\"packetCreate\", packet);\n this.writeBuffer.push(packet);\n if (fn)\n this.once(\"flush\", fn);\n this.flush();\n }\n /**\n * Closes the connection.\n */\n close() {\n const close = () => {\n this.onClose(\"forced close\");\n this.transport.close();\n };\n const cleanupAndClose = () => {\n this.off(\"upgrade\", cleanupAndClose);\n this.off(\"upgradeError\", cleanupAndClose);\n close();\n };\n const waitForUpgrade = () => {\n // wait for upgrade to finish since we can't send packets while pausing a transport\n this.once(\"upgrade\", cleanupAndClose);\n this.once(\"upgradeError\", cleanupAndClose);\n };\n if (\"opening\" === this.readyState || \"open\" === this.readyState) {\n this.readyState = \"closing\";\n if (this.writeBuffer.length) {\n this.once(\"drain\", () => {\n if (this.upgrading) {\n waitForUpgrade();\n }\n else {\n close();\n }\n });\n }\n else if (this.upgrading) {\n waitForUpgrade();\n }\n else {\n close();\n }\n }\n return this;\n }\n /**\n * Called upon transport error\n *\n * @private\n */\n onError(err) {\n Socket.priorWebsocketSuccess = false;\n this.emitReserved(\"error\", err);\n this.onClose(\"transport error\", err);\n }\n /**\n * Called upon transport close.\n *\n * @private\n */\n onClose(reason, description) {\n if (\"opening\" === this.readyState ||\n \"open\" === this.readyState ||\n \"closing\" === this.readyState) {\n // clear timers\n this.clearTimeoutFn(this.pingTimeoutTimer);\n // stop event from firing again for transport\n this.transport.removeAllListeners(\"close\");\n // ensure transport won't stay open\n this.transport.close();\n // ignore further transport communication\n this.transport.removeAllListeners();\n if (typeof removeEventListener === \"function\") {\n removeEventListener(\"beforeunload\", this.beforeunloadEventListener, false);\n removeEventListener(\"offline\", this.offlineEventListener, false);\n }\n // set ready state\n this.readyState = \"closed\";\n // clear session id\n this.id = null;\n // emit close event\n this.emitReserved(\"close\", reason, description);\n // clean buffers after, so users can still\n // grab the buffers on `close` event\n this.writeBuffer = [];\n this.prevBufferLen = 0;\n }\n }\n /**\n * Filters upgrades, returning only those matching client transports.\n *\n * @param {Array} upgrades - server upgrades\n * @private\n */\n filterUpgrades(upgrades) {\n const filteredUpgrades = [];\n let i = 0;\n const j = upgrades.length;\n for (; i < j; i++) {\n if (~this.transports.indexOf(upgrades[i]))\n filteredUpgrades.push(upgrades[i]);\n }\n return filteredUpgrades;\n }\n}\nSocket.protocol = protocol;\n","import { Socket } from \"./socket.js\";\nexport { Socket };\nexport const protocol = Socket.protocol;\nexport { Transport } from \"./transport.js\";\nexport { transports } from \"./transports/index.js\";\nexport { installTimerFunctions } from \"./util.js\";\nexport { parse } from \"./contrib/parseuri.js\";\nexport { nextTick } from \"./transports/websocket-constructor.js\";\n","import unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nexport default function _createForOfIteratorHelper(o, allowArrayLike) {\n var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n if (!it) {\n if (Array.isArray(o) || (it = unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n if (it) o = it;\n var i = 0;\n var F = function F() {};\n return {\n s: F,\n n: function n() {\n if (i >= o.length) return {\n done: true\n };\n return {\n done: false,\n value: o[i++]\n };\n },\n e: function e(_e) {\n throw _e;\n },\n f: F\n };\n }\n throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n var normalCompletion = true,\n didErr = false,\n err;\n return {\n s: function s() {\n it = it.call(o);\n },\n n: function n() {\n var step = it.next();\n normalCompletion = step.done;\n return step;\n },\n e: function e(_e2) {\n didErr = true;\n err = _e2;\n },\n f: function f() {\n try {\n if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n } finally {\n if (didErr) throw err;\n }\n }\n };\n}","const withNativeArrayBuffer = typeof ArrayBuffer === \"function\";\nconst isView = (obj) => {\n return typeof ArrayBuffer.isView === \"function\"\n ? ArrayBuffer.isView(obj)\n : obj.buffer instanceof ArrayBuffer;\n};\nconst toString = Object.prototype.toString;\nconst withNativeBlob = typeof Blob === \"function\" ||\n (typeof Blob !== \"undefined\" &&\n toString.call(Blob) === \"[object BlobConstructor]\");\nconst withNativeFile = typeof File === \"function\" ||\n (typeof File !== \"undefined\" &&\n toString.call(File) === \"[object FileConstructor]\");\n/**\n * Returns true if obj is a Buffer, an ArrayBuffer, a Blob or a File.\n *\n * @private\n */\nexport function isBinary(obj) {\n return ((withNativeArrayBuffer && (obj instanceof ArrayBuffer || isView(obj))) ||\n (withNativeBlob && obj instanceof Blob) ||\n (withNativeFile && obj instanceof File));\n}\nexport function hasBinary(obj, toJSON) {\n if (!obj || typeof obj !== \"object\") {\n return false;\n }\n if (Array.isArray(obj)) {\n for (let i = 0, l = obj.length; i < l; i++) {\n if (hasBinary(obj[i])) {\n return true;\n }\n }\n return false;\n }\n if (isBinary(obj)) {\n return true;\n }\n if (obj.toJSON &&\n typeof obj.toJSON === \"function\" &&\n arguments.length === 1) {\n return hasBinary(obj.toJSON(), true);\n }\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key) && hasBinary(obj[key])) {\n return true;\n }\n }\n return false;\n}\n","import { isBinary } from \"./is-binary.js\";\n/**\n * Replaces every Buffer | ArrayBuffer | Blob | File in packet with a numbered placeholder.\n *\n * @param {Object} packet - socket.io event packet\n * @return {Object} with deconstructed packet and list of buffers\n * @public\n */\nexport function deconstructPacket(packet) {\n const buffers = [];\n const packetData = packet.data;\n const pack = packet;\n pack.data = _deconstructPacket(packetData, buffers);\n pack.attachments = buffers.length; // number of binary 'attachments'\n return { packet: pack, buffers: buffers };\n}\nfunction _deconstructPacket(data, buffers) {\n if (!data)\n return data;\n if (isBinary(data)) {\n const placeholder = { _placeholder: true, num: buffers.length };\n buffers.push(data);\n return placeholder;\n }\n else if (Array.isArray(data)) {\n const newData = new Array(data.length);\n for (let i = 0; i < data.length; i++) {\n newData[i] = _deconstructPacket(data[i], buffers);\n }\n return newData;\n }\n else if (typeof data === \"object\" && !(data instanceof Date)) {\n const newData = {};\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n newData[key] = _deconstructPacket(data[key], buffers);\n }\n }\n return newData;\n }\n return data;\n}\n/**\n * Reconstructs a binary packet from its placeholder packet and buffers\n *\n * @param {Object} packet - event packet with placeholders\n * @param {Array} buffers - binary buffers to put in placeholder positions\n * @return {Object} reconstructed packet\n * @public\n */\nexport function reconstructPacket(packet, buffers) {\n packet.data = _reconstructPacket(packet.data, buffers);\n delete packet.attachments; // no longer useful\n return packet;\n}\nfunction _reconstructPacket(data, buffers) {\n if (!data)\n return data;\n if (data && data._placeholder === true) {\n const isIndexValid = typeof data.num === \"number\" &&\n data.num >= 0 &&\n data.num < buffers.length;\n if (isIndexValid) {\n return buffers[data.num]; // appropriate buffer (should be natural order anyway)\n }\n else {\n throw new Error(\"illegal attachments\");\n }\n }\n else if (Array.isArray(data)) {\n for (let i = 0; i < data.length; i++) {\n data[i] = _reconstructPacket(data[i], buffers);\n }\n }\n else if (typeof data === \"object\") {\n for (const key in data) {\n if (Object.prototype.hasOwnProperty.call(data, key)) {\n data[key] = _reconstructPacket(data[key], buffers);\n }\n }\n }\n return data;\n}\n","import { Emitter } from \"@socket.io/component-emitter\";\nimport { deconstructPacket, reconstructPacket } from \"./binary.js\";\nimport { isBinary, hasBinary } from \"./is-binary.js\";\n/**\n * These strings must not be used as event names, as they have a special meaning.\n */\nconst RESERVED_EVENTS = [\n \"connect\",\n \"connect_error\",\n \"disconnect\",\n \"disconnecting\",\n \"newListener\",\n \"removeListener\", // used by the Node.js EventEmitter\n];\n/**\n * Protocol version.\n *\n * @public\n */\nexport const protocol = 5;\nexport var PacketType;\n(function (PacketType) {\n PacketType[PacketType[\"CONNECT\"] = 0] = \"CONNECT\";\n PacketType[PacketType[\"DISCONNECT\"] = 1] = \"DISCONNECT\";\n PacketType[PacketType[\"EVENT\"] = 2] = \"EVENT\";\n PacketType[PacketType[\"ACK\"] = 3] = \"ACK\";\n PacketType[PacketType[\"CONNECT_ERROR\"] = 4] = \"CONNECT_ERROR\";\n PacketType[PacketType[\"BINARY_EVENT\"] = 5] = \"BINARY_EVENT\";\n PacketType[PacketType[\"BINARY_ACK\"] = 6] = \"BINARY_ACK\";\n})(PacketType || (PacketType = {}));\n/**\n * A socket.io Encoder instance\n */\nexport class Encoder {\n /**\n * Encoder constructor\n *\n * @param {function} replacer - custom replacer to pass down to JSON.parse\n */\n constructor(replacer) {\n this.replacer = replacer;\n }\n /**\n * Encode a packet as a single string if non-binary, or as a\n * buffer sequence, depending on packet type.\n *\n * @param {Object} obj - packet object\n */\n encode(obj) {\n if (obj.type === PacketType.EVENT || obj.type === PacketType.ACK) {\n if (hasBinary(obj)) {\n return this.encodeAsBinary({\n type: obj.type === PacketType.EVENT\n ? PacketType.BINARY_EVENT\n : PacketType.BINARY_ACK,\n nsp: obj.nsp,\n data: obj.data,\n id: obj.id,\n });\n }\n }\n return [this.encodeAsString(obj)];\n }\n /**\n * Encode packet as string.\n */\n encodeAsString(obj) {\n // first is type\n let str = \"\" + obj.type;\n // attachments if we have them\n if (obj.type === PacketType.BINARY_EVENT ||\n obj.type === PacketType.BINARY_ACK) {\n str += obj.attachments + \"-\";\n }\n // if we have a namespace other than `/`\n // we append it followed by a comma `,`\n if (obj.nsp && \"/\" !== obj.nsp) {\n str += obj.nsp + \",\";\n }\n // immediately followed by the id\n if (null != obj.id) {\n str += obj.id;\n }\n // json data\n if (null != obj.data) {\n str += JSON.stringify(obj.data, this.replacer);\n }\n return str;\n }\n /**\n * Encode packet as 'buffer sequence' by removing blobs, and\n * deconstructing packet into object with placeholders and\n * a list of buffers.\n */\n encodeAsBinary(obj) {\n const deconstruction = deconstructPacket(obj);\n const pack = this.encodeAsString(deconstruction.packet);\n const buffers = deconstruction.buffers;\n buffers.unshift(pack); // add packet info to beginning of data list\n return buffers; // write all the buffers\n }\n}\n// see https://stackoverflow.com/questions/8511281/check-if-a-value-is-an-object-in-javascript\nfunction isObject(value) {\n return Object.prototype.toString.call(value) === \"[object Object]\";\n}\n/**\n * A socket.io Decoder instance\n *\n * @return {Object} decoder\n */\nexport class Decoder extends Emitter {\n /**\n * Decoder constructor\n *\n * @param {function} reviver - custom reviver to pass down to JSON.stringify\n */\n constructor(reviver) {\n super();\n this.reviver = reviver;\n }\n /**\n * Decodes an encoded packet string into packet JSON.\n *\n * @param {String} obj - encoded packet\n */\n add(obj) {\n let packet;\n if (typeof obj === \"string\") {\n if (this.reconstructor) {\n throw new Error(\"got plaintext data when reconstructing a packet\");\n }\n packet = this.decodeString(obj);\n const isBinaryEvent = packet.type === PacketType.BINARY_EVENT;\n if (isBinaryEvent || packet.type === PacketType.BINARY_ACK) {\n packet.type = isBinaryEvent ? PacketType.EVENT : PacketType.ACK;\n // binary packet's json\n this.reconstructor = new BinaryReconstructor(packet);\n // no attachments, labeled binary but no binary data to follow\n if (packet.attachments === 0) {\n super.emitReserved(\"decoded\", packet);\n }\n }\n else {\n // non-binary full packet\n super.emitReserved(\"decoded\", packet);\n }\n }\n else if (isBinary(obj) || obj.base64) {\n // raw binary data\n if (!this.reconstructor) {\n throw new Error(\"got binary data when not reconstructing a packet\");\n }\n else {\n packet = this.reconstructor.takeBinaryData(obj);\n if (packet) {\n // received final buffer\n this.reconstructor = null;\n super.emitReserved(\"decoded\", packet);\n }\n }\n }\n else {\n throw new Error(\"Unknown type: \" + obj);\n }\n }\n /**\n * Decode a packet String (JSON data)\n *\n * @param {String} str\n * @return {Object} packet\n */\n decodeString(str) {\n let i = 0;\n // look up type\n const p = {\n type: Number(str.charAt(0)),\n };\n if (PacketType[p.type] === undefined) {\n throw new Error(\"unknown packet type \" + p.type);\n }\n // look up attachments if type binary\n if (p.type === PacketType.BINARY_EVENT ||\n p.type === PacketType.BINARY_ACK) {\n const start = i + 1;\n while (str.charAt(++i) !== \"-\" && i != str.length) { }\n const buf = str.substring(start, i);\n if (buf != Number(buf) || str.charAt(i) !== \"-\") {\n throw new Error(\"Illegal attachments\");\n }\n p.attachments = Number(buf);\n }\n // look up namespace (if any)\n if (\"/\" === str.charAt(i + 1)) {\n const start = i + 1;\n while (++i) {\n const c = str.charAt(i);\n if (\",\" === c)\n break;\n if (i === str.length)\n break;\n }\n p.nsp = str.substring(start, i);\n }\n else {\n p.nsp = \"/\";\n }\n // look up id\n const next = str.charAt(i + 1);\n if (\"\" !== next && Number(next) == next) {\n const start = i + 1;\n while (++i) {\n const c = str.charAt(i);\n if (null == c || Number(c) != c) {\n --i;\n break;\n }\n if (i === str.length)\n break;\n }\n p.id = Number(str.substring(start, i + 1));\n }\n // look up json data\n if (str.charAt(++i)) {\n const payload = this.tryParse(str.substr(i));\n if (Decoder.isPayloadValid(p.type, payload)) {\n p.data = payload;\n }\n else {\n throw new Error(\"invalid payload\");\n }\n }\n return p;\n }\n tryParse(str) {\n try {\n return JSON.parse(str, this.reviver);\n }\n catch (e) {\n return false;\n }\n }\n static isPayloadValid(type, payload) {\n switch (type) {\n case PacketType.CONNECT:\n return isObject(payload);\n case PacketType.DISCONNECT:\n return payload === undefined;\n case PacketType.CONNECT_ERROR:\n return typeof payload === \"string\" || isObject(payload);\n case PacketType.EVENT:\n case PacketType.BINARY_EVENT:\n return (Array.isArray(payload) &&\n (typeof payload[0] === \"number\" ||\n (typeof payload[0] === \"string\" &&\n RESERVED_EVENTS.indexOf(payload[0]) === -1)));\n case PacketType.ACK:\n case PacketType.BINARY_ACK:\n return Array.isArray(payload);\n }\n }\n /**\n * Deallocates a parser's resources\n */\n destroy() {\n if (this.reconstructor) {\n this.reconstructor.finishedReconstruction();\n this.reconstructor = null;\n }\n }\n}\n/**\n * A manager of a binary event's 'buffer sequence'. Should\n * be constructed whenever a packet of type BINARY_EVENT is\n * decoded.\n *\n * @param {Object} packet\n * @return {BinaryReconstructor} initialized reconstructor\n */\nclass BinaryReconstructor {\n constructor(packet) {\n this.packet = packet;\n this.buffers = [];\n this.reconPack = packet;\n }\n /**\n * Method to be called when binary data received from connection\n * after a BINARY_EVENT packet.\n *\n * @param {Buffer | ArrayBuffer} binData - the raw binary data received\n * @return {null | Object} returns null if more binary data is expected or\n * a reconstructed packet object if all buffers have been received.\n */\n takeBinaryData(binData) {\n this.buffers.push(binData);\n if (this.buffers.length === this.reconPack.attachments) {\n // done with buffer list\n const packet = reconstructPacket(this.reconPack, this.buffers);\n this.finishedReconstruction();\n return packet;\n }\n return null;\n }\n /**\n * Cleans up binary packet reconstruction variables.\n */\n finishedReconstruction() {\n this.reconPack = null;\n this.buffers = [];\n }\n}\n","export function on(obj, ev, fn) {\n obj.on(ev, fn);\n return function subDestroy() {\n obj.off(ev, fn);\n };\n}\n","import { PacketType } from \"socket.io-parser\";\nimport { on } from \"./on.js\";\nimport { Emitter, } from \"@socket.io/component-emitter\";\n/**\n * Internal events.\n * These events can't be emitted by the user.\n */\nconst RESERVED_EVENTS = Object.freeze({\n connect: 1,\n connect_error: 1,\n disconnect: 1,\n disconnecting: 1,\n // EventEmitter reserved events: https://nodejs.org/api/events.html#events_event_newlistener\n newListener: 1,\n removeListener: 1,\n});\n/**\n * A Socket is the fundamental class for interacting with the server.\n *\n * A Socket belongs to a certain Namespace (by default /) and uses an underlying {@link Manager} to communicate.\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"connect\", () => {\n * console.log(\"connected\");\n * });\n *\n * // send an event to the server\n * socket.emit(\"foo\", \"bar\");\n *\n * socket.on(\"foobar\", () => {\n * // an event was received from the server\n * });\n *\n * // upon disconnection\n * socket.on(\"disconnect\", (reason) => {\n * console.log(`disconnected due to ${reason}`);\n * });\n */\nexport class Socket extends Emitter {\n /**\n * `Socket` constructor.\n */\n constructor(io, nsp, opts) {\n super();\n /**\n * Whether the socket is currently connected to the server.\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"connect\", () => {\n * console.log(socket.connected); // true\n * });\n *\n * socket.on(\"disconnect\", () => {\n * console.log(socket.connected); // false\n * });\n */\n this.connected = false;\n /**\n * Whether the connection state was recovered after a temporary disconnection. In that case, any missed packets will\n * be transmitted by the server.\n */\n this.recovered = false;\n /**\n * Buffer for packets received before the CONNECT packet\n */\n this.receiveBuffer = [];\n /**\n * Buffer for packets that will be sent once the socket is connected\n */\n this.sendBuffer = [];\n /**\n * The queue of packets to be sent with retry in case of failure.\n *\n * Packets are sent one by one, each waiting for the server acknowledgement, in order to guarantee the delivery order.\n * @private\n */\n this._queue = [];\n /**\n * A sequence to generate the ID of the {@link QueuedPacket}.\n * @private\n */\n this._queueSeq = 0;\n this.ids = 0;\n this.acks = {};\n this.flags = {};\n this.io = io;\n this.nsp = nsp;\n if (opts && opts.auth) {\n this.auth = opts.auth;\n }\n this._opts = Object.assign({}, opts);\n if (this.io._autoConnect)\n this.open();\n }\n /**\n * Whether the socket is currently disconnected\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"connect\", () => {\n * console.log(socket.disconnected); // false\n * });\n *\n * socket.on(\"disconnect\", () => {\n * console.log(socket.disconnected); // true\n * });\n */\n get disconnected() {\n return !this.connected;\n }\n /**\n * Subscribe to open, close and packet events\n *\n * @private\n */\n subEvents() {\n if (this.subs)\n return;\n const io = this.io;\n this.subs = [\n on(io, \"open\", this.onopen.bind(this)),\n on(io, \"packet\", this.onpacket.bind(this)),\n on(io, \"error\", this.onerror.bind(this)),\n on(io, \"close\", this.onclose.bind(this)),\n ];\n }\n /**\n * Whether the Socket will try to reconnect when its Manager connects or reconnects.\n *\n * @example\n * const socket = io();\n *\n * console.log(socket.active); // true\n *\n * socket.on(\"disconnect\", (reason) => {\n * if (reason === \"io server disconnect\") {\n * // the disconnection was initiated by the server, you need to manually reconnect\n * console.log(socket.active); // false\n * }\n * // else the socket will automatically try to reconnect\n * console.log(socket.active); // true\n * });\n */\n get active() {\n return !!this.subs;\n }\n /**\n * \"Opens\" the socket.\n *\n * @example\n * const socket = io({\n * autoConnect: false\n * });\n *\n * socket.connect();\n */\n connect() {\n if (this.connected)\n return this;\n this.subEvents();\n if (!this.io[\"_reconnecting\"])\n this.io.open(); // ensure open\n if (\"open\" === this.io._readyState)\n this.onopen();\n return this;\n }\n /**\n * Alias for {@link connect()}.\n */\n open() {\n return this.connect();\n }\n /**\n * Sends a `message` event.\n *\n * This method mimics the WebSocket.send() method.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send\n *\n * @example\n * socket.send(\"hello\");\n *\n * // this is equivalent to\n * socket.emit(\"message\", \"hello\");\n *\n * @return self\n */\n send(...args) {\n args.unshift(\"message\");\n this.emit.apply(this, args);\n return this;\n }\n /**\n * Override `emit`.\n * If the event is in `events`, it's emitted normally.\n *\n * @example\n * socket.emit(\"hello\", \"world\");\n *\n * // all serializable datastructures are supported (no need to call JSON.stringify)\n * socket.emit(\"hello\", 1, \"2\", { 3: [\"4\"], 5: Uint8Array.from([6]) });\n *\n * // with an acknowledgement from the server\n * socket.emit(\"hello\", \"world\", (val) => {\n * // ...\n * });\n *\n * @return self\n */\n emit(ev, ...args) {\n if (RESERVED_EVENTS.hasOwnProperty(ev)) {\n throw new Error('\"' + ev.toString() + '\" is a reserved event name');\n }\n args.unshift(ev);\n if (this._opts.retries && !this.flags.fromQueue && !this.flags.volatile) {\n this._addToQueue(args);\n return this;\n }\n const packet = {\n type: PacketType.EVENT,\n data: args,\n };\n packet.options = {};\n packet.options.compress = this.flags.compress !== false;\n // event ack callback\n if (\"function\" === typeof args[args.length - 1]) {\n const id = this.ids++;\n const ack = args.pop();\n this._registerAckCallback(id, ack);\n packet.id = id;\n }\n const isTransportWritable = this.io.engine &&\n this.io.engine.transport &&\n this.io.engine.transport.writable;\n const discardPacket = this.flags.volatile && (!isTransportWritable || !this.connected);\n if (discardPacket) {\n }\n else if (this.connected) {\n this.notifyOutgoingListeners(packet);\n this.packet(packet);\n }\n else {\n this.sendBuffer.push(packet);\n }\n this.flags = {};\n return this;\n }\n /**\n * @private\n */\n _registerAckCallback(id, ack) {\n var _a;\n const timeout = (_a = this.flags.timeout) !== null && _a !== void 0 ? _a : this._opts.ackTimeout;\n if (timeout === undefined) {\n this.acks[id] = ack;\n return;\n }\n // @ts-ignore\n const timer = this.io.setTimeoutFn(() => {\n delete this.acks[id];\n for (let i = 0; i < this.sendBuffer.length; i++) {\n if (this.sendBuffer[i].id === id) {\n this.sendBuffer.splice(i, 1);\n }\n }\n ack.call(this, new Error(\"operation has timed out\"));\n }, timeout);\n this.acks[id] = (...args) => {\n // @ts-ignore\n this.io.clearTimeoutFn(timer);\n ack.apply(this, [null, ...args]);\n };\n }\n /**\n * Emits an event and waits for an acknowledgement\n *\n * @example\n * // without timeout\n * const response = await socket.emitWithAck(\"hello\", \"world\");\n *\n * // with a specific timeout\n * try {\n * const response = await socket.timeout(1000).emitWithAck(\"hello\", \"world\");\n * } catch (err) {\n * // the server did not acknowledge the event in the given delay\n * }\n *\n * @return a Promise that will be fulfilled when the server acknowledges the event\n */\n emitWithAck(ev, ...args) {\n // the timeout flag is optional\n const withErr = this.flags.timeout !== undefined || this._opts.ackTimeout !== undefined;\n return new Promise((resolve, reject) => {\n args.push((arg1, arg2) => {\n if (withErr) {\n return arg1 ? reject(arg1) : resolve(arg2);\n }\n else {\n return resolve(arg1);\n }\n });\n this.emit(ev, ...args);\n });\n }\n /**\n * Add the packet to the queue.\n * @param args\n * @private\n */\n _addToQueue(args) {\n let ack;\n if (typeof args[args.length - 1] === \"function\") {\n ack = args.pop();\n }\n const packet = {\n id: this._queueSeq++,\n tryCount: 0,\n pending: false,\n args,\n flags: Object.assign({ fromQueue: true }, this.flags),\n };\n args.push((err, ...responseArgs) => {\n if (packet !== this._queue[0]) {\n // the packet has already been acknowledged\n return;\n }\n const hasError = err !== null;\n if (hasError) {\n if (packet.tryCount > this._opts.retries) {\n this._queue.shift();\n if (ack) {\n ack(err);\n }\n }\n }\n else {\n this._queue.shift();\n if (ack) {\n ack(null, ...responseArgs);\n }\n }\n packet.pending = false;\n return this._drainQueue();\n });\n this._queue.push(packet);\n this._drainQueue();\n }\n /**\n * Send the first packet of the queue, and wait for an acknowledgement from the server.\n * @param force - whether to resend a packet that has not been acknowledged yet\n *\n * @private\n */\n _drainQueue(force = false) {\n if (!this.connected || this._queue.length === 0) {\n return;\n }\n const packet = this._queue[0];\n if (packet.pending && !force) {\n return;\n }\n packet.pending = true;\n packet.tryCount++;\n this.flags = packet.flags;\n this.emit.apply(this, packet.args);\n }\n /**\n * Sends a packet.\n *\n * @param packet\n * @private\n */\n packet(packet) {\n packet.nsp = this.nsp;\n this.io._packet(packet);\n }\n /**\n * Called upon engine `open`.\n *\n * @private\n */\n onopen() {\n if (typeof this.auth == \"function\") {\n this.auth((data) => {\n this._sendConnectPacket(data);\n });\n }\n else {\n this._sendConnectPacket(this.auth);\n }\n }\n /**\n * Sends a CONNECT packet to initiate the Socket.IO session.\n *\n * @param data\n * @private\n */\n _sendConnectPacket(data) {\n this.packet({\n type: PacketType.CONNECT,\n data: this._pid\n ? Object.assign({ pid: this._pid, offset: this._lastOffset }, data)\n : data,\n });\n }\n /**\n * Called upon engine or manager `error`.\n *\n * @param err\n * @private\n */\n onerror(err) {\n if (!this.connected) {\n this.emitReserved(\"connect_error\", err);\n }\n }\n /**\n * Called upon engine `close`.\n *\n * @param reason\n * @param description\n * @private\n */\n onclose(reason, description) {\n this.connected = false;\n delete this.id;\n this.emitReserved(\"disconnect\", reason, description);\n }\n /**\n * Called with socket packet.\n *\n * @param packet\n * @private\n */\n onpacket(packet) {\n const sameNamespace = packet.nsp === this.nsp;\n if (!sameNamespace)\n return;\n switch (packet.type) {\n case PacketType.CONNECT:\n if (packet.data && packet.data.sid) {\n this.onconnect(packet.data.sid, packet.data.pid);\n }\n else {\n this.emitReserved(\"connect_error\", new Error(\"It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)\"));\n }\n break;\n case PacketType.EVENT:\n case PacketType.BINARY_EVENT:\n this.onevent(packet);\n break;\n case PacketType.ACK:\n case PacketType.BINARY_ACK:\n this.onack(packet);\n break;\n case PacketType.DISCONNECT:\n this.ondisconnect();\n break;\n case PacketType.CONNECT_ERROR:\n this.destroy();\n const err = new Error(packet.data.message);\n // @ts-ignore\n err.data = packet.data.data;\n this.emitReserved(\"connect_error\", err);\n break;\n }\n }\n /**\n * Called upon a server event.\n *\n * @param packet\n * @private\n */\n onevent(packet) {\n const args = packet.data || [];\n if (null != packet.id) {\n args.push(this.ack(packet.id));\n }\n if (this.connected) {\n this.emitEvent(args);\n }\n else {\n this.receiveBuffer.push(Object.freeze(args));\n }\n }\n emitEvent(args) {\n if (this._anyListeners && this._anyListeners.length) {\n const listeners = this._anyListeners.slice();\n for (const listener of listeners) {\n listener.apply(this, args);\n }\n }\n super.emit.apply(this, args);\n if (this._pid && args.length && typeof args[args.length - 1] === \"string\") {\n this._lastOffset = args[args.length - 1];\n }\n }\n /**\n * Produces an ack callback to emit with an event.\n *\n * @private\n */\n ack(id) {\n const self = this;\n let sent = false;\n return function (...args) {\n // prevent double callbacks\n if (sent)\n return;\n sent = true;\n self.packet({\n type: PacketType.ACK,\n id: id,\n data: args,\n });\n };\n }\n /**\n * Called upon a server acknowlegement.\n *\n * @param packet\n * @private\n */\n onack(packet) {\n const ack = this.acks[packet.id];\n if (\"function\" === typeof ack) {\n ack.apply(this, packet.data);\n delete this.acks[packet.id];\n }\n else {\n }\n }\n /**\n * Called upon server connect.\n *\n * @private\n */\n onconnect(id, pid) {\n this.id = id;\n this.recovered = pid && this._pid === pid;\n this._pid = pid; // defined only if connection state recovery is enabled\n this.connected = true;\n this.emitBuffered();\n this.emitReserved(\"connect\");\n this._drainQueue(true);\n }\n /**\n * Emit buffered events (received and emitted).\n *\n * @private\n */\n emitBuffered() {\n this.receiveBuffer.forEach((args) => this.emitEvent(args));\n this.receiveBuffer = [];\n this.sendBuffer.forEach((packet) => {\n this.notifyOutgoingListeners(packet);\n this.packet(packet);\n });\n this.sendBuffer = [];\n }\n /**\n * Called upon server disconnect.\n *\n * @private\n */\n ondisconnect() {\n this.destroy();\n this.onclose(\"io server disconnect\");\n }\n /**\n * Called upon forced client/server side disconnections,\n * this method ensures the manager stops tracking us and\n * that reconnections don't get triggered for this.\n *\n * @private\n */\n destroy() {\n if (this.subs) {\n // clean subscriptions to avoid reconnections\n this.subs.forEach((subDestroy) => subDestroy());\n this.subs = undefined;\n }\n this.io[\"_destroy\"](this);\n }\n /**\n * Disconnects the socket manually. In that case, the socket will not try to reconnect.\n *\n * If this is the last active Socket instance of the {@link Manager}, the low-level connection will be closed.\n *\n * @example\n * const socket = io();\n *\n * socket.on(\"disconnect\", (reason) => {\n * // console.log(reason); prints \"io client disconnect\"\n * });\n *\n * socket.disconnect();\n *\n * @return self\n */\n disconnect() {\n if (this.connected) {\n this.packet({ type: PacketType.DISCONNECT });\n }\n // remove socket from pool\n this.destroy();\n if (this.connected) {\n // fire events\n this.onclose(\"io client disconnect\");\n }\n return this;\n }\n /**\n * Alias for {@link disconnect()}.\n *\n * @return self\n */\n close() {\n return this.disconnect();\n }\n /**\n * Sets the compress flag.\n *\n * @example\n * socket.compress(false).emit(\"hello\");\n *\n * @param compress - if `true`, compresses the sending data\n * @return self\n */\n compress(compress) {\n this.flags.compress = compress;\n return this;\n }\n /**\n * Sets a modifier for a subsequent event emission that the event message will be dropped when this socket is not\n * ready to send messages.\n *\n * @example\n * socket.volatile.emit(\"hello\"); // the server may or may not receive it\n *\n * @returns self\n */\n get volatile() {\n this.flags.volatile = true;\n return this;\n }\n /**\n * Sets a modifier for a subsequent event emission that the callback will be called with an error when the\n * given number of milliseconds have elapsed without an acknowledgement from the server:\n *\n * @example\n * socket.timeout(5000).emit(\"my-event\", (err) => {\n * if (err) {\n * // the server did not acknowledge the event in the given delay\n * }\n * });\n *\n * @returns self\n */\n timeout(timeout) {\n this.flags.timeout = timeout;\n return this;\n }\n /**\n * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n * callback.\n *\n * @example\n * socket.onAny((event, ...args) => {\n * console.log(`got ${event}`);\n * });\n *\n * @param listener\n */\n onAny(listener) {\n this._anyListeners = this._anyListeners || [];\n this._anyListeners.push(listener);\n return this;\n }\n /**\n * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n * callback. The listener is added to the beginning of the listeners array.\n *\n * @example\n * socket.prependAny((event, ...args) => {\n * console.log(`got event ${event}`);\n * });\n *\n * @param listener\n */\n prependAny(listener) {\n this._anyListeners = this._anyListeners || [];\n this._anyListeners.unshift(listener);\n return this;\n }\n /**\n * Removes the listener that will be fired when any event is emitted.\n *\n * @example\n * const catchAllListener = (event, ...args) => {\n * console.log(`got event ${event}`);\n * }\n *\n * socket.onAny(catchAllListener);\n *\n * // remove a specific listener\n * socket.offAny(catchAllListener);\n *\n * // or remove all listeners\n * socket.offAny();\n *\n * @param listener\n */\n offAny(listener) {\n if (!this._anyListeners) {\n return this;\n }\n if (listener) {\n const listeners = this._anyListeners;\n for (let i = 0; i < listeners.length; i++) {\n if (listener === listeners[i]) {\n listeners.splice(i, 1);\n return this;\n }\n }\n }\n else {\n this._anyListeners = [];\n }\n return this;\n }\n /**\n * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated,\n * e.g. to remove listeners.\n */\n listenersAny() {\n return this._anyListeners || [];\n }\n /**\n * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n * callback.\n *\n * Note: acknowledgements sent to the server are not included.\n *\n * @example\n * socket.onAnyOutgoing((event, ...args) => {\n * console.log(`sent event ${event}`);\n * });\n *\n * @param listener\n */\n onAnyOutgoing(listener) {\n this._anyOutgoingListeners = this._anyOutgoingListeners || [];\n this._anyOutgoingListeners.push(listener);\n return this;\n }\n /**\n * Adds a listener that will be fired when any event is emitted. The event name is passed as the first argument to the\n * callback. The listener is added to the beginning of the listeners array.\n *\n * Note: acknowledgements sent to the server are not included.\n *\n * @example\n * socket.prependAnyOutgoing((event, ...args) => {\n * console.log(`sent event ${event}`);\n * });\n *\n * @param listener\n */\n prependAnyOutgoing(listener) {\n this._anyOutgoingListeners = this._anyOutgoingListeners || [];\n this._anyOutgoingListeners.unshift(listener);\n return this;\n }\n /**\n * Removes the listener that will be fired when any event is emitted.\n *\n * @example\n * const catchAllListener = (event, ...args) => {\n * console.log(`sent event ${event}`);\n * }\n *\n * socket.onAnyOutgoing(catchAllListener);\n *\n * // remove a specific listener\n * socket.offAnyOutgoing(catchAllListener);\n *\n * // or remove all listeners\n * socket.offAnyOutgoing();\n *\n * @param [listener] - the catch-all listener (optional)\n */\n offAnyOutgoing(listener) {\n if (!this._anyOutgoingListeners) {\n return this;\n }\n if (listener) {\n const listeners = this._anyOutgoingListeners;\n for (let i = 0; i < listeners.length; i++) {\n if (listener === listeners[i]) {\n listeners.splice(i, 1);\n return this;\n }\n }\n }\n else {\n this._anyOutgoingListeners = [];\n }\n return this;\n }\n /**\n * Returns an array of listeners that are listening for any event that is specified. This array can be manipulated,\n * e.g. to remove listeners.\n */\n listenersAnyOutgoing() {\n return this._anyOutgoingListeners || [];\n }\n /**\n * Notify the listeners for each packet sent\n *\n * @param packet\n *\n * @private\n */\n notifyOutgoingListeners(packet) {\n if (this._anyOutgoingListeners && this._anyOutgoingListeners.length) {\n const listeners = this._anyOutgoingListeners.slice();\n for (const listener of listeners) {\n listener.apply(this, packet.data);\n }\n }\n }\n}\n","/**\n * Initialize backoff timer with `opts`.\n *\n * - `min` initial timeout in milliseconds [100]\n * - `max` max timeout [10000]\n * - `jitter` [0]\n * - `factor` [2]\n *\n * @param {Object} opts\n * @api public\n */\nexport function Backoff(opts) {\n opts = opts || {};\n this.ms = opts.min || 100;\n this.max = opts.max || 10000;\n this.factor = opts.factor || 2;\n this.jitter = opts.jitter > 0 && opts.jitter <= 1 ? opts.jitter : 0;\n this.attempts = 0;\n}\n/**\n * Return the backoff duration.\n *\n * @return {Number}\n * @api public\n */\nBackoff.prototype.duration = function () {\n var ms = this.ms * Math.pow(this.factor, this.attempts++);\n if (this.jitter) {\n var rand = Math.random();\n var deviation = Math.floor(rand * this.jitter * ms);\n ms = (Math.floor(rand * 10) & 1) == 0 ? ms - deviation : ms + deviation;\n }\n return Math.min(ms, this.max) | 0;\n};\n/**\n * Reset the number of attempts.\n *\n * @api public\n */\nBackoff.prototype.reset = function () {\n this.attempts = 0;\n};\n/**\n * Set the minimum duration\n *\n * @api public\n */\nBackoff.prototype.setMin = function (min) {\n this.ms = min;\n};\n/**\n * Set the maximum duration\n *\n * @api public\n */\nBackoff.prototype.setMax = function (max) {\n this.max = max;\n};\n/**\n * Set the jitter\n *\n * @api public\n */\nBackoff.prototype.setJitter = function (jitter) {\n this.jitter = jitter;\n};\n","import { Socket as Engine, installTimerFunctions, nextTick, } from \"engine.io-client\";\nimport { Socket } from \"./socket.js\";\nimport * as parser from \"socket.io-parser\";\nimport { on } from \"./on.js\";\nimport { Backoff } from \"./contrib/backo2.js\";\nimport { Emitter, } from \"@socket.io/component-emitter\";\nexport class Manager extends Emitter {\n constructor(uri, opts) {\n var _a;\n super();\n this.nsps = {};\n this.subs = [];\n if (uri && \"object\" === typeof uri) {\n opts = uri;\n uri = undefined;\n }\n opts = opts || {};\n opts.path = opts.path || \"/socket.io\";\n this.opts = opts;\n installTimerFunctions(this, opts);\n this.reconnection(opts.reconnection !== false);\n this.reconnectionAttempts(opts.reconnectionAttempts || Infinity);\n this.reconnectionDelay(opts.reconnectionDelay || 1000);\n this.reconnectionDelayMax(opts.reconnectionDelayMax || 5000);\n this.randomizationFactor((_a = opts.randomizationFactor) !== null && _a !== void 0 ? _a : 0.5);\n this.backoff = new Backoff({\n min: this.reconnectionDelay(),\n max: this.reconnectionDelayMax(),\n jitter: this.randomizationFactor(),\n });\n this.timeout(null == opts.timeout ? 20000 : opts.timeout);\n this._readyState = \"closed\";\n this.uri = uri;\n const _parser = opts.parser || parser;\n this.encoder = new _parser.Encoder();\n this.decoder = new _parser.Decoder();\n this._autoConnect = opts.autoConnect !== false;\n if (this._autoConnect)\n this.open();\n }\n reconnection(v) {\n if (!arguments.length)\n return this._reconnection;\n this._reconnection = !!v;\n return this;\n }\n reconnectionAttempts(v) {\n if (v === undefined)\n return this._reconnectionAttempts;\n this._reconnectionAttempts = v;\n return this;\n }\n reconnectionDelay(v) {\n var _a;\n if (v === undefined)\n return this._reconnectionDelay;\n this._reconnectionDelay = v;\n (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMin(v);\n return this;\n }\n randomizationFactor(v) {\n var _a;\n if (v === undefined)\n return this._randomizationFactor;\n this._randomizationFactor = v;\n (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setJitter(v);\n return this;\n }\n reconnectionDelayMax(v) {\n var _a;\n if (v === undefined)\n return this._reconnectionDelayMax;\n this._reconnectionDelayMax = v;\n (_a = this.backoff) === null || _a === void 0 ? void 0 : _a.setMax(v);\n return this;\n }\n timeout(v) {\n if (!arguments.length)\n return this._timeout;\n this._timeout = v;\n return this;\n }\n /**\n * Starts trying to reconnect if reconnection is enabled and we have not\n * started reconnecting yet\n *\n * @private\n */\n maybeReconnectOnOpen() {\n // Only try to reconnect if it's the first time we're connecting\n if (!this._reconnecting &&\n this._reconnection &&\n this.backoff.attempts === 0) {\n // keeps reconnection from firing twice for the same reconnection loop\n this.reconnect();\n }\n }\n /**\n * Sets the current transport `socket`.\n *\n * @param {Function} fn - optional, callback\n * @return self\n * @public\n */\n open(fn) {\n if (~this._readyState.indexOf(\"open\"))\n return this;\n this.engine = new Engine(this.uri, this.opts);\n const socket = this.engine;\n const self = this;\n this._readyState = \"opening\";\n this.skipReconnect = false;\n // emit `open`\n const openSubDestroy = on(socket, \"open\", function () {\n self.onopen();\n fn && fn();\n });\n const onError = (err) => {\n this.cleanup();\n this._readyState = \"closed\";\n this.emitReserved(\"error\", err);\n if (fn) {\n fn(err);\n }\n else {\n // Only do this if there is no fn to handle the error\n this.maybeReconnectOnOpen();\n }\n };\n // emit `error`\n const errorSub = on(socket, \"error\", onError);\n if (false !== this._timeout) {\n const timeout = this._timeout;\n // set timer\n const timer = this.setTimeoutFn(() => {\n openSubDestroy();\n onError(new Error(\"timeout\"));\n socket.close();\n }, timeout);\n if (this.opts.autoUnref) {\n timer.unref();\n }\n this.subs.push(() => {\n this.clearTimeoutFn(timer);\n });\n }\n this.subs.push(openSubDestroy);\n this.subs.push(errorSub);\n return this;\n }\n /**\n * Alias for open()\n *\n * @return self\n * @public\n */\n connect(fn) {\n return this.open(fn);\n }\n /**\n * Called upon transport open.\n *\n * @private\n */\n onopen() {\n // clear old subs\n this.cleanup();\n // mark as open\n this._readyState = \"open\";\n this.emitReserved(\"open\");\n // add new subs\n const socket = this.engine;\n this.subs.push(on(socket, \"ping\", this.onping.bind(this)), on(socket, \"data\", this.ondata.bind(this)), on(socket, \"error\", this.onerror.bind(this)), on(socket, \"close\", this.onclose.bind(this)), on(this.decoder, \"decoded\", this.ondecoded.bind(this)));\n }\n /**\n * Called upon a ping.\n *\n * @private\n */\n onping() {\n this.emitReserved(\"ping\");\n }\n /**\n * Called with data.\n *\n * @private\n */\n ondata(data) {\n try {\n this.decoder.add(data);\n }\n catch (e) {\n this.onclose(\"parse error\", e);\n }\n }\n /**\n * Called when parser fully decodes a packet.\n *\n * @private\n */\n ondecoded(packet) {\n // the nextTick call prevents an exception in a user-provided event listener from triggering a disconnection due to a \"parse error\"\n nextTick(() => {\n this.emitReserved(\"packet\", packet);\n }, this.setTimeoutFn);\n }\n /**\n * Called upon socket error.\n *\n * @private\n */\n onerror(err) {\n this.emitReserved(\"error\", err);\n }\n /**\n * Creates a new socket for the given `nsp`.\n *\n * @return {Socket}\n * @public\n */\n socket(nsp, opts) {\n let socket = this.nsps[nsp];\n if (!socket) {\n socket = new Socket(this, nsp, opts);\n this.nsps[nsp] = socket;\n }\n else if (this._autoConnect && !socket.active) {\n socket.connect();\n }\n return socket;\n }\n /**\n * Called upon a socket close.\n *\n * @param socket\n * @private\n */\n _destroy(socket) {\n const nsps = Object.keys(this.nsps);\n for (const nsp of nsps) {\n const socket = this.nsps[nsp];\n if (socket.active) {\n return;\n }\n }\n this._close();\n }\n /**\n * Writes a packet.\n *\n * @param packet\n * @private\n */\n _packet(packet) {\n const encodedPackets = this.encoder.encode(packet);\n for (let i = 0; i < encodedPackets.length; i++) {\n this.engine.write(encodedPackets[i], packet.options);\n }\n }\n /**\n * Clean up transport subscriptions and packet buffer.\n *\n * @private\n */\n cleanup() {\n this.subs.forEach((subDestroy) => subDestroy());\n this.subs.length = 0;\n this.decoder.destroy();\n }\n /**\n * Close the current socket.\n *\n * @private\n */\n _close() {\n this.skipReconnect = true;\n this._reconnecting = false;\n this.onclose(\"forced close\");\n if (this.engine)\n this.engine.close();\n }\n /**\n * Alias for close()\n *\n * @private\n */\n disconnect() {\n return this._close();\n }\n /**\n * Called upon engine close.\n *\n * @private\n */\n onclose(reason, description) {\n this.cleanup();\n this.backoff.reset();\n this._readyState = \"closed\";\n this.emitReserved(\"close\", reason, description);\n if (this._reconnection && !this.skipReconnect) {\n this.reconnect();\n }\n }\n /**\n * Attempt a reconnection.\n *\n * @private\n */\n reconnect() {\n if (this._reconnecting || this.skipReconnect)\n return this;\n const self = this;\n if (this.backoff.attempts >= this._reconnectionAttempts) {\n this.backoff.reset();\n this.emitReserved(\"reconnect_failed\");\n this._reconnecting = false;\n }\n else {\n const delay = this.backoff.duration();\n this._reconnecting = true;\n const timer = this.setTimeoutFn(() => {\n if (self.skipReconnect)\n return;\n this.emitReserved(\"reconnect_attempt\", self.backoff.attempts);\n // check again for the case socket closed in above events\n if (self.skipReconnect)\n return;\n self.open((err) => {\n if (err) {\n self._reconnecting = false;\n self.reconnect();\n this.emitReserved(\"reconnect_error\", err);\n }\n else {\n self.onreconnect();\n }\n });\n }, delay);\n if (this.opts.autoUnref) {\n timer.unref();\n }\n this.subs.push(() => {\n this.clearTimeoutFn(timer);\n });\n }\n }\n /**\n * Called upon successful reconnect.\n *\n * @private\n */\n onreconnect() {\n const attempt = this.backoff.attempts;\n this._reconnecting = false;\n this.backoff.reset();\n this.emitReserved(\"reconnect\", attempt);\n }\n}\n","import { url } from \"./url.js\";\nimport { Manager } from \"./manager.js\";\nimport { Socket } from \"./socket.js\";\n/**\n * Managers cache.\n */\nconst cache = {};\nfunction lookup(uri, opts) {\n if (typeof uri === \"object\") {\n opts = uri;\n uri = undefined;\n }\n opts = opts || {};\n const parsed = url(uri, opts.path || \"/socket.io\");\n const source = parsed.source;\n const id = parsed.id;\n const path = parsed.path;\n const sameNamespace = cache[id] && path in cache[id][\"nsps\"];\n const newConnection = opts.forceNew ||\n opts[\"force new connection\"] ||\n false === opts.multiplex ||\n sameNamespace;\n let io;\n if (newConnection) {\n io = new Manager(source, opts);\n }\n else {\n if (!cache[id]) {\n cache[id] = new Manager(source, opts);\n }\n io = cache[id];\n }\n if (parsed.query && !opts.query) {\n opts.query = parsed.queryKey;\n }\n return io.socket(parsed.path, opts);\n}\n// so that \"lookup\" can be used both as a function (e.g. `io(...)`) and as a\n// namespace (e.g. `io.connect(...)`), for backward compatibility\nObject.assign(lookup, {\n Manager,\n Socket,\n io: lookup,\n connect: lookup,\n});\n/**\n * Protocol version.\n *\n * @public\n */\nexport { protocol } from \"socket.io-parser\";\n/**\n * Expose constructors for standalone build.\n *\n * @public\n */\nexport { Manager, Socket, lookup as io, lookup as connect, lookup as default, };\n","import { parse } from \"engine.io-client\";\n/**\n * URL parser.\n *\n * @param uri - url\n * @param path - the request path of the connection\n * @param loc - An object meant to mimic window.location.\n * Defaults to window.location.\n * @public\n */\nexport function url(uri, path = \"\", loc) {\n let obj = uri;\n // default to window.location\n loc = loc || (typeof location !== \"undefined\" && location);\n if (null == uri)\n uri = loc.protocol + \"//\" + loc.host;\n // relative path support\n if (typeof uri === \"string\") {\n if (\"/\" === uri.charAt(0)) {\n if (\"/\" === uri.charAt(1)) {\n uri = loc.protocol + uri;\n }\n else {\n uri = loc.host + uri;\n }\n }\n if (!/^(https?|wss?):\\/\\//.test(uri)) {\n if (\"undefined\" !== typeof loc) {\n uri = loc.protocol + \"//\" + uri;\n }\n else {\n uri = \"https://\" + uri;\n }\n }\n // parse\n obj = parse(uri);\n }\n // make sure we treat `localhost:80` and `localhost` equally\n if (!obj.port) {\n if (/^(http|ws)$/.test(obj.protocol)) {\n obj.port = \"80\";\n }\n else if (/^(http|ws)s$/.test(obj.protocol)) {\n obj.port = \"443\";\n }\n }\n obj.path = obj.path || \"/\";\n const ipv6 = obj.host.indexOf(\":\") !== -1;\n const host = ipv6 ? \"[\" + obj.host + \"]\" : obj.host;\n // define unique id\n obj.id = obj.protocol + \"://\" + host + \":\" + obj.port + path;\n // define href\n obj.href =\n obj.protocol +\n \"://\" +\n host +\n (loc && loc.port === obj.port ? \"\" : \":\" + obj.port);\n return obj;\n}\n","// -* - coding: utf - 8 -* -\n// Copyright(c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport React, { useEffect, useState } from 'react';\nimport Button from 'react-bootstrap/esm/Button';\nimport Spinner from 'react-bootstrap/Spinner';\nimport './Workloads.scss';\nimport moment from 'moment';\nimport { api } from './../../App';\nimport { io } from 'socket.io-client';\n\nexport default function Workloads({ setSelectedWorkload, selectedWorkload, setWarningText, setSelectedOp, setSelectedNode }) {\n const [workloads, setWorkloads] = useState([]);\n const [spinner, setSpinner] = useState(true);\n\n let socket = io('/');\n socket.on('Config update', data => {\n getWorkloads(false);\n });\n\n useEffect(() => {\n getWorkloads(true);\n }, []);\n\n let getWorkloads = (changeSelectedWorkload) => {\n api.get('api/workloads?token=' + localStorage.getItem('token'))\n .then(\n response => {\n if (changeSelectedWorkload) {\n setSelectedWorkload(response.data.workloads[0]);\n }\n setWorkloads(response.data.workloads);\n setSpinner(false);\n }\n )\n .catch(error => {\n setWarningText(error.message);\n setSpinner(false);\n });\n }\n\n let workloadsList = workloads.map(workload => {\n return (\n
{ setSelectedWorkload(workload); setSelectedOp(null); setSelectedNode(null) }}>\n \n
\n );\n });\n\n return (\n
\n {workloadsList.length > 0 &&\n
\n

Workloads

\n {workloadsList}\n
\n }\n {workloadsList.length === 0 &&\n
\n

Neural Insights

\n

Run diagnosis or profiling process to see workloads on this page.

\n
\n }\n {spinner &&\n
\n \n
\n }\n
\n )\n\n}","import classNames from 'classnames';\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport const propTypes = {\n /**\n * @default 'img'\n */\n bsPrefix: PropTypes.string,\n /**\n * Sets image as fluid image.\n */\n fluid: PropTypes.bool,\n /**\n * Sets image shape as rounded.\n */\n rounded: PropTypes.bool,\n /**\n * Sets image shape as circle.\n */\n roundedCircle: PropTypes.bool,\n /**\n * Sets image shape as thumbnail.\n */\n thumbnail: PropTypes.bool\n};\nconst Image = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n className,\n fluid = false,\n rounded = false,\n roundedCircle = false,\n thumbnail = false,\n ...props\n}, ref) => {\n bsPrefix = useBootstrapPrefix(bsPrefix, 'img');\n return /*#__PURE__*/_jsx(\"img\", {\n // eslint-disable-line jsx-a11y/alt-text\n ref: ref,\n ...props,\n className: classNames(className, fluid && `${bsPrefix}-fluid`, rounded && `rounded`, roundedCircle && `rounded-circle`, thumbnail && `${bsPrefix}-thumbnail`)\n });\n});\nImage.displayName = 'Image';\nexport default Image;","import * as React from 'react';\nexport class BsPrefixComponent extends React.Component {}\n\n// Need to use this instead of typeof Component to get proper type checking.\n\nexport function getOverlayDirection(placement, isRTL) {\n let bsDirection = placement;\n if (placement === 'left') {\n bsDirection = isRTL ? 'end' : 'start';\n } else if (placement === 'right') {\n bsDirection = isRTL ? 'start' : 'end';\n }\n return bsDirection;\n}","export default function getInitialPopperStyles(position = 'absolute') {\n return {\n position,\n top: '0',\n left: '0',\n opacity: '0',\n pointerEvents: 'none'\n };\n}","import classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix, useIsRTL } from './ThemeProvider';\nimport { getOverlayDirection } from './helpers';\nimport getInitialPopperStyles from './getInitialPopperStyles';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nimport { jsxs as _jsxs } from \"react/jsx-runtime\";\nconst Tooltip = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n placement = 'right',\n className,\n style,\n children,\n arrowProps,\n hasDoneInitialMeasure,\n popper,\n show,\n ...props\n}, ref) => {\n bsPrefix = useBootstrapPrefix(bsPrefix, 'tooltip');\n const isRTL = useIsRTL();\n const [primaryPlacement] = (placement == null ? void 0 : placement.split('-')) || [];\n const bsDirection = getOverlayDirection(primaryPlacement, isRTL);\n let computedStyle = style;\n if (show && !hasDoneInitialMeasure) {\n computedStyle = {\n ...style,\n ...getInitialPopperStyles(popper == null ? void 0 : popper.strategy)\n };\n }\n return /*#__PURE__*/_jsxs(\"div\", {\n ref: ref,\n style: computedStyle,\n role: \"tooltip\",\n \"x-placement\": primaryPlacement,\n className: classNames(className, bsPrefix, `bs-tooltip-${bsDirection}`),\n ...props,\n children: [/*#__PURE__*/_jsx(\"div\", {\n className: \"tooltip-arrow\",\n ...arrowProps\n }), /*#__PURE__*/_jsx(\"div\", {\n className: `${bsPrefix}-inner`,\n children: children\n })]\n });\n});\nTooltip.displayName = 'Tooltip';\nexport default Object.assign(Tooltip, {\n // Default tooltip offset.\n // https://github.com/twbs/bootstrap/blob/beca2a6c7f6bc88b6449339fc76edcda832c59e5/js/src/tooltip.js#L65\n TOOLTIP_OFFSET: [0, 6]\n});","/* eslint-disable no-bitwise, no-cond-assign */\n\n/**\n * Checks if an element contains another given element.\n * \n * @param context the context element\n * @param node the element to check\n */\nexport default function contains(context, node) {\n // HTML DOM and SVG DOM may have different support levels,\n // so we need to check on context instead of a document root element.\n if (context.contains) return context.contains(node);\n if (context.compareDocumentPosition) return context === node || !!(context.compareDocumentPosition(node) & 16);\n}","import { useRef, useEffect } from 'react';\n/**\n * Track whether a component is current mounted. Generally less preferable than\n * properlly canceling effects so they don't run after a component is unmounted,\n * but helpful in cases where that isn't feasible, such as a `Promise` resolution.\n *\n * @returns a function that returns the current isMounted state of the component\n *\n * ```ts\n * const [data, setData] = useState(null)\n * const isMounted = useMounted()\n *\n * useEffect(() => {\n * fetchdata().then((newData) => {\n * if (isMounted()) {\n * setData(newData);\n * }\n * })\n * })\n * ```\n */\n\nexport default function useMounted() {\n var mounted = useRef(true);\n var isMounted = useRef(function () {\n return mounted.current;\n });\n useEffect(function () {\n mounted.current = true;\n return function () {\n mounted.current = false;\n };\n }, []);\n return isMounted.current;\n}","import useUpdatedRef from './useUpdatedRef';\nimport { useEffect } from 'react';\n/**\n * Attach a callback that fires when a component unmounts\n *\n * @param fn Handler to run when the component unmounts\n * @category effects\n */\n\nexport default function useWillUnmount(fn) {\n var onUnmount = useUpdatedRef(fn);\n useEffect(function () {\n return function () {\n return onUnmount.current();\n };\n }, []);\n}","import { useRef } from 'react';\n/**\n * Returns a ref that is immediately updated with the new value\n *\n * @param value The Ref value\n * @category refs\n */\n\nexport default function useUpdatedRef(value) {\n var valueRef = useRef(value);\n valueRef.current = value;\n return valueRef;\n}","import { useMemo, useRef } from 'react';\nimport useMounted from './useMounted';\nimport useWillUnmount from './useWillUnmount';\n/*\n * Browsers including Internet Explorer, Chrome, Safari, and Firefox store the\n * delay as a 32-bit signed integer internally. This causes an integer overflow\n * when using delays larger than 2,147,483,647 ms (about 24.8 days),\n * resulting in the timeout being executed immediately.\n *\n * via: https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setTimeout\n */\n\nvar MAX_DELAY_MS = Math.pow(2, 31) - 1;\n\nfunction setChainedTimeout(handleRef, fn, timeoutAtMs) {\n var delayMs = timeoutAtMs - Date.now();\n handleRef.current = delayMs <= MAX_DELAY_MS ? setTimeout(fn, delayMs) : setTimeout(function () {\n return setChainedTimeout(handleRef, fn, timeoutAtMs);\n }, MAX_DELAY_MS);\n}\n/**\n * Returns a controller object for setting a timeout that is properly cleaned up\n * once the component unmounts. New timeouts cancel and replace existing ones.\n *\n *\n *\n * ```tsx\n * const { set, clear } = useTimeout();\n * const [hello, showHello] = useState(false);\n * //Display hello after 5 seconds\n * set(() => showHello(true), 5000);\n * return (\n *
\n * {hello ?

Hello

: null}\n *
\n * );\n * ```\n */\n\n\nexport default function useTimeout() {\n var isMounted = useMounted(); // types are confused between node and web here IDK\n\n var handleRef = useRef();\n useWillUnmount(function () {\n return clearTimeout(handleRef.current);\n });\n return useMemo(function () {\n var clear = function clear() {\n return clearTimeout(handleRef.current);\n };\n\n function set(fn, delayMs) {\n if (delayMs === void 0) {\n delayMs = 0;\n }\n\n if (!isMounted()) return;\n clear();\n\n if (delayMs <= MAX_DELAY_MS) {\n // For simplicity, if the timeout is short, just set a normal timeout.\n handleRef.current = setTimeout(fn, delayMs);\n } else {\n setChainedTimeout(handleRef, fn, Date.now() + delayMs);\n }\n }\n\n return {\n set: set,\n clear: clear\n };\n }, []);\n}","export default function _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}","import invariant from 'invariant';\n\nvar noop = function noop() {};\n\nfunction readOnlyPropType(handler, name) {\n return function (props, propName) {\n if (props[propName] !== undefined) {\n if (!props[handler]) {\n return new Error(\"You have provided a `\" + propName + \"` prop to `\" + name + \"` \" + (\"without an `\" + handler + \"` handler prop. This will render a read-only field. \") + (\"If the field should be mutable use `\" + defaultKey(propName) + \"`. \") + (\"Otherwise, set `\" + handler + \"`.\"));\n }\n }\n };\n}\n\nexport function uncontrolledPropTypes(controlledValues, displayName) {\n var propTypes = {};\n Object.keys(controlledValues).forEach(function (prop) {\n // add default propTypes for folks that use runtime checks\n propTypes[defaultKey(prop)] = noop;\n\n if (process.env.NODE_ENV !== 'production') {\n var handler = controlledValues[prop];\n !(typeof handler === 'string' && handler.trim().length) ? process.env.NODE_ENV !== \"production\" ? invariant(false, 'Uncontrollable - [%s]: the prop `%s` needs a valid handler key name in order to make it uncontrollable', displayName, prop) : invariant(false) : void 0;\n propTypes[prop] = readOnlyPropType(handler, displayName);\n }\n });\n return propTypes;\n}\nexport function isProp(props, prop) {\n return props[prop] !== undefined;\n}\nexport function defaultKey(key) {\n return 'default' + key.charAt(0).toUpperCase() + key.substr(1);\n}\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\nexport function canAcceptRef(component) {\n return !!component && (typeof component !== 'function' || component.prototype && component.prototype.isReactComponent);\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\n\nfunction _toPropertyKey(arg) { var key = _toPrimitive(arg, \"string\"); return typeof key === \"symbol\" ? key : String(key); }\n\nfunction _toPrimitive(input, hint) { if (typeof input !== \"object\" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || \"default\"); if (typeof res !== \"object\") return res; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (hint === \"string\" ? String : Number)(input); }\n\nimport { useCallback, useRef, useState } from 'react';\nimport * as Utils from './utils';\n\nfunction useUncontrolledProp(propValue, defaultValue, handler) {\n var wasPropRef = useRef(propValue !== undefined);\n\n var _useState = useState(defaultValue),\n stateValue = _useState[0],\n setState = _useState[1];\n\n var isProp = propValue !== undefined;\n var wasProp = wasPropRef.current;\n wasPropRef.current = isProp;\n /**\n * If a prop switches from controlled to Uncontrolled\n * reset its value to the defaultValue\n */\n\n if (!isProp && wasProp && stateValue !== defaultValue) {\n setState(defaultValue);\n }\n\n return [isProp ? propValue : stateValue, useCallback(function (value) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (handler) handler.apply(void 0, [value].concat(args));\n setState(value);\n }, [handler])];\n}\n\nexport { useUncontrolledProp };\nexport default function useUncontrolled(props, config) {\n return Object.keys(config).reduce(function (result, fieldName) {\n var _extends2;\n\n var _ref = result,\n defaultValue = _ref[Utils.defaultKey(fieldName)],\n propsValue = _ref[fieldName],\n rest = _objectWithoutPropertiesLoose(_ref, [Utils.defaultKey(fieldName), fieldName].map(_toPropertyKey));\n\n var handlerName = config[fieldName];\n\n var _useUncontrolledProp = useUncontrolledProp(propsValue, defaultValue, props[handlerName]),\n value = _useUncontrolledProp[0],\n handler = _useUncontrolledProp[1];\n\n return _extends({}, rest, (_extends2 = {}, _extends2[fieldName] = value, _extends2[handlerName] = handler, _extends2));\n }, props);\n}","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nfunction componentWillMount() {\n // Call this.constructor.gDSFP to support sub-classes.\n var state = this.constructor.getDerivedStateFromProps(this.props, this.state);\n if (state !== null && state !== undefined) {\n this.setState(state);\n }\n}\n\nfunction componentWillReceiveProps(nextProps) {\n // Call this.constructor.gDSFP to support sub-classes.\n // Use the setState() updater to ensure state isn't stale in certain edge cases.\n function updater(prevState) {\n var state = this.constructor.getDerivedStateFromProps(nextProps, prevState);\n return state !== null && state !== undefined ? state : null;\n }\n // Binding \"this\" is important for shallow renderer support.\n this.setState(updater.bind(this));\n}\n\nfunction componentWillUpdate(nextProps, nextState) {\n try {\n var prevProps = this.props;\n var prevState = this.state;\n this.props = nextProps;\n this.state = nextState;\n this.__reactInternalSnapshotFlag = true;\n this.__reactInternalSnapshot = this.getSnapshotBeforeUpdate(\n prevProps,\n prevState\n );\n } finally {\n this.props = prevProps;\n this.state = prevState;\n }\n}\n\n// React may warn about cWM/cWRP/cWU methods being deprecated.\n// Add a flag to suppress these warnings for this special case.\ncomponentWillMount.__suppressDeprecationWarning = true;\ncomponentWillReceiveProps.__suppressDeprecationWarning = true;\ncomponentWillUpdate.__suppressDeprecationWarning = true;\n\nfunction polyfill(Component) {\n var prototype = Component.prototype;\n\n if (!prototype || !prototype.isReactComponent) {\n throw new Error('Can only polyfill class components');\n }\n\n if (\n typeof Component.getDerivedStateFromProps !== 'function' &&\n typeof prototype.getSnapshotBeforeUpdate !== 'function'\n ) {\n return Component;\n }\n\n // If new component APIs are defined, \"unsafe\" lifecycles won't be called.\n // Error if any of these lifecycles are present,\n // Because they would work differently between older and newer (16.3+) versions of React.\n var foundWillMountName = null;\n var foundWillReceivePropsName = null;\n var foundWillUpdateName = null;\n if (typeof prototype.componentWillMount === 'function') {\n foundWillMountName = 'componentWillMount';\n } else if (typeof prototype.UNSAFE_componentWillMount === 'function') {\n foundWillMountName = 'UNSAFE_componentWillMount';\n }\n if (typeof prototype.componentWillReceiveProps === 'function') {\n foundWillReceivePropsName = 'componentWillReceiveProps';\n } else if (typeof prototype.UNSAFE_componentWillReceiveProps === 'function') {\n foundWillReceivePropsName = 'UNSAFE_componentWillReceiveProps';\n }\n if (typeof prototype.componentWillUpdate === 'function') {\n foundWillUpdateName = 'componentWillUpdate';\n } else if (typeof prototype.UNSAFE_componentWillUpdate === 'function') {\n foundWillUpdateName = 'UNSAFE_componentWillUpdate';\n }\n if (\n foundWillMountName !== null ||\n foundWillReceivePropsName !== null ||\n foundWillUpdateName !== null\n ) {\n var componentName = Component.displayName || Component.name;\n var newApiName =\n typeof Component.getDerivedStateFromProps === 'function'\n ? 'getDerivedStateFromProps()'\n : 'getSnapshotBeforeUpdate()';\n\n throw Error(\n 'Unsafe legacy lifecycles will not be called for components using new component APIs.\\n\\n' +\n componentName +\n ' uses ' +\n newApiName +\n ' but also contains the following legacy lifecycles:' +\n (foundWillMountName !== null ? '\\n ' + foundWillMountName : '') +\n (foundWillReceivePropsName !== null\n ? '\\n ' + foundWillReceivePropsName\n : '') +\n (foundWillUpdateName !== null ? '\\n ' + foundWillUpdateName : '') +\n '\\n\\nThe above lifecycles should be removed. Learn more about this warning here:\\n' +\n 'https://fb.me/react-async-component-lifecycle-hooks'\n );\n }\n\n // React <= 16.2 does not support static getDerivedStateFromProps.\n // As a workaround, use cWM and cWRP to invoke the new static lifecycle.\n // Newer versions of React will ignore these lifecycles if gDSFP exists.\n if (typeof Component.getDerivedStateFromProps === 'function') {\n prototype.componentWillMount = componentWillMount;\n prototype.componentWillReceiveProps = componentWillReceiveProps;\n }\n\n // React <= 16.2 does not support getSnapshotBeforeUpdate.\n // As a workaround, use cWU to invoke the new lifecycle.\n // Newer versions of React will ignore that lifecycle if gSBU exists.\n if (typeof prototype.getSnapshotBeforeUpdate === 'function') {\n if (typeof prototype.componentDidUpdate !== 'function') {\n throw new Error(\n 'Cannot polyfill getSnapshotBeforeUpdate() for components that do not define componentDidUpdate() on the prototype'\n );\n }\n\n prototype.componentWillUpdate = componentWillUpdate;\n\n var componentDidUpdate = prototype.componentDidUpdate;\n\n prototype.componentDidUpdate = function componentDidUpdatePolyfill(\n prevProps,\n prevState,\n maybeSnapshot\n ) {\n // 16.3+ will not execute our will-update method;\n // It will pass a snapshot value to did-update though.\n // Older versions will require our polyfilled will-update value.\n // We need to handle both cases, but can't just check for the presence of \"maybeSnapshot\",\n // Because for <= 15.x versions this might be a \"prevContext\" object.\n // We also can't just check \"__reactInternalSnapshot\",\n // Because get-snapshot might return a falsy value.\n // So check for the explicit __reactInternalSnapshotFlag flag to determine behavior.\n var snapshot = this.__reactInternalSnapshotFlag\n ? this.__reactInternalSnapshot\n : maybeSnapshot;\n\n componentDidUpdate.call(this, prevProps, prevState, snapshot);\n };\n }\n\n return Component;\n}\n\nexport { polyfill };\n","import { useMemo } from 'react';\n\nvar toFnRef = function toFnRef(ref) {\n return !ref || typeof ref === 'function' ? ref : function (value) {\n ref.current = value;\n };\n};\n\nexport function mergeRefs(refA, refB) {\n var a = toFnRef(refA);\n var b = toFnRef(refB);\n return function (value) {\n if (a) a(value);\n if (b) b(value);\n };\n}\n/**\n * Create and returns a single callback ref composed from two other Refs.\n *\n * ```tsx\n * const Button = React.forwardRef((props, ref) => {\n * const [element, attachRef] = useCallbackRef();\n * const mergedRef = useMergedRefs(ref, attachRef);\n *\n * return \n * \n * );\n * }\n * ```\n *\n * When the button is clicked the component will shift to the `'entering'` state\n * and stay there for 500ms (the value of `timeout`) before it finally switches\n * to `'entered'`.\n *\n * When `in` is `false` the same thing happens except the state moves from\n * `'exiting'` to `'exited'`.\n */\n\nvar Transition = /*#__PURE__*/function (_React$Component) {\n _inheritsLoose(Transition, _React$Component);\n\n function Transition(props, context) {\n var _this;\n\n _this = _React$Component.call(this, props, context) || this;\n var parentGroup = context; // In the context of a TransitionGroup all enters are really appears\n\n var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;\n var initialStatus;\n _this.appearStatus = null;\n\n if (props.in) {\n if (appear) {\n initialStatus = EXITED;\n _this.appearStatus = ENTERING;\n } else {\n initialStatus = ENTERED;\n }\n } else {\n if (props.unmountOnExit || props.mountOnEnter) {\n initialStatus = UNMOUNTED;\n } else {\n initialStatus = EXITED;\n }\n }\n\n _this.state = {\n status: initialStatus\n };\n _this.nextCallback = null;\n return _this;\n }\n\n Transition.getDerivedStateFromProps = function getDerivedStateFromProps(_ref, prevState) {\n var nextIn = _ref.in;\n\n if (nextIn && prevState.status === UNMOUNTED) {\n return {\n status: EXITED\n };\n }\n\n return null;\n } // getSnapshotBeforeUpdate(prevProps) {\n // let nextStatus = null\n // if (prevProps !== this.props) {\n // const { status } = this.state\n // if (this.props.in) {\n // if (status !== ENTERING && status !== ENTERED) {\n // nextStatus = ENTERING\n // }\n // } else {\n // if (status === ENTERING || status === ENTERED) {\n // nextStatus = EXITING\n // }\n // }\n // }\n // return { nextStatus }\n // }\n ;\n\n var _proto = Transition.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n this.updateStatus(true, this.appearStatus);\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var nextStatus = null;\n\n if (prevProps !== this.props) {\n var status = this.state.status;\n\n if (this.props.in) {\n if (status !== ENTERING && status !== ENTERED) {\n nextStatus = ENTERING;\n }\n } else {\n if (status === ENTERING || status === ENTERED) {\n nextStatus = EXITING;\n }\n }\n }\n\n this.updateStatus(false, nextStatus);\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n this.cancelNextCallback();\n };\n\n _proto.getTimeouts = function getTimeouts() {\n var timeout = this.props.timeout;\n var exit, enter, appear;\n exit = enter = appear = timeout;\n\n if (timeout != null && typeof timeout !== 'number') {\n exit = timeout.exit;\n enter = timeout.enter; // TODO: remove fallback for next major\n\n appear = timeout.appear !== undefined ? timeout.appear : enter;\n }\n\n return {\n exit: exit,\n enter: enter,\n appear: appear\n };\n };\n\n _proto.updateStatus = function updateStatus(mounting, nextStatus) {\n if (mounting === void 0) {\n mounting = false;\n }\n\n if (nextStatus !== null) {\n // nextStatus will always be ENTERING or EXITING.\n this.cancelNextCallback();\n\n if (nextStatus === ENTERING) {\n if (this.props.unmountOnExit || this.props.mountOnEnter) {\n var node = this.props.nodeRef ? this.props.nodeRef.current : ReactDOM.findDOMNode(this); // https://github.com/reactjs/react-transition-group/pull/749\n // With unmountOnExit or mountOnEnter, the enter animation should happen at the transition between `exited` and `entering`.\n // To make the animation happen, we have to separate each rendering and avoid being processed as batched.\n\n if (node) forceReflow(node);\n }\n\n this.performEnter(mounting);\n } else {\n this.performExit();\n }\n } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n this.setState({\n status: UNMOUNTED\n });\n }\n };\n\n _proto.performEnter = function performEnter(mounting) {\n var _this2 = this;\n\n var enter = this.props.enter;\n var appearing = this.context ? this.context.isMounting : mounting;\n\n var _ref2 = this.props.nodeRef ? [appearing] : [ReactDOM.findDOMNode(this), appearing],\n maybeNode = _ref2[0],\n maybeAppearing = _ref2[1];\n\n var timeouts = this.getTimeouts();\n var enterTimeout = appearing ? timeouts.appear : timeouts.enter; // no enter animation skip right to ENTERED\n // if we are mounting and running this it means appear _must_ be set\n\n if (!mounting && !enter || config.disabled) {\n this.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(maybeNode);\n });\n return;\n }\n\n this.props.onEnter(maybeNode, maybeAppearing);\n this.safeSetState({\n status: ENTERING\n }, function () {\n _this2.props.onEntering(maybeNode, maybeAppearing);\n\n _this2.onTransitionEnd(enterTimeout, function () {\n _this2.safeSetState({\n status: ENTERED\n }, function () {\n _this2.props.onEntered(maybeNode, maybeAppearing);\n });\n });\n });\n };\n\n _proto.performExit = function performExit() {\n var _this3 = this;\n\n var exit = this.props.exit;\n var timeouts = this.getTimeouts();\n var maybeNode = this.props.nodeRef ? undefined : ReactDOM.findDOMNode(this); // no exit animation skip right to EXITED\n\n if (!exit || config.disabled) {\n this.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(maybeNode);\n });\n return;\n }\n\n this.props.onExit(maybeNode);\n this.safeSetState({\n status: EXITING\n }, function () {\n _this3.props.onExiting(maybeNode);\n\n _this3.onTransitionEnd(timeouts.exit, function () {\n _this3.safeSetState({\n status: EXITED\n }, function () {\n _this3.props.onExited(maybeNode);\n });\n });\n });\n };\n\n _proto.cancelNextCallback = function cancelNextCallback() {\n if (this.nextCallback !== null) {\n this.nextCallback.cancel();\n this.nextCallback = null;\n }\n };\n\n _proto.safeSetState = function safeSetState(nextState, callback) {\n // This shouldn't be necessary, but there are weird race conditions with\n // setState callbacks and unmounting in testing, so always make sure that\n // we can cancel any pending setState callbacks after we unmount.\n callback = this.setNextCallback(callback);\n this.setState(nextState, callback);\n };\n\n _proto.setNextCallback = function setNextCallback(callback) {\n var _this4 = this;\n\n var active = true;\n\n this.nextCallback = function (event) {\n if (active) {\n active = false;\n _this4.nextCallback = null;\n callback(event);\n }\n };\n\n this.nextCallback.cancel = function () {\n active = false;\n };\n\n return this.nextCallback;\n };\n\n _proto.onTransitionEnd = function onTransitionEnd(timeout, handler) {\n this.setNextCallback(handler);\n var node = this.props.nodeRef ? this.props.nodeRef.current : ReactDOM.findDOMNode(this);\n var doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener;\n\n if (!node || doesNotHaveTimeoutOrListener) {\n setTimeout(this.nextCallback, 0);\n return;\n }\n\n if (this.props.addEndListener) {\n var _ref3 = this.props.nodeRef ? [this.nextCallback] : [node, this.nextCallback],\n maybeNode = _ref3[0],\n maybeNextCallback = _ref3[1];\n\n this.props.addEndListener(maybeNode, maybeNextCallback);\n }\n\n if (timeout != null) {\n setTimeout(this.nextCallback, timeout);\n }\n };\n\n _proto.render = function render() {\n var status = this.state.status;\n\n if (status === UNMOUNTED) {\n return null;\n }\n\n var _this$props = this.props,\n children = _this$props.children,\n _in = _this$props.in,\n _mountOnEnter = _this$props.mountOnEnter,\n _unmountOnExit = _this$props.unmountOnExit,\n _appear = _this$props.appear,\n _enter = _this$props.enter,\n _exit = _this$props.exit,\n _timeout = _this$props.timeout,\n _addEndListener = _this$props.addEndListener,\n _onEnter = _this$props.onEnter,\n _onEntering = _this$props.onEntering,\n _onEntered = _this$props.onEntered,\n _onExit = _this$props.onExit,\n _onExiting = _this$props.onExiting,\n _onExited = _this$props.onExited,\n _nodeRef = _this$props.nodeRef,\n childProps = _objectWithoutPropertiesLoose(_this$props, [\"children\", \"in\", \"mountOnEnter\", \"unmountOnExit\", \"appear\", \"enter\", \"exit\", \"timeout\", \"addEndListener\", \"onEnter\", \"onEntering\", \"onEntered\", \"onExit\", \"onExiting\", \"onExited\", \"nodeRef\"]);\n\n return (\n /*#__PURE__*/\n // allows for nested Transitions\n React.createElement(TransitionGroupContext.Provider, {\n value: null\n }, typeof children === 'function' ? children(status, childProps) : React.cloneElement(React.Children.only(children), childProps))\n );\n };\n\n return Transition;\n}(React.Component);\n\nTransition.contextType = TransitionGroupContext;\nTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n /**\n * A React reference to DOM element that need to transition:\n * https://stackoverflow.com/a/51127130/4671932\n *\n * - When `nodeRef` prop is used, `node` is not passed to callback functions\n * (e.g. `onEnter`) because user already has direct access to the node.\n * - When changing `key` prop of `Transition` in a `TransitionGroup` a new\n * `nodeRef` need to be provided to `Transition` with changed `key` prop\n * (see\n * [test/CSSTransition-test.js](https://github.com/reactjs/react-transition-group/blob/13435f897b3ab71f6e19d724f145596f5910581c/test/CSSTransition-test.js#L362-L437)).\n */\n nodeRef: PropTypes.shape({\n current: typeof Element === 'undefined' ? PropTypes.any : function (propValue, key, componentName, location, propFullName, secret) {\n var value = propValue[key];\n return PropTypes.instanceOf(value && 'ownerDocument' in value ? value.ownerDocument.defaultView.Element : Element)(propValue, key, componentName, location, propFullName, secret);\n }\n }),\n\n /**\n * A `function` child can be used instead of a React element. This function is\n * called with the current transition status (`'entering'`, `'entered'`,\n * `'exiting'`, `'exited'`), which can be used to apply context\n * specific props to a component.\n *\n * ```jsx\n * \n * {state => (\n * \n * )}\n * \n * ```\n */\n children: PropTypes.oneOfType([PropTypes.func.isRequired, PropTypes.element.isRequired]).isRequired,\n\n /**\n * Show the component; triggers the enter or exit states\n */\n in: PropTypes.bool,\n\n /**\n * By default the child component is mounted immediately along with\n * the parent `Transition` component. If you want to \"lazy mount\" the component on the\n * first `in={true}` you can set `mountOnEnter`. After the first enter transition the component will stay\n * mounted, even on \"exited\", unless you also specify `unmountOnExit`.\n */\n mountOnEnter: PropTypes.bool,\n\n /**\n * By default the child component stays mounted after it reaches the `'exited'` state.\n * Set `unmountOnExit` if you'd prefer to unmount the component after it finishes exiting.\n */\n unmountOnExit: PropTypes.bool,\n\n /**\n * By default the child component does not perform the enter transition when\n * it first mounts, regardless of the value of `in`. If you want this\n * behavior, set both `appear` and `in` to `true`.\n *\n * > **Note**: there are no special appear states like `appearing`/`appeared`, this prop\n * > only adds an additional enter transition. However, in the\n * > `` component that first enter transition does result in\n * > additional `.appear-*` classes, that way you can choose to style it\n * > differently.\n */\n appear: PropTypes.bool,\n\n /**\n * Enable or disable enter transitions.\n */\n enter: PropTypes.bool,\n\n /**\n * Enable or disable exit transitions.\n */\n exit: PropTypes.bool,\n\n /**\n * The duration of the transition, in milliseconds.\n * Required unless `addEndListener` is provided.\n *\n * You may specify a single timeout for all transitions:\n *\n * ```jsx\n * timeout={500}\n * ```\n *\n * or individually:\n *\n * ```jsx\n * timeout={{\n * appear: 500,\n * enter: 300,\n * exit: 500,\n * }}\n * ```\n *\n * - `appear` defaults to the value of `enter`\n * - `enter` defaults to `0`\n * - `exit` defaults to `0`\n *\n * @type {number | { enter?: number, exit?: number, appear?: number }}\n */\n timeout: function timeout(props) {\n var pt = timeoutsShape;\n if (!props.addEndListener) pt = pt.isRequired;\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return pt.apply(void 0, [props].concat(args));\n },\n\n /**\n * Add a custom transition end trigger. Called with the transitioning\n * DOM node and a `done` callback. Allows for more fine grained transition end\n * logic. Timeouts are still used as a fallback if provided.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * ```jsx\n * addEndListener={(node, done) => {\n * // use the css transitionend event to mark the finish of a transition\n * node.addEventListener('transitionend', done, false);\n * }}\n * ```\n */\n addEndListener: PropTypes.func,\n\n /**\n * Callback fired before the \"entering\" status is applied. An extra parameter\n * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEnter: PropTypes.func,\n\n /**\n * Callback fired after the \"entering\" status is applied. An extra parameter\n * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool)\n */\n onEntering: PropTypes.func,\n\n /**\n * Callback fired after the \"entered\" status is applied. An extra parameter\n * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement, isAppearing: bool) -> void\n */\n onEntered: PropTypes.func,\n\n /**\n * Callback fired before the \"exiting\" status is applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExit: PropTypes.func,\n\n /**\n * Callback fired after the \"exiting\" status is applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed.\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExiting: PropTypes.func,\n\n /**\n * Callback fired after the \"exited\" status is applied.\n *\n * **Note**: when `nodeRef` prop is passed, `node` is not passed\n *\n * @type Function(node: HtmlElement) -> void\n */\n onExited: PropTypes.func\n} : {}; // Name the function so it is clearer in the documentation\n\nfunction noop() {}\n\nTransition.defaultProps = {\n in: false,\n mountOnEnter: false,\n unmountOnExit: false,\n appear: false,\n enter: true,\n exit: true,\n onEnter: noop,\n onEntering: noop,\n onEntered: noop,\n onExit: noop,\n onExiting: noop,\n onExited: noop\n};\nTransition.UNMOUNTED = UNMOUNTED;\nTransition.EXITED = EXITED;\nTransition.ENTERING = ENTERING;\nTransition.ENTERED = ENTERED;\nTransition.EXITING = EXITING;\nexport default Transition;","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","export var forceReflow = function forceReflow(node) {\n return node.scrollTop;\n};","import ownerWindow from './ownerWindow';\n/**\n * Returns one or all computed style properties of an element.\n * \n * @param node the element\n * @param psuedoElement the style property\n */\n\nexport default function getComputedStyle(node, psuedoElement) {\n return ownerWindow(node).getComputedStyle(node, psuedoElement);\n}","import ownerDocument from './ownerDocument';\n/**\n * Returns the owner window of a given element.\n * \n * @param node the element\n */\n\nexport default function ownerWindow(node) {\n var doc = ownerDocument(node);\n return doc && doc.defaultView || window;\n}","var rUpper = /([A-Z])/g;\nexport default function hyphenate(string) {\n return string.replace(rUpper, '-$1').toLowerCase();\n}","/**\n * Copyright 2013-2014, Facebook, Inc.\n * All rights reserved.\n * https://github.com/facebook/react/blob/2aeb8a2a6beb00617a4217f7f8284924fa2ad819/src/vendor/core/hyphenateStyleName.js\n */\nimport hyphenate from './hyphenate';\nvar msPattern = /^ms-/;\nexport default function hyphenateStyleName(string) {\n return hyphenate(string).replace(msPattern, '-ms-');\n}","var supportedTransforms = /^((translate|rotate|scale)(X|Y|Z|3d)?|matrix(3d)?|perspective|skew(X|Y)?)$/i;\nexport default function isTransform(value) {\n return !!(value && supportedTransforms.test(value));\n}","import getComputedStyle from './getComputedStyle';\nimport hyphenate from './hyphenateStyle';\nimport isTransform from './isTransform';\n\nfunction style(node, property) {\n var css = '';\n var transforms = '';\n\n if (typeof property === 'string') {\n return node.style.getPropertyValue(hyphenate(property)) || getComputedStyle(node).getPropertyValue(hyphenate(property));\n }\n\n Object.keys(property).forEach(function (key) {\n var value = property[key];\n\n if (!value && value !== 0) {\n node.style.removeProperty(hyphenate(key));\n } else if (isTransform(key)) {\n transforms += key + \"(\" + value + \") \";\n } else {\n css += hyphenate(key) + \": \" + value + \";\";\n }\n });\n\n if (transforms) {\n css += \"transform: \" + transforms + \";\";\n }\n\n node.style.cssText += \";\" + css;\n}\n\nexport default style;","import css from './css';\nimport listen from './listen';\nimport triggerEvent from './triggerEvent';\n\nfunction parseDuration(node) {\n var str = css(node, 'transitionDuration') || '';\n var mult = str.indexOf('ms') === -1 ? 1000 : 1;\n return parseFloat(str) * mult;\n}\n\nfunction emulateTransitionEnd(element, duration, padding) {\n if (padding === void 0) {\n padding = 5;\n }\n\n var called = false;\n var handle = setTimeout(function () {\n if (!called) triggerEvent(element, 'transitionend', true);\n }, duration + padding);\n var remove = listen(element, 'transitionend', function () {\n called = true;\n }, {\n once: true\n });\n return function () {\n clearTimeout(handle);\n remove();\n };\n}\n\nexport default function transitionEnd(element, handler, duration, padding) {\n if (duration == null) duration = parseDuration(element) || 0;\n var removeEmulate = emulateTransitionEnd(element, duration, padding);\n var remove = listen(element, 'transitionend', handler);\n return function () {\n removeEmulate();\n remove();\n };\n}","/**\n * Triggers an event on a given element.\n * \n * @param node the element\n * @param eventName the event name to trigger\n * @param bubbles whether the event should bubble up\n * @param cancelable whether the event should be cancelable\n */\nexport default function triggerEvent(node, eventName, bubbles, cancelable) {\n if (bubbles === void 0) {\n bubbles = false;\n }\n\n if (cancelable === void 0) {\n cancelable = true;\n }\n\n if (node) {\n var event = document.createEvent('HTMLEvents');\n event.initEvent(eventName, bubbles, cancelable);\n node.dispatchEvent(event);\n }\n}","import css from 'dom-helpers/css';\nimport transitionEnd from 'dom-helpers/transitionEnd';\nfunction parseDuration(node, property) {\n const str = css(node, property) || '';\n const mult = str.indexOf('ms') === -1 ? 1000 : 1;\n return parseFloat(str) * mult;\n}\nexport default function transitionEndListener(element, handler) {\n const duration = parseDuration(element, 'transitionDuration');\n const delay = parseDuration(element, 'transitionDelay');\n const remove = transitionEnd(element, e => {\n if (e.target === element) {\n remove();\n handler(e);\n }\n }, duration + delay);\n}","import ReactDOM from 'react-dom';\nexport default function safeFindDOMNode(componentOrElement) {\n if (componentOrElement && 'setState' in componentOrElement) {\n return ReactDOM.findDOMNode(componentOrElement);\n }\n return componentOrElement != null ? componentOrElement : null;\n}","import React, { useCallback, useRef } from 'react';\nimport Transition from 'react-transition-group/Transition';\nimport useMergedRefs from '@restart/hooks/useMergedRefs';\nimport safeFindDOMNode from './safeFindDOMNode';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\n// Normalizes Transition callbacks when nodeRef is used.\nconst TransitionWrapper = /*#__PURE__*/React.forwardRef(({\n onEnter,\n onEntering,\n onEntered,\n onExit,\n onExiting,\n onExited,\n addEndListener,\n children,\n childRef,\n ...props\n}, ref) => {\n const nodeRef = useRef(null);\n const mergedRef = useMergedRefs(nodeRef, childRef);\n const attachRef = r => {\n mergedRef(safeFindDOMNode(r));\n };\n const normalize = callback => param => {\n if (callback && nodeRef.current) {\n callback(nodeRef.current, param);\n }\n };\n\n /* eslint-disable react-hooks/exhaustive-deps */\n const handleEnter = useCallback(normalize(onEnter), [onEnter]);\n const handleEntering = useCallback(normalize(onEntering), [onEntering]);\n const handleEntered = useCallback(normalize(onEntered), [onEntered]);\n const handleExit = useCallback(normalize(onExit), [onExit]);\n const handleExiting = useCallback(normalize(onExiting), [onExiting]);\n const handleExited = useCallback(normalize(onExited), [onExited]);\n const handleAddEndListener = useCallback(normalize(addEndListener), [addEndListener]);\n /* eslint-enable react-hooks/exhaustive-deps */\n\n return /*#__PURE__*/_jsx(Transition, {\n ref: ref,\n ...props,\n onEnter: handleEnter,\n onEntered: handleEntered,\n onEntering: handleEntering,\n onExit: handleExit,\n onExited: handleExited,\n onExiting: handleExiting,\n addEndListener: handleAddEndListener,\n nodeRef: nodeRef,\n children: typeof children === 'function' ? (status, innerProps) =>\n // TODO: Types for RTG missing innerProps, so need to cast.\n children(status, {\n ...innerProps,\n ref: attachRef\n }) : /*#__PURE__*/React.cloneElement(children, {\n ref: attachRef\n })\n });\n});\nexport default TransitionWrapper;","import classNames from 'classnames';\nimport * as React from 'react';\nimport { useCallback } from 'react';\nimport { ENTERED, ENTERING } from 'react-transition-group/Transition';\nimport transitionEndListener from './transitionEndListener';\nimport triggerBrowserReflow from './triggerBrowserReflow';\nimport TransitionWrapper from './TransitionWrapper';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst fadeStyles = {\n [ENTERING]: 'show',\n [ENTERED]: 'show'\n};\nconst Fade = /*#__PURE__*/React.forwardRef(({\n className,\n children,\n transitionClasses = {},\n onEnter,\n ...rest\n}, ref) => {\n const props = {\n in: false,\n timeout: 300,\n mountOnEnter: false,\n unmountOnExit: false,\n appear: false,\n ...rest\n };\n const handleEnter = useCallback((node, isAppearing) => {\n triggerBrowserReflow(node);\n onEnter == null ? void 0 : onEnter(node, isAppearing);\n }, [onEnter]);\n return /*#__PURE__*/_jsx(TransitionWrapper, {\n ref: ref,\n addEndListener: transitionEndListener,\n ...props,\n onEnter: handleEnter,\n childRef: children.ref,\n children: (status, innerProps) => /*#__PURE__*/React.cloneElement(children, {\n ...innerProps,\n className: classNames('fade', className, children.props.className, fadeStyles[status], transitionClasses[status])\n })\n });\n});\nFade.displayName = 'Fade';\nexport default Fade;","// reading a dimension prop will cause the browser to recalculate,\n// which will let our animations work\nexport default function triggerBrowserReflow(node) {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n node.offsetHeight;\n}","import * as React from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport classNames from 'classnames';\nimport BaseOverlay from '@restart/ui/Overlay';\nimport useEventCallback from '@restart/hooks/useEventCallback';\nimport useIsomorphicEffect from '@restart/hooks/useIsomorphicEffect';\nimport useMergedRefs from '@restart/hooks/useMergedRefs';\nimport useOverlayOffset from './useOverlayOffset';\nimport Fade from './Fade';\nimport safeFindDOMNode from './safeFindDOMNode';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nfunction wrapRefs(props, arrowProps) {\n const {\n ref\n } = props;\n const {\n ref: aRef\n } = arrowProps;\n props.ref = ref.__wrapped || (ref.__wrapped = r => ref(safeFindDOMNode(r)));\n arrowProps.ref = aRef.__wrapped || (aRef.__wrapped = r => aRef(safeFindDOMNode(r)));\n}\nconst Overlay = /*#__PURE__*/React.forwardRef(({\n children: overlay,\n transition = Fade,\n popperConfig = {},\n rootClose = false,\n placement = 'top',\n show: outerShow = false,\n ...outerProps\n}, outerRef) => {\n const popperRef = useRef({});\n const [firstRenderedState, setFirstRenderedState] = useState(null);\n const [ref, modifiers] = useOverlayOffset(outerProps.offset);\n const mergedRef = useMergedRefs(outerRef, ref);\n const actualTransition = transition === true ? Fade : transition || undefined;\n const handleFirstUpdate = useEventCallback(state => {\n setFirstRenderedState(state);\n popperConfig == null ? void 0 : popperConfig.onFirstUpdate == null ? void 0 : popperConfig.onFirstUpdate(state);\n });\n useIsomorphicEffect(() => {\n if (firstRenderedState) {\n popperRef.current.scheduleUpdate == null ? void 0 : popperRef.current.scheduleUpdate();\n }\n }, [firstRenderedState]);\n useEffect(() => {\n if (!outerShow) {\n setFirstRenderedState(null);\n }\n }, [outerShow]);\n return /*#__PURE__*/_jsx(BaseOverlay, {\n ...outerProps,\n ref: mergedRef,\n popperConfig: {\n ...popperConfig,\n modifiers: modifiers.concat(popperConfig.modifiers || []),\n onFirstUpdate: handleFirstUpdate\n },\n transition: actualTransition,\n rootClose: rootClose,\n placement: placement,\n show: outerShow,\n children: (overlayProps, {\n arrowProps,\n popper: popperObj,\n show\n }) => {\n var _popperObj$state, _popperObj$state$modi;\n wrapRefs(overlayProps, arrowProps);\n // Need to get placement from popper object, handling case when overlay is flipped using 'flip' prop\n const updatedPlacement = popperObj == null ? void 0 : popperObj.placement;\n const popper = Object.assign(popperRef.current, {\n state: popperObj == null ? void 0 : popperObj.state,\n scheduleUpdate: popperObj == null ? void 0 : popperObj.update,\n placement: updatedPlacement,\n outOfBoundaries: (popperObj == null ? void 0 : (_popperObj$state = popperObj.state) == null ? void 0 : (_popperObj$state$modi = _popperObj$state.modifiersData.hide) == null ? void 0 : _popperObj$state$modi.isReferenceHidden) || false,\n strategy: popperConfig.strategy\n });\n const hasDoneInitialMeasure = !!firstRenderedState;\n if (typeof overlay === 'function') return overlay({\n ...overlayProps,\n placement: updatedPlacement,\n show,\n ...(!transition && show && {\n className: 'show'\n }),\n popper,\n arrowProps,\n hasDoneInitialMeasure\n });\n return /*#__PURE__*/React.cloneElement(overlay, {\n ...overlayProps,\n placement: updatedPlacement,\n arrowProps,\n popper,\n hasDoneInitialMeasure,\n className: classNames(overlay.props.className, !transition && show && 'show'),\n style: {\n ...overlay.props.style,\n ...overlayProps.style\n }\n });\n }\n });\n});\nOverlay.displayName = 'Overlay';\nexport default Overlay;","import { useMemo, useRef } from 'react';\nimport hasClass from 'dom-helpers/hasClass';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport Popover from './Popover';\nimport Tooltip from './Tooltip';\n\n// This is meant for internal use.\n// This applies a custom offset to the overlay if it's a popover or tooltip.\nexport default function useOverlayOffset(customOffset) {\n const overlayRef = useRef(null);\n const popoverClass = useBootstrapPrefix(undefined, 'popover');\n const tooltipClass = useBootstrapPrefix(undefined, 'tooltip');\n const offset = useMemo(() => ({\n name: 'offset',\n options: {\n offset: () => {\n if (customOffset) {\n return customOffset;\n }\n if (overlayRef.current) {\n if (hasClass(overlayRef.current, popoverClass)) {\n return Popover.POPPER_OFFSET;\n }\n if (hasClass(overlayRef.current, tooltipClass)) {\n return Tooltip.TOOLTIP_OFFSET;\n }\n }\n return [0, 0];\n }\n }\n }), [customOffset, popoverClass, tooltipClass]);\n return [overlayRef, [offset]];\n}","import contains from 'dom-helpers/contains';\nimport * as React from 'react';\nimport { cloneElement, useCallback, useRef } from 'react';\nimport useTimeout from '@restart/hooks/useTimeout';\nimport warning from 'warning';\nimport { useUncontrolledProp } from 'uncontrollable';\nimport useMergedRefs from '@restart/hooks/useMergedRefs';\nimport Overlay from './Overlay';\nimport safeFindDOMNode from './safeFindDOMNode';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nimport { Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { jsxs as _jsxs } from \"react/jsx-runtime\";\nfunction normalizeDelay(delay) {\n return delay && typeof delay === 'object' ? delay : {\n show: delay,\n hide: delay\n };\n}\n\n// Simple implementation of mouseEnter and mouseLeave.\n// React's built version is broken: https://github.com/facebook/react/issues/4251\n// for cases when the trigger is disabled and mouseOut/Over can cause flicker\n// moving from one child element to another.\nfunction handleMouseOverOut(\n// eslint-disable-next-line @typescript-eslint/no-shadow\nhandler, args, relatedNative) {\n const [e] = args;\n const target = e.currentTarget;\n const related = e.relatedTarget || e.nativeEvent[relatedNative];\n if ((!related || related !== target) && !contains(target, related)) {\n handler(...args);\n }\n}\nfunction OverlayTrigger({\n trigger = ['hover', 'focus'],\n overlay,\n children,\n popperConfig = {},\n show: propsShow,\n defaultShow = false,\n onToggle,\n delay: propsDelay,\n placement,\n flip = placement && placement.indexOf('auto') !== -1,\n ...props\n}) {\n const triggerNodeRef = useRef(null);\n const mergedRef = useMergedRefs(triggerNodeRef, children.ref);\n const timeout = useTimeout();\n const hoverStateRef = useRef('');\n const [show, setShow] = useUncontrolledProp(propsShow, defaultShow, onToggle);\n const delay = normalizeDelay(propsDelay);\n const {\n onFocus,\n onBlur,\n onClick\n } = typeof children !== 'function' ? React.Children.only(children).props : {};\n const attachRef = r => {\n mergedRef(safeFindDOMNode(r));\n };\n const handleShow = useCallback(() => {\n timeout.clear();\n hoverStateRef.current = 'show';\n if (!delay.show) {\n setShow(true);\n return;\n }\n timeout.set(() => {\n if (hoverStateRef.current === 'show') setShow(true);\n }, delay.show);\n }, [delay.show, setShow, timeout]);\n const handleHide = useCallback(() => {\n timeout.clear();\n hoverStateRef.current = 'hide';\n if (!delay.hide) {\n setShow(false);\n return;\n }\n timeout.set(() => {\n if (hoverStateRef.current === 'hide') setShow(false);\n }, delay.hide);\n }, [delay.hide, setShow, timeout]);\n const handleFocus = useCallback((...args) => {\n handleShow();\n onFocus == null ? void 0 : onFocus(...args);\n }, [handleShow, onFocus]);\n const handleBlur = useCallback((...args) => {\n handleHide();\n onBlur == null ? void 0 : onBlur(...args);\n }, [handleHide, onBlur]);\n const handleClick = useCallback((...args) => {\n setShow(!show);\n onClick == null ? void 0 : onClick(...args);\n }, [onClick, setShow, show]);\n const handleMouseOver = useCallback((...args) => {\n handleMouseOverOut(handleShow, args, 'fromElement');\n }, [handleShow]);\n const handleMouseOut = useCallback((...args) => {\n handleMouseOverOut(handleHide, args, 'toElement');\n }, [handleHide]);\n const triggers = trigger == null ? [] : [].concat(trigger);\n const triggerProps = {\n ref: attachRef\n };\n if (triggers.indexOf('click') !== -1) {\n triggerProps.onClick = handleClick;\n }\n if (triggers.indexOf('focus') !== -1) {\n triggerProps.onFocus = handleFocus;\n triggerProps.onBlur = handleBlur;\n }\n if (triggers.indexOf('hover') !== -1) {\n process.env.NODE_ENV !== \"production\" ? warning(triggers.length > 1, '[react-bootstrap] Specifying only the `\"hover\"` trigger limits the visibility of the overlay to just mouse users. Consider also including the `\"focus\"` trigger so that touch and keyboard only users can see the overlay as well.') : void 0;\n triggerProps.onMouseOver = handleMouseOver;\n triggerProps.onMouseOut = handleMouseOut;\n }\n return /*#__PURE__*/_jsxs(_Fragment, {\n children: [typeof children === 'function' ? children(triggerProps) : /*#__PURE__*/cloneElement(children, triggerProps), /*#__PURE__*/_jsx(Overlay, {\n ...props,\n show: show,\n onHide: handleHide,\n flip: flip,\n placement: placement,\n popperConfig: popperConfig,\n target: triggerNodeRef.current,\n children: overlay\n })]\n });\n}\nexport default OverlayTrigger;","// -* - coding: utf - 8 -* -\n// Copyright(c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport React, { useState } from 'react';\nimport Image from 'react-bootstrap/Image';\nimport Tooltip from 'react-bootstrap/Tooltip';\nimport OverlayTrigger from 'react-bootstrap/OverlayTrigger';\nimport './WorkloadDetails.scss';\nimport { api } from '../../App';\nimport { getLabel } from '../Diagnosis/Diagnosis';\nimport Workloads from './../Workloads/Workloads';\n\nexport default function WorkloadDetails({ selectedWorkload, setWarningText, setSelectedOp }) {\n const [spinner, setSpinner] = useState(true);\n\n let deleteWorkload = (selectedWorkload) => {\n api.post('api/workloads/delete?token=' + localStorage.getItem('token'), { workload_id: selectedWorkload.uuid })\n .then(\n response => {\n Workloads.getWorkloads(true);\n }\n )\n .catch(error => {\n setWarningText(error.message);\n setSpinner(false);\n });\n }\n\n const tooltipDelete = (\n \n Delete this workload\n \n );\n\n const tooltipCopy = (\n \n Copy full model path\n \n );\n\n const tooltipFullPath = (\n \n {selectedWorkload?.model_path}\n \n );\n\n return (\n
\n {selectedWorkload &&\n
\n

Details\n \n
{ deleteWorkload(selectedWorkload); setSelectedOp(null); }}>\n (e.currentTarget.src = \"icons/057a-trash-solid.svg\")}\n onMouseOut={e => (e.currentTarget.src = \"icons/057a-trash-solid-red.svg\")}\n />\n
\n
\n

\n \n \n \n \n \n \n \n \n \n \n \n \n
Framework:{selectedWorkload?.framework}
\n Model path:\n \n \n
{getLabel(selectedWorkload?.model_path)}
\n
\n
\n {selectedWorkload?.framework === 'TensorFlow' &&\n \n
{ navigator.clipboard.writeText(selectedWorkload.model_path) }}>\n (e.currentTarget.src = \"icons/146b-copy-outlined-gray.svg\")}\n onMouseOut={e => (e.currentTarget.src = \"icons/146b-copy-outlined.svg\")}\n />\n
\n
\n }\n
\n
\n }\n
\n )\n}","// -* - coding: utf - 8 -* -\n// Copyright(c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport React, { useEffect, useState } from 'react';\nimport './ModelSummary.scss';\nimport { api } from './../../App';\nimport Spinner from 'react-bootstrap/Spinner';\n\nexport default function ModelSummary({ selectedWorkload, setWarningText }) {\n const [summary, setSummary] = useState(null);\n useEffect(() => {\n if (selectedWorkload) {\n setSummary(null);\n const payload = {\n workload_id: selectedWorkload.uuid,\n };\n api.post('api/model/summary?token=' + localStorage.getItem('token'), payload)\n .then(\n response => {\n setSummary(response);\n })\n .catch(error => {\n setWarningText(error.message);\n });\n }\n }, [selectedWorkload]);\n\n return (\n
\n {!summary &&\n
\n \n
\n }\n
\n        \n          {summary?.data?.summary.replaceAll('\\n\\n', '\\n')}\n        \n      
\n
\n )\n}","// -* - coding: utf - 8 -* -\n// Copyright(c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport React, { useEffect, useState, useMemo } from 'react';\nimport './Profiling.scss';\nimport { api } from './../../App';\nimport Plot from 'react-plotly.js';\nimport { getLabel } from './../Diagnosis/Diagnosis';\nimport Table from 'react-bootstrap/Table';\n\nexport default function Profiling({ selectedWorkload, setWarningText }) {\n const [profilingTable, setProfilingTable] = useState([]);\n const [profilingChartData, setProfilingChartData] = useState([]);\n return (\n
\n \n \n
\n )\n}\n\nfunction ProfilingTable({ selectedWorkload, profilingTable, setProfilingTable, setProfilingChartData, setWarningText }) {\n\n const [checked, setChecked] = useState({});\n const [sorting, setSorting] = useState({ field: 'node_name', direction: 1 });\n\n useEffect(() => {\n if (selectedWorkload) {\n api.post('api/profiling?token=' + localStorage.getItem('token'), { workload_id: selectedWorkload.uuid })\n .then(\n response => {\n setProfilingTable(response.data);\n setSorting({ field: 'total_execution_time', direction: 1 });\n const showOnChart = {};\n const chartData = [];\n response.data.forEach((node, index) => {\n if (index < 10) {\n showOnChart[node.node_name] = true;\n chartData.push(node);\n } else {\n showOnChart[node.node_name] = false;\n }\n });\n setChecked(showOnChart);\n setProfilingChartData(chartData);\n })\n .catch(error => {\n setWarningText(error.message);\n });\n }\n }, [selectedWorkload]);\n\n let sortedProfiling = useMemo(() => {\n let sortedTable = [...profilingTable];\n if (sorting !== null) {\n sortedTable.sort((a, b) => {\n if (a[sorting.field] < b[sorting.field]) {\n return sorting.direction;\n }\n if (a[sorting.field] > b[sorting.field]) {\n return -sorting.direction;\n }\n return 0;\n });\n }\n return sortedTable;\n }, [sorting]);\n\n const requestSorting = field => {\n let direction = -sorting.direction;\n setSorting({ field, direction });\n };\n\n const getSortingClass = (name) => {\n let classes = 'header clickable';\n if (sorting.field === name) {\n return classes + (sorting.direction === 1 ? ' ascending' : ' descending');\n }\n return 'header clickable';\n };\n\n const requestChartCheck = (nodeName, value) => {\n let chartCheck = checked;\n chartCheck[nodeName] = value;\n setChecked(chartCheck);\n const newProfilingChartData = profilingTable.filter(node => checked[node.node_name] === true);\n setProfilingChartData(newProfilingChartData);\n };\n\n const tableContent = sortedProfiling?.map(profiling => {\n return (\n \n {profiling.node_name}\n {profiling.accelerator_execution_time}\n {profiling.cpu_execution_time}\n {profiling.op_defined}\n {profiling.op_run}\n {profiling.total_execution_time}\n \n {\n requestChartCheck(profiling.node_name, e.target.checked);\n }}\n />\n \n \n );\n });\n\n return (\n
\n \n \n \n \n \n \n \n \n \n \n \n {tableContent}\n \n
requestSorting('node_name')}>Name requestSorting('accelerator_execution_time')}>Accelerator execution time [μs] requestSorting('cpu_execution_time')}>CPU execution time [μs] requestSorting('op_defined')}>Op defined requestSorting('op_run')}>Op run requestSorting('total_execution_time')}>Total execution time [μs]Show on chart
\n
\n );\n}\n\nfunction ProfilingChart({ profilingChartData }) {\n return (
\n \n
)\n};\n\nconst getChartData = (profilingData) => {\n let data = [];\n if (Object.keys(profilingData).length) {\n const colorPalette = generateColor(profilingData.length);\n profilingData.forEach((node, index) => {\n data.push({\n name: getLabel(node.node_name),\n x: [node.node_name],\n y: [node.total_execution_time],\n type: 'bar',\n marker: {\n color: colorPalette[index]\n }\n });\n });\n }\n return data;\n}\n\nconst layout = {\n responsive: true,\n xaxis: {\n title: 'Total execution time [μs]',\n showticklabels: false\n },\n yaxis: {\n showgrid: true,\n },\n legend: {\n tracegroupgap: 0,\n },\n opacity: 1,\n};\n\nconst generateColor = (num) => {\n const colorPalette = [];\n const step = 100 / num;\n for (let i = num; i > 0; --i) {\n colorPalette.push(`rgb(${20 + (step * i)}, ${100 - (step * i * 0.1)}, ${200 - (step * i * 0.1)})`);\n }\n return colorPalette;\n}\n\n","import { useState } from 'react';\nimport useEffect from './useIsomorphicEffect';\nvar targetMap = new WeakMap();\nvar resizeObserver;\n\nfunction getResizeObserver() {\n // eslint-disable-next-line no-return-assign\n return resizeObserver = resizeObserver || new window.ResizeObserver(function (entries) {\n entries.forEach(function (entry) {\n var handler = targetMap.get(entry.target);\n if (handler) handler(entry.contentRect);\n });\n });\n}\n/**\n * Efficiently observe size changes on an element. Depends on the `ResizeObserver` api,\n * and polyfills are needed in older browsers.\n *\n * ```ts\n * const [ref, attachRef] = useCallbackRef(null);\n *\n * const rect = useResizeObserver(ref);\n *\n * return (\n *
\n * {JSON.stringify(rect)}\n *
\n * )\n * ```\n *\n * @param element The DOM element to observe\n */\n\n\nexport default function useResizeObserver(element) {\n var _useState = useState(null),\n rect = _useState[0],\n setRect = _useState[1];\n\n useEffect(function () {\n if (!element) return;\n getResizeObserver().observe(element);\n setRect(element.getBoundingClientRect());\n targetMap.set(element, function (rect) {\n setRect(rect);\n });\n return function () {\n targetMap.delete(element);\n };\n }, [element]);\n return rect;\n}","const _excluded = [\"onKeyDown\"];\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* eslint-disable jsx-a11y/no-static-element-interactions */\n/* eslint-disable jsx-a11y/anchor-has-content */\n\nimport * as React from 'react';\nimport { useEventCallback } from '@restart/hooks';\nimport { useButtonProps } from './Button';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport function isTrivialHref(href) {\n return !href || href.trim() === '#';\n}\n/**\n * An generic `
` component that covers a few A11y cases, ensuring that\n * cases where the `href` is missing or trivial like \"#\" are treated like buttons.\n */\nconst Anchor = /*#__PURE__*/React.forwardRef((_ref, ref) => {\n let {\n onKeyDown\n } = _ref,\n props = _objectWithoutPropertiesLoose(_ref, _excluded);\n const [buttonProps] = useButtonProps(Object.assign({\n tagName: 'a'\n }, props));\n const handleKeyDown = useEventCallback(e => {\n buttonProps.onKeyDown(e);\n onKeyDown == null ? void 0 : onKeyDown(e);\n });\n if (isTrivialHref(props.href) || props.role === 'button') {\n return /*#__PURE__*/_jsx(\"a\", Object.assign({\n ref: ref\n }, props, buttonProps, {\n onKeyDown: handleKeyDown\n }));\n }\n return /*#__PURE__*/_jsx(\"a\", Object.assign({\n ref: ref\n }, props, {\n onKeyDown: onKeyDown\n }));\n});\nAnchor.displayName = 'Anchor';\nexport default Anchor;","import PropTypes from 'prop-types';\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst propTypes = {\n /** An accessible label indicating the relevant information about the Close Button. */\n 'aria-label': PropTypes.string,\n /** A callback fired after the Close Button is clicked. */\n onClick: PropTypes.func,\n /**\n * Render different color variant for the button.\n *\n * Omitting this will render the default dark color.\n */\n variant: PropTypes.oneOf(['white'])\n};\nconst CloseButton = /*#__PURE__*/React.forwardRef(({\n className,\n variant,\n 'aria-label': ariaLabel = 'Close',\n ...props\n}, ref) => /*#__PURE__*/_jsx(\"button\", {\n ref: ref,\n type: \"button\",\n className: classNames('btn-close', variant && `btn-close-${variant}`, className),\n \"aria-label\": ariaLabel,\n ...props\n}));\nCloseButton.displayName = 'CloseButton';\nCloseButton.propTypes = propTypes;\nexport default CloseButton;","import * as React from 'react';\nimport classNames from 'classnames';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport default (className => /*#__PURE__*/React.forwardRef((p, ref) => /*#__PURE__*/_jsx(\"div\", {\n ...p,\n ref: ref,\n className: classNames(p.className, className)\n})));","import classNames from 'classnames';\nimport * as React from 'react';\nimport { useUncontrolled } from 'uncontrollable';\nimport useEventCallback from '@restart/hooks/useEventCallback';\nimport Anchor from '@restart/ui/Anchor';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport Fade from './Fade';\nimport CloseButton from './CloseButton';\nimport divWithClassName from './divWithClassName';\nimport createWithBsPrefix from './createWithBsPrefix';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nimport { jsxs as _jsxs } from \"react/jsx-runtime\";\nconst DivStyledAsH4 = divWithClassName('h4');\nDivStyledAsH4.displayName = 'DivStyledAsH4';\nconst AlertHeading = createWithBsPrefix('alert-heading', {\n Component: DivStyledAsH4\n});\nconst AlertLink = createWithBsPrefix('alert-link', {\n Component: Anchor\n});\nconst Alert = /*#__PURE__*/React.forwardRef((uncontrolledProps, ref) => {\n const {\n bsPrefix,\n show = true,\n closeLabel = 'Close alert',\n closeVariant,\n className,\n children,\n variant = 'primary',\n onClose,\n dismissible,\n transition = Fade,\n ...props\n } = useUncontrolled(uncontrolledProps, {\n show: 'onClose'\n });\n const prefix = useBootstrapPrefix(bsPrefix, 'alert');\n const handleClose = useEventCallback(e => {\n if (onClose) {\n onClose(false, e);\n }\n });\n const Transition = transition === true ? Fade : transition;\n const alert = /*#__PURE__*/_jsxs(\"div\", {\n role: \"alert\",\n ...(!Transition ? props : undefined),\n ref: ref,\n className: classNames(className, prefix, variant && `${prefix}-${variant}`, dismissible && `${prefix}-dismissible`),\n children: [dismissible && /*#__PURE__*/_jsx(CloseButton, {\n onClick: handleClose,\n \"aria-label\": closeLabel,\n variant: closeVariant\n }), children]\n });\n if (!Transition) return show ? alert : null;\n return /*#__PURE__*/_jsx(Transition, {\n unmountOnExit: true,\n ...props,\n ref: undefined,\n in: show,\n children: alert\n });\n});\nAlert.displayName = 'Alert';\nexport default Object.assign(Alert, {\n Link: AlertLink,\n Heading: AlertHeading\n});","// -* - coding: utf - 8 -* -\n// Copyright(c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport React from 'react';\nimport Alert from 'react-bootstrap/Alert';\nimport Button from 'react-bootstrap/Button';\nimport './Warning.scss';\n\nexport default function Warning({ warningText, setWarningText }) {\n\n if (warningText.length) {\n return (\n \n Error\n

\n {warningText}\n

\n
\n \n
\n
\n );\n }\n return;\n}\n","import classNames from 'classnames';\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst propTypes = {\n /**\n * Specify whether the feedback is for valid or invalid fields\n *\n * @type {('valid'|'invalid')}\n */\n type: PropTypes.string,\n /** Display feedback as a tooltip. */\n tooltip: PropTypes.bool,\n as: PropTypes.elementType\n};\nconst Feedback = /*#__PURE__*/React.forwardRef(\n// Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n({\n as: Component = 'div',\n className,\n type = 'valid',\n tooltip = false,\n ...props\n}, ref) => /*#__PURE__*/_jsx(Component, {\n ...props,\n ref: ref,\n className: classNames(className, `${type}-${tooltip ? 'tooltip' : 'feedback'}`)\n}));\nFeedback.displayName = 'Feedback';\nFeedback.propTypes = propTypes;\nexport default Feedback;","import * as React from 'react';\n\n// TODO\n\nconst FormContext = /*#__PURE__*/React.createContext({});\nexport default FormContext;","import classNames from 'classnames';\nimport * as React from 'react';\nimport { useContext } from 'react';\nimport FormContext from './FormContext';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst FormCheckInput = /*#__PURE__*/React.forwardRef(({\n id,\n bsPrefix,\n className,\n type = 'checkbox',\n isValid = false,\n isInvalid = false,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'input',\n ...props\n}, ref) => {\n const {\n controlId\n } = useContext(FormContext);\n bsPrefix = useBootstrapPrefix(bsPrefix, 'form-check-input');\n return /*#__PURE__*/_jsx(Component, {\n ...props,\n ref: ref,\n type: type,\n id: id || controlId,\n className: classNames(className, bsPrefix, isValid && 'is-valid', isInvalid && 'is-invalid')\n });\n});\nFormCheckInput.displayName = 'FormCheckInput';\nexport default FormCheckInput;","import classNames from 'classnames';\nimport * as React from 'react';\nimport { useContext } from 'react';\nimport FormContext from './FormContext';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst FormCheckLabel = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n className,\n htmlFor,\n ...props\n}, ref) => {\n const {\n controlId\n } = useContext(FormContext);\n bsPrefix = useBootstrapPrefix(bsPrefix, 'form-check-label');\n return /*#__PURE__*/_jsx(\"label\", {\n ...props,\n ref: ref,\n htmlFor: htmlFor || controlId,\n className: classNames(className, bsPrefix)\n });\n});\nFormCheckLabel.displayName = 'FormCheckLabel';\nexport default FormCheckLabel;","import classNames from 'classnames';\nimport * as React from 'react';\nimport { useContext, useMemo } from 'react';\nimport Feedback from './Feedback';\nimport FormCheckInput from './FormCheckInput';\nimport FormCheckLabel from './FormCheckLabel';\nimport FormContext from './FormContext';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { hasChildOfType } from './ElementChildren';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nimport { Fragment as _Fragment } from \"react/jsx-runtime\";\nimport { jsxs as _jsxs } from \"react/jsx-runtime\";\nconst FormCheck = /*#__PURE__*/React.forwardRef(({\n id,\n bsPrefix,\n bsSwitchPrefix,\n inline = false,\n reverse = false,\n disabled = false,\n isValid = false,\n isInvalid = false,\n feedbackTooltip = false,\n feedback,\n feedbackType,\n className,\n style,\n title = '',\n type = 'checkbox',\n label,\n children,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as = 'input',\n ...props\n}, ref) => {\n bsPrefix = useBootstrapPrefix(bsPrefix, 'form-check');\n bsSwitchPrefix = useBootstrapPrefix(bsSwitchPrefix, 'form-switch');\n const {\n controlId\n } = useContext(FormContext);\n const innerFormContext = useMemo(() => ({\n controlId: id || controlId\n }), [controlId, id]);\n const hasLabel = !children && label != null && label !== false || hasChildOfType(children, FormCheckLabel);\n const input = /*#__PURE__*/_jsx(FormCheckInput, {\n ...props,\n type: type === 'switch' ? 'checkbox' : type,\n ref: ref,\n isValid: isValid,\n isInvalid: isInvalid,\n disabled: disabled,\n as: as\n });\n return /*#__PURE__*/_jsx(FormContext.Provider, {\n value: innerFormContext,\n children: /*#__PURE__*/_jsx(\"div\", {\n style: style,\n className: classNames(className, hasLabel && bsPrefix, inline && `${bsPrefix}-inline`, reverse && `${bsPrefix}-reverse`, type === 'switch' && bsSwitchPrefix),\n children: children || /*#__PURE__*/_jsxs(_Fragment, {\n children: [input, hasLabel && /*#__PURE__*/_jsx(FormCheckLabel, {\n title: title,\n children: label\n }), feedback && /*#__PURE__*/_jsx(Feedback, {\n type: feedbackType,\n tooltip: feedbackTooltip,\n children: feedback\n })]\n })\n })\n });\n});\nFormCheck.displayName = 'FormCheck';\nexport default Object.assign(FormCheck, {\n Input: FormCheckInput,\n Label: FormCheckLabel\n});","import * as React from 'react';\n\n/**\n * Iterates through children that are typically specified as `props.children`,\n * but only maps over children that are \"valid elements\".\n *\n * The mapFunction provided index will be normalised to the components mapped,\n * so an invalid component would not increase the index.\n *\n */\nfunction map(children, func) {\n let index = 0;\n return React.Children.map(children, child => /*#__PURE__*/React.isValidElement(child) ? func(child, index++) : child);\n}\n\n/**\n * Iterates through children that are \"valid elements\".\n *\n * The provided forEachFunc(child, index) will be called for each\n * leaf child with the index reflecting the position relative to \"valid components\".\n */\nfunction forEach(children, func) {\n let index = 0;\n React.Children.forEach(children, child => {\n if ( /*#__PURE__*/React.isValidElement(child)) func(child, index++);\n });\n}\n\n/**\n * Finds whether a component's `children` prop includes a React element of the\n * specified type.\n */\nfunction hasChildOfType(children, type) {\n return React.Children.toArray(children).some(child => /*#__PURE__*/React.isValidElement(child) && child.type === type);\n}\nexport { map, forEach, hasChildOfType };","import classNames from 'classnames';\nimport * as React from 'react';\nimport { useContext } from 'react';\nimport warning from 'warning';\nimport Feedback from './Feedback';\nimport FormContext from './FormContext';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst FormControl = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n type,\n size,\n htmlSize,\n id,\n className,\n isValid = false,\n isInvalid = false,\n plaintext,\n readOnly,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'input',\n ...props\n}, ref) => {\n const {\n controlId\n } = useContext(FormContext);\n bsPrefix = useBootstrapPrefix(bsPrefix, 'form-control');\n let classes;\n if (plaintext) {\n classes = {\n [`${bsPrefix}-plaintext`]: true\n };\n } else {\n classes = {\n [bsPrefix]: true,\n [`${bsPrefix}-${size}`]: size\n };\n }\n process.env.NODE_ENV !== \"production\" ? warning(controlId == null || !id, '`controlId` is ignored on `` when `id` is specified.') : void 0;\n return /*#__PURE__*/_jsx(Component, {\n ...props,\n type: type,\n size: htmlSize,\n ref: ref,\n readOnly: readOnly,\n id: id || controlId,\n className: classNames(className, classes, isValid && `is-valid`, isInvalid && `is-invalid`, type === 'color' && `${bsPrefix}-color`)\n });\n});\nFormControl.displayName = 'FormControl';\nexport default Object.assign(FormControl, {\n Feedback\n});","import createWithBsPrefix from './createWithBsPrefix';\nexport default createWithBsPrefix('form-floating');","import * as React from 'react';\nimport { useMemo } from 'react';\nimport FormContext from './FormContext';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst FormGroup = /*#__PURE__*/React.forwardRef(({\n controlId,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'div',\n ...props\n}, ref) => {\n const context = useMemo(() => ({\n controlId\n }), [controlId]);\n return /*#__PURE__*/_jsx(FormContext.Provider, {\n value: context,\n children: /*#__PURE__*/_jsx(Component, {\n ...props,\n ref: ref\n })\n });\n});\nFormGroup.displayName = 'FormGroup';\nexport default FormGroup;","import classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix, useBootstrapBreakpoints, useBootstrapMinBreakpoint } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nexport function useCol({\n as,\n bsPrefix,\n className,\n ...props\n}) {\n bsPrefix = useBootstrapPrefix(bsPrefix, 'col');\n const breakpoints = useBootstrapBreakpoints();\n const minBreakpoint = useBootstrapMinBreakpoint();\n const spans = [];\n const classes = [];\n breakpoints.forEach(brkPoint => {\n const propValue = props[brkPoint];\n delete props[brkPoint];\n let span;\n let offset;\n let order;\n if (typeof propValue === 'object' && propValue != null) {\n ({\n span,\n offset,\n order\n } = propValue);\n } else {\n span = propValue;\n }\n const infix = brkPoint !== minBreakpoint ? `-${brkPoint}` : '';\n if (span) spans.push(span === true ? `${bsPrefix}${infix}` : `${bsPrefix}${infix}-${span}`);\n if (order != null) classes.push(`order${infix}-${order}`);\n if (offset != null) classes.push(`offset${infix}-${offset}`);\n });\n return [{\n ...props,\n className: classNames(className, ...spans, ...classes)\n }, {\n as,\n bsPrefix,\n spans\n }];\n}\nconst Col = /*#__PURE__*/React.forwardRef(\n// Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n(props, ref) => {\n const [{\n className,\n ...colProps\n }, {\n as: Component = 'div',\n bsPrefix,\n spans\n }] = useCol(props);\n return /*#__PURE__*/_jsx(Component, {\n ...colProps,\n ref: ref,\n className: classNames(className, !spans.length && bsPrefix)\n });\n});\nCol.displayName = 'Col';\nexport default Col;","import classNames from 'classnames';\nimport * as React from 'react';\nimport { useContext } from 'react';\nimport warning from 'warning';\nimport Col from './Col';\nimport FormContext from './FormContext';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst FormLabel = /*#__PURE__*/React.forwardRef(({\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'label',\n bsPrefix,\n column = false,\n visuallyHidden = false,\n className,\n htmlFor,\n ...props\n}, ref) => {\n const {\n controlId\n } = useContext(FormContext);\n bsPrefix = useBootstrapPrefix(bsPrefix, 'form-label');\n let columnClass = 'col-form-label';\n if (typeof column === 'string') columnClass = `${columnClass} ${columnClass}-${column}`;\n const classes = classNames(className, bsPrefix, visuallyHidden && 'visually-hidden', column && columnClass);\n process.env.NODE_ENV !== \"production\" ? warning(controlId == null || !htmlFor, '`controlId` is ignored on `` when `htmlFor` is specified.') : void 0;\n htmlFor = htmlFor || controlId;\n if (column) return /*#__PURE__*/_jsx(Col, {\n ref: ref,\n as: \"label\",\n className: classes,\n htmlFor: htmlFor,\n ...props\n });\n return (\n /*#__PURE__*/\n // eslint-disable-next-line jsx-a11y/label-has-for, jsx-a11y/label-has-associated-control\n _jsx(Component, {\n ref: ref,\n className: classes,\n htmlFor: htmlFor,\n ...props\n })\n );\n});\nFormLabel.displayName = 'FormLabel';\nexport default FormLabel;","import classNames from 'classnames';\nimport * as React from 'react';\nimport { useContext } from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport FormContext from './FormContext';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst FormRange = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n className,\n id,\n ...props\n}, ref) => {\n const {\n controlId\n } = useContext(FormContext);\n bsPrefix = useBootstrapPrefix(bsPrefix, 'form-range');\n return /*#__PURE__*/_jsx(\"input\", {\n ...props,\n type: \"range\",\n ref: ref,\n className: classNames(className, bsPrefix),\n id: id || controlId\n });\n});\nFormRange.displayName = 'FormRange';\nexport default FormRange;","import classNames from 'classnames';\nimport * as React from 'react';\nimport { useContext } from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport FormContext from './FormContext';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst FormSelect = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n size,\n htmlSize,\n className,\n isValid = false,\n isInvalid = false,\n id,\n ...props\n}, ref) => {\n const {\n controlId\n } = useContext(FormContext);\n bsPrefix = useBootstrapPrefix(bsPrefix, 'form-select');\n return /*#__PURE__*/_jsx(\"select\", {\n ...props,\n size: htmlSize,\n ref: ref,\n className: classNames(className, bsPrefix, size && `${bsPrefix}-${size}`, isValid && `is-valid`, isInvalid && `is-invalid`),\n id: id || controlId\n });\n});\nFormSelect.displayName = 'FormSelect';\nexport default FormSelect;","import classNames from 'classnames';\nimport * as React from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst FormText = /*#__PURE__*/React.forwardRef(\n// Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n({\n bsPrefix,\n className,\n as: Component = 'small',\n muted,\n ...props\n}, ref) => {\n bsPrefix = useBootstrapPrefix(bsPrefix, 'form-text');\n return /*#__PURE__*/_jsx(Component, {\n ...props,\n ref: ref,\n className: classNames(className, bsPrefix, muted && 'text-muted')\n });\n});\nFormText.displayName = 'FormText';\nexport default FormText;","import * as React from 'react';\nimport FormCheck from './FormCheck';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst Switch = /*#__PURE__*/React.forwardRef((props, ref) => /*#__PURE__*/_jsx(FormCheck, {\n ...props,\n ref: ref,\n type: \"switch\"\n}));\nSwitch.displayName = 'Switch';\nexport default Object.assign(Switch, {\n Input: FormCheck.Input,\n Label: FormCheck.Label\n});","import classNames from 'classnames';\nimport * as React from 'react';\nimport FormGroup from './FormGroup';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nimport { jsxs as _jsxs } from \"react/jsx-runtime\";\nconst FloatingLabel = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n className,\n children,\n controlId,\n label,\n ...props\n}, ref) => {\n bsPrefix = useBootstrapPrefix(bsPrefix, 'form-floating');\n return /*#__PURE__*/_jsxs(FormGroup, {\n ref: ref,\n className: classNames(className, bsPrefix),\n controlId: controlId,\n ...props,\n children: [children, /*#__PURE__*/_jsx(\"label\", {\n htmlFor: controlId,\n children: label\n })]\n });\n});\nFloatingLabel.displayName = 'FloatingLabel';\nexport default FloatingLabel;","import classNames from 'classnames';\nimport PropTypes from 'prop-types';\nimport * as React from 'react';\nimport FormCheck from './FormCheck';\nimport FormControl from './FormControl';\nimport FormFloating from './FormFloating';\nimport FormGroup from './FormGroup';\nimport FormLabel from './FormLabel';\nimport FormRange from './FormRange';\nimport FormSelect from './FormSelect';\nimport FormText from './FormText';\nimport Switch from './Switch';\nimport FloatingLabel from './FloatingLabel';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst propTypes = {\n /**\n * The Form `ref` will be forwarded to the underlying element,\n * which means, unless it's rendered `as` a composite component,\n * it will be a DOM node, when resolved.\n *\n * @type {ReactRef}\n * @alias ref\n */\n _ref: PropTypes.any,\n /**\n * Mark a form as having been validated. Setting it to `true` will\n * toggle any validation styles on the forms elements.\n */\n validated: PropTypes.bool,\n as: PropTypes.elementType\n};\nconst Form = /*#__PURE__*/React.forwardRef(({\n className,\n validated,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'form',\n ...props\n}, ref) => /*#__PURE__*/_jsx(Component, {\n ...props,\n ref: ref,\n className: classNames(className, validated && 'was-validated')\n}));\nForm.displayName = 'Form';\nForm.propTypes = propTypes;\nexport default Object.assign(Form, {\n Group: FormGroup,\n Control: FormControl,\n Floating: FormFloating,\n Check: FormCheck,\n Switch,\n Label: FormLabel,\n Text: FormText,\n Range: FormRange,\n Select: FormSelect,\n FloatingLabel\n});","import * as React from 'react';\nconst context = /*#__PURE__*/React.createContext(null);\ncontext.displayName = 'InputGroupContext';\nexport default context;","import classNames from 'classnames';\nimport * as React from 'react';\nimport { useMemo } from 'react';\nimport createWithBsPrefix from './createWithBsPrefix';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport FormCheckInput from './FormCheckInput';\nimport InputGroupContext from './InputGroupContext';\nimport { jsx as _jsx } from \"react/jsx-runtime\";\nconst InputGroupText = createWithBsPrefix('input-group-text', {\n Component: 'span'\n});\nconst InputGroupCheckbox = props => /*#__PURE__*/_jsx(InputGroupText, {\n children: /*#__PURE__*/_jsx(FormCheckInput, {\n type: \"checkbox\",\n ...props\n })\n});\nconst InputGroupRadio = props => /*#__PURE__*/_jsx(InputGroupText, {\n children: /*#__PURE__*/_jsx(FormCheckInput, {\n type: \"radio\",\n ...props\n })\n});\nconst InputGroup = /*#__PURE__*/React.forwardRef(({\n bsPrefix,\n size,\n hasValidation,\n className,\n // Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\n as: Component = 'div',\n ...props\n}, ref) => {\n bsPrefix = useBootstrapPrefix(bsPrefix, 'input-group');\n\n // Intentionally an empty object. Used in detecting if a dropdown\n // exists under an input group.\n const contextValue = useMemo(() => ({}), []);\n return /*#__PURE__*/_jsx(InputGroupContext.Provider, {\n value: contextValue,\n children: /*#__PURE__*/_jsx(Component, {\n ref: ref,\n ...props,\n className: classNames(className, bsPrefix, size && `${bsPrefix}-${size}`, hasValidation && 'has-validation')\n })\n });\n});\nInputGroup.displayName = 'InputGroup';\nexport default Object.assign(InputGroup, {\n Text: InputGroupText,\n Radio: InputGroupRadio,\n Checkbox: InputGroupCheckbox\n});","// -* - coding: utf - 8 -* -\n// Copyright(c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport React, { useState } from 'react';\nimport './Diagnosis.scss';\nimport Graph from './../Graph/Graph';\nimport OpDetails from './../OpDetails/OpDetails';\nimport OpList from './../OpList/OpList';\nimport Histogram from './../Histogram/Histogram';\nimport Workloads from './../Workloads/Workloads';\nimport WorkloadDetails from './../WorkloadDetails/WorkloadDetails';\nimport ModelSummary from './../ModelSummary/ModelSummary';\nimport Profiling from './../Profiling/Profiling';\nimport Warning from './../Warning/Warning';\nimport Form from 'react-bootstrap/Form';\nimport InputGroup from 'react-bootstrap/InputGroup';\nimport Button from 'react-bootstrap/esm/Button';\nimport Spinner from 'react-bootstrap/Spinner';\n\nfunction Diagnosis() {\n const [selectedNode, setSelectedNode] = useState(null);\n const [selectedWorkload, setSelectedWorkload] = useState(null);\n const [selectedOp, setSelectedOp] = useState(null);\n const [selectedPattern, setSelectedPattern] = useState([]);\n const [histogramType, setHistogramType] = useState(null);\n const [warningText, setWarningText] = useState('');\n\n return (\n
\n \n
\n
\n
\n \n
\n \n {selectedWorkload?.mode === 'quantization' &&\n \n }\n
\n {selectedWorkload?.mode === 'benchmark' &&\n
\n \n
\n }\n {selectedWorkload?.mode === 'quantization' &&\n
\n {selectedWorkload.framework !== 'PyTorch' &&\n \n }\n {selectedWorkload.framework === 'PyTorch' &&\n \n }\n
\n }\n {selectedWorkload?.mode === 'quantization' &&\n
\n \n \n
\n }\n
\n {selectedWorkload?.mode === 'quantization' && selectedOp &&\n
\n
\n \n
\n
\n {histogramType && }\n
\n
\n }\n
\n )\n};\n\nfunction NodeProperties({ selectedNode }) {\n if (selectedNode) {\n const propertyList = Object.entries(selectedNode.properties).map(([key, value]) => {\n return (\n \n {key}\n {getLabel(value)}\n \n )\n });\n\n const attributeList = selectedNode.attributes?.map(attribute => {\n return (\n \n {attribute.name}\n {attribute.attribute_type}\n {attribute.attribute_type !== \"float32\" &&\n {attribute.value?.toString()}\n }\n {attribute.attribute_type === \"float32\" &&\n {attribute.value.toExponential(2)}\n }\n \n )\n });\n\n return (\n
\n

Node details

\n \n \n \n \n \n {propertyList}\n \n {attributeList && }\n \n {attributeList}\n \n
Properties
Attributes
\n
\n );\n } else {\n return;\n }\n}\n\nclass NodeSearch extends React.Component {\n render() {\n return (\n
\n

Node search

\n \n \n \n \n
\n )\n }\n}\n\nfunction AccuracyResults({ selectedWorkload }) {\n return (\n
\n {selectedWorkload.status === 'wip' &&\n

Quantization is in progress.\n

\n \n
\n

\n }\n {selectedWorkload.status !== 'wip' &&\n !selectedWorkload.accuracy_data.ratio &&\n \n \n \n \n \n \n \n \n \n
Accuracy
results
\n
N/A
\n
FP32
\n
\n
N/A
\n
INT8
\n
\n
N/A
\n
Ratio
\n
\n }\n {selectedWorkload.status !== 'wip' &&\n selectedWorkload.accuracy_data.ratio &&\n \n \n \n \n \n \n \n \n \n
Accuracy
results
\n
{(selectedWorkload.accuracy_data.baseline_accuracy * 100).toPrecision(3)}%
\n
FP32
\n
\n
{(selectedWorkload.accuracy_data.optimized_accuracy * 100).toPrecision(3)}%
\n
INT8
\n
\n
{(selectedWorkload.accuracy_data.ratio * 100).toPrecision(2)}%
\n
Ratio
\n
\n }\n
\n )\n}\n\nexport const getLabel = (label) => {\n if (label.includes('/')) {\n return label.replace(/^.*[\\\\\\/]/, '');\n } else {\n return label;\n }\n}\n\nexport const customColor = [\n '#5B69FF',\n '#FF848A',\n '#EDB200',\n '#1E2EB8',\n '#FF5662',\n '#C98F00',\n '#000F8A',\n '#C81326',\n '#000864',\n '#9D79BC',\n '#A14DA0',\n];\n\nexport default Diagnosis;\n","'use strict';\n\nexport default function bind(fn, thisArg) {\n return function wrap() {\n return fn.apply(thisArg, arguments);\n };\n}\n","'use strict';\n\nimport bind from './helpers/bind.js';\n\n// utils is a library of generic helper functions non-specific to axios\n\nconst {toString} = Object.prototype;\nconst {getPrototypeOf} = Object;\n\nconst kindOf = (cache => thing => {\n const str = toString.call(thing);\n return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());\n})(Object.create(null));\n\nconst kindOfTest = (type) => {\n type = type.toLowerCase();\n return (thing) => kindOf(thing) === type\n}\n\nconst typeOfTest = type => thing => typeof thing === type;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n *\n * @returns {boolean} True if value is an Array, otherwise false\n */\nconst {isArray} = Array;\n\n/**\n * Determine if a value is undefined\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nconst isUndefined = typeOfTest('undefined');\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nconst isArrayBuffer = kindOfTest('ArrayBuffer');\n\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n let result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a String, otherwise false\n */\nconst isString = typeOfTest('string');\n\n/**\n * Determine if a value is a Function\n *\n * @param {*} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nconst isFunction = typeOfTest('function');\n\n/**\n * Determine if a value is a Number\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Number, otherwise false\n */\nconst isNumber = typeOfTest('number');\n\n/**\n * Determine if a value is an Object\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an Object, otherwise false\n */\nconst isObject = (thing) => thing !== null && typeof thing === 'object';\n\n/**\n * Determine if a value is a Boolean\n *\n * @param {*} thing The value to test\n * @returns {boolean} True if value is a Boolean, otherwise false\n */\nconst isBoolean = thing => thing === true || thing === false;\n\n/**\n * Determine if a value is a plain Object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a plain Object, otherwise false\n */\nconst isPlainObject = (val) => {\n if (kindOf(val) !== 'object') {\n return false;\n }\n\n const prototype = getPrototypeOf(val);\n return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Date, otherwise false\n */\nconst isDate = kindOfTest('Date');\n\n/**\n * Determine if a value is a File\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFile = kindOfTest('File');\n\n/**\n * Determine if a value is a Blob\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nconst isBlob = kindOfTest('Blob');\n\n/**\n * Determine if a value is a FileList\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a File, otherwise false\n */\nconst isFileList = kindOfTest('FileList');\n\n/**\n * Determine if a value is a Stream\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nconst isStream = (val) => isObject(val) && isFunction(val.pipe);\n\n/**\n * Determine if a value is a FormData\n *\n * @param {*} thing The value to test\n *\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nconst isFormData = (thing) => {\n let kind;\n return thing && (\n (typeof FormData === 'function' && thing instanceof FormData) || (\n isFunction(thing.append) && (\n (kind = kindOf(thing)) === 'formdata' ||\n // detect form-data instance\n (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')\n )\n )\n )\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nconst isURLSearchParams = kindOfTest('URLSearchParams');\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n *\n * @returns {String} The String freed of excess whitespace\n */\nconst trim = (str) => str.trim ?\n str.trim() : str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n *\n * @param {Boolean} [allOwnKeys = false]\n * @returns {any}\n */\nfunction forEach(obj, fn, {allOwnKeys = false} = {}) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n let i;\n let l;\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);\n const len = keys.length;\n let key;\n\n for (i = 0; i < len; i++) {\n key = keys[i];\n fn.call(null, obj[key], key, obj);\n }\n }\n}\n\nfunction findKey(obj, key) {\n key = key.toLowerCase();\n const keys = Object.keys(obj);\n let i = keys.length;\n let _key;\n while (i-- > 0) {\n _key = keys[i];\n if (key === _key.toLowerCase()) {\n return _key;\n }\n }\n return null;\n}\n\nconst _global = (() => {\n /*eslint no-undef:0*/\n if (typeof globalThis !== \"undefined\") return globalThis;\n return typeof self !== \"undefined\" ? self : (typeof window !== 'undefined' ? window : global)\n})();\n\nconst isContextDefined = (context) => !isUndefined(context) && context !== _global;\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n *\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n const {caseless} = isContextDefined(this) && this || {};\n const result = {};\n const assignValue = (val, key) => {\n const targetKey = caseless && findKey(result, key) || key;\n if (isPlainObject(result[targetKey]) && isPlainObject(val)) {\n result[targetKey] = merge(result[targetKey], val);\n } else if (isPlainObject(val)) {\n result[targetKey] = merge({}, val);\n } else if (isArray(val)) {\n result[targetKey] = val.slice();\n } else {\n result[targetKey] = val;\n }\n }\n\n for (let i = 0, l = arguments.length; i < l; i++) {\n arguments[i] && forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n *\n * @param {Boolean} [allOwnKeys]\n * @returns {Object} The resulting value of object a\n */\nconst extend = (a, b, thisArg, {allOwnKeys}= {}) => {\n forEach(b, (val, key) => {\n if (thisArg && isFunction(val)) {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n }, {allOwnKeys});\n return a;\n}\n\n/**\n * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)\n *\n * @param {string} content with BOM\n *\n * @returns {string} content value without BOM\n */\nconst stripBOM = (content) => {\n if (content.charCodeAt(0) === 0xFEFF) {\n content = content.slice(1);\n }\n return content;\n}\n\n/**\n * Inherit the prototype methods from one constructor into another\n * @param {function} constructor\n * @param {function} superConstructor\n * @param {object} [props]\n * @param {object} [descriptors]\n *\n * @returns {void}\n */\nconst inherits = (constructor, superConstructor, props, descriptors) => {\n constructor.prototype = Object.create(superConstructor.prototype, descriptors);\n constructor.prototype.constructor = constructor;\n Object.defineProperty(constructor, 'super', {\n value: superConstructor.prototype\n });\n props && Object.assign(constructor.prototype, props);\n}\n\n/**\n * Resolve object with deep prototype chain to a flat object\n * @param {Object} sourceObj source object\n * @param {Object} [destObj]\n * @param {Function|Boolean} [filter]\n * @param {Function} [propFilter]\n *\n * @returns {Object}\n */\nconst toFlatObject = (sourceObj, destObj, filter, propFilter) => {\n let props;\n let i;\n let prop;\n const merged = {};\n\n destObj = destObj || {};\n // eslint-disable-next-line no-eq-null,eqeqeq\n if (sourceObj == null) return destObj;\n\n do {\n props = Object.getOwnPropertyNames(sourceObj);\n i = props.length;\n while (i-- > 0) {\n prop = props[i];\n if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {\n destObj[prop] = sourceObj[prop];\n merged[prop] = true;\n }\n }\n sourceObj = filter !== false && getPrototypeOf(sourceObj);\n } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);\n\n return destObj;\n}\n\n/**\n * Determines whether a string ends with the characters of a specified string\n *\n * @param {String} str\n * @param {String} searchString\n * @param {Number} [position= 0]\n *\n * @returns {boolean}\n */\nconst endsWith = (str, searchString, position) => {\n str = String(str);\n if (position === undefined || position > str.length) {\n position = str.length;\n }\n position -= searchString.length;\n const lastIndex = str.indexOf(searchString, position);\n return lastIndex !== -1 && lastIndex === position;\n}\n\n\n/**\n * Returns new array from array like object or null if failed\n *\n * @param {*} [thing]\n *\n * @returns {?Array}\n */\nconst toArray = (thing) => {\n if (!thing) return null;\n if (isArray(thing)) return thing;\n let i = thing.length;\n if (!isNumber(i)) return null;\n const arr = new Array(i);\n while (i-- > 0) {\n arr[i] = thing[i];\n }\n return arr;\n}\n\n/**\n * Checking if the Uint8Array exists and if it does, it returns a function that checks if the\n * thing passed in is an instance of Uint8Array\n *\n * @param {TypedArray}\n *\n * @returns {Array}\n */\n// eslint-disable-next-line func-names\nconst isTypedArray = (TypedArray => {\n // eslint-disable-next-line func-names\n return thing => {\n return TypedArray && thing instanceof TypedArray;\n };\n})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));\n\n/**\n * For each entry in the object, call the function with the key and value.\n *\n * @param {Object} obj - The object to iterate over.\n * @param {Function} fn - The function to call for each entry.\n *\n * @returns {void}\n */\nconst forEachEntry = (obj, fn) => {\n const generator = obj && obj[Symbol.iterator];\n\n const iterator = generator.call(obj);\n\n let result;\n\n while ((result = iterator.next()) && !result.done) {\n const pair = result.value;\n fn.call(obj, pair[0], pair[1]);\n }\n}\n\n/**\n * It takes a regular expression and a string, and returns an array of all the matches\n *\n * @param {string} regExp - The regular expression to match against.\n * @param {string} str - The string to search.\n *\n * @returns {Array}\n */\nconst matchAll = (regExp, str) => {\n let matches;\n const arr = [];\n\n while ((matches = regExp.exec(str)) !== null) {\n arr.push(matches);\n }\n\n return arr;\n}\n\n/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */\nconst isHTMLForm = kindOfTest('HTMLFormElement');\n\nconst toCamelCase = str => {\n return str.toLowerCase().replace(/[-_\\s]([a-z\\d])(\\w*)/g,\n function replacer(m, p1, p2) {\n return p1.toUpperCase() + p2;\n }\n );\n};\n\n/* Creating a function that will check if an object has a property. */\nconst hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);\n\n/**\n * Determine if a value is a RegExp object\n *\n * @param {*} val The value to test\n *\n * @returns {boolean} True if value is a RegExp object, otherwise false\n */\nconst isRegExp = kindOfTest('RegExp');\n\nconst reduceDescriptors = (obj, reducer) => {\n const descriptors = Object.getOwnPropertyDescriptors(obj);\n const reducedDescriptors = {};\n\n forEach(descriptors, (descriptor, name) => {\n if (reducer(descriptor, name, obj) !== false) {\n reducedDescriptors[name] = descriptor;\n }\n });\n\n Object.defineProperties(obj, reducedDescriptors);\n}\n\n/**\n * Makes all methods read-only\n * @param {Object} obj\n */\n\nconst freezeMethods = (obj) => {\n reduceDescriptors(obj, (descriptor, name) => {\n // skip restricted props in strict mode\n if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {\n return false;\n }\n\n const value = obj[name];\n\n if (!isFunction(value)) return;\n\n descriptor.enumerable = false;\n\n if ('writable' in descriptor) {\n descriptor.writable = false;\n return;\n }\n\n if (!descriptor.set) {\n descriptor.set = () => {\n throw Error('Can not rewrite read-only method \\'' + name + '\\'');\n };\n }\n });\n}\n\nconst toObjectSet = (arrayOrString, delimiter) => {\n const obj = {};\n\n const define = (arr) => {\n arr.forEach(value => {\n obj[value] = true;\n });\n }\n\n isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));\n\n return obj;\n}\n\nconst noop = () => {}\n\nconst toFiniteNumber = (value, defaultValue) => {\n value = +value;\n return Number.isFinite(value) ? value : defaultValue;\n}\n\nconst ALPHA = 'abcdefghijklmnopqrstuvwxyz'\n\nconst DIGIT = '0123456789';\n\nconst ALPHABET = {\n DIGIT,\n ALPHA,\n ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT\n}\n\nconst generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {\n let str = '';\n const {length} = alphabet;\n while (size--) {\n str += alphabet[Math.random() * length|0]\n }\n\n return str;\n}\n\n/**\n * If the thing is a FormData object, return true, otherwise return false.\n *\n * @param {unknown} thing - The thing to check.\n *\n * @returns {boolean}\n */\nfunction isSpecCompliantForm(thing) {\n return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]);\n}\n\nconst toJSONObject = (obj) => {\n const stack = new Array(10);\n\n const visit = (source, i) => {\n\n if (isObject(source)) {\n if (stack.indexOf(source) >= 0) {\n return;\n }\n\n if(!('toJSON' in source)) {\n stack[i] = source;\n const target = isArray(source) ? [] : {};\n\n forEach(source, (value, key) => {\n const reducedValue = visit(value, i + 1);\n !isUndefined(reducedValue) && (target[key] = reducedValue);\n });\n\n stack[i] = undefined;\n\n return target;\n }\n }\n\n return source;\n }\n\n return visit(obj, 0);\n}\n\nconst isAsyncFn = kindOfTest('AsyncFunction');\n\nconst isThenable = (thing) =>\n thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);\n\nexport default {\n isArray,\n isArrayBuffer,\n isBuffer,\n isFormData,\n isArrayBufferView,\n isString,\n isNumber,\n isBoolean,\n isObject,\n isPlainObject,\n isUndefined,\n isDate,\n isFile,\n isBlob,\n isRegExp,\n isFunction,\n isStream,\n isURLSearchParams,\n isTypedArray,\n isFileList,\n forEach,\n merge,\n extend,\n trim,\n stripBOM,\n inherits,\n toFlatObject,\n kindOf,\n kindOfTest,\n endsWith,\n toArray,\n forEachEntry,\n matchAll,\n isHTMLForm,\n hasOwnProperty,\n hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection\n reduceDescriptors,\n freezeMethods,\n toObjectSet,\n toCamelCase,\n noop,\n toFiniteNumber,\n findKey,\n global: _global,\n isContextDefined,\n ALPHABET,\n generateString,\n isSpecCompliantForm,\n toJSONObject,\n isAsyncFn,\n isThenable\n};\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [config] The config.\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n *\n * @returns {Error} The created error.\n */\nfunction AxiosError(message, code, config, request, response) {\n Error.call(this);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n } else {\n this.stack = (new Error()).stack;\n }\n\n this.message = message;\n this.name = 'AxiosError';\n code && (this.code = code);\n config && (this.config = config);\n request && (this.request = request);\n response && (this.response = response);\n}\n\nutils.inherits(AxiosError, Error, {\n toJSON: function toJSON() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: utils.toJSONObject(this.config),\n code: this.code,\n status: this.response && this.response.status ? this.response.status : null\n };\n }\n});\n\nconst prototype = AxiosError.prototype;\nconst descriptors = {};\n\n[\n 'ERR_BAD_OPTION_VALUE',\n 'ERR_BAD_OPTION',\n 'ECONNABORTED',\n 'ETIMEDOUT',\n 'ERR_NETWORK',\n 'ERR_FR_TOO_MANY_REDIRECTS',\n 'ERR_DEPRECATED',\n 'ERR_BAD_RESPONSE',\n 'ERR_BAD_REQUEST',\n 'ERR_CANCELED',\n 'ERR_NOT_SUPPORT',\n 'ERR_INVALID_URL'\n// eslint-disable-next-line func-names\n].forEach(code => {\n descriptors[code] = {value: code};\n});\n\nObject.defineProperties(AxiosError, descriptors);\nObject.defineProperty(prototype, 'isAxiosError', {value: true});\n\n// eslint-disable-next-line func-names\nAxiosError.from = (error, code, config, request, response, customProps) => {\n const axiosError = Object.create(prototype);\n\n utils.toFlatObject(error, axiosError, function filter(obj) {\n return obj !== Error.prototype;\n }, prop => {\n return prop !== 'isAxiosError';\n });\n\n AxiosError.call(axiosError, error.message, code, config, request, response);\n\n axiosError.cause = error;\n\n axiosError.name = error.name;\n\n customProps && Object.assign(axiosError, customProps);\n\n return axiosError;\n};\n\nexport default AxiosError;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\n// temporary hotfix to avoid circular references until AxiosURLSearchParams is refactored\nimport PlatformFormData from '../platform/node/classes/FormData.js';\n\n/**\n * Determines if the given thing is a array or js object.\n *\n * @param {string} thing - The object or array to be visited.\n *\n * @returns {boolean}\n */\nfunction isVisitable(thing) {\n return utils.isPlainObject(thing) || utils.isArray(thing);\n}\n\n/**\n * It removes the brackets from the end of a string\n *\n * @param {string} key - The key of the parameter.\n *\n * @returns {string} the key without the brackets.\n */\nfunction removeBrackets(key) {\n return utils.endsWith(key, '[]') ? key.slice(0, -2) : key;\n}\n\n/**\n * It takes a path, a key, and a boolean, and returns a string\n *\n * @param {string} path - The path to the current key.\n * @param {string} key - The key of the current object being iterated over.\n * @param {string} dots - If true, the key will be rendered with dots instead of brackets.\n *\n * @returns {string} The path to the current key.\n */\nfunction renderKey(path, key, dots) {\n if (!path) return key;\n return path.concat(key).map(function each(token, i) {\n // eslint-disable-next-line no-param-reassign\n token = removeBrackets(token);\n return !dots && i ? '[' + token + ']' : token;\n }).join(dots ? '.' : '');\n}\n\n/**\n * If the array is an array and none of its elements are visitable, then it's a flat array.\n *\n * @param {Array} arr - The array to check\n *\n * @returns {boolean}\n */\nfunction isFlatArray(arr) {\n return utils.isArray(arr) && !arr.some(isVisitable);\n}\n\nconst predicates = utils.toFlatObject(utils, {}, null, function filter(prop) {\n return /^is[A-Z]/.test(prop);\n});\n\n/**\n * Convert a data object to FormData\n *\n * @param {Object} obj\n * @param {?Object} [formData]\n * @param {?Object} [options]\n * @param {Function} [options.visitor]\n * @param {Boolean} [options.metaTokens = true]\n * @param {Boolean} [options.dots = false]\n * @param {?Boolean} [options.indexes = false]\n *\n * @returns {Object}\n **/\n\n/**\n * It converts an object into a FormData object\n *\n * @param {Object} obj - The object to convert to form data.\n * @param {string} formData - The FormData object to append to.\n * @param {Object} options\n *\n * @returns\n */\nfunction toFormData(obj, formData, options) {\n if (!utils.isObject(obj)) {\n throw new TypeError('target must be an object');\n }\n\n // eslint-disable-next-line no-param-reassign\n formData = formData || new (PlatformFormData || FormData)();\n\n // eslint-disable-next-line no-param-reassign\n options = utils.toFlatObject(options, {\n metaTokens: true,\n dots: false,\n indexes: false\n }, false, function defined(option, source) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n return !utils.isUndefined(source[option]);\n });\n\n const metaTokens = options.metaTokens;\n // eslint-disable-next-line no-use-before-define\n const visitor = options.visitor || defaultVisitor;\n const dots = options.dots;\n const indexes = options.indexes;\n const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;\n const useBlob = _Blob && utils.isSpecCompliantForm(formData);\n\n if (!utils.isFunction(visitor)) {\n throw new TypeError('visitor must be a function');\n }\n\n function convertValue(value) {\n if (value === null) return '';\n\n if (utils.isDate(value)) {\n return value.toISOString();\n }\n\n if (!useBlob && utils.isBlob(value)) {\n throw new AxiosError('Blob is not supported. Use a Buffer instead.');\n }\n\n if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) {\n return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);\n }\n\n return value;\n }\n\n /**\n * Default visitor.\n *\n * @param {*} value\n * @param {String|Number} key\n * @param {Array} path\n * @this {FormData}\n *\n * @returns {boolean} return true to visit the each prop of the value recursively\n */\n function defaultVisitor(value, key, path) {\n let arr = value;\n\n if (value && !path && typeof value === 'object') {\n if (utils.endsWith(key, '{}')) {\n // eslint-disable-next-line no-param-reassign\n key = metaTokens ? key : key.slice(0, -2);\n // eslint-disable-next-line no-param-reassign\n value = JSON.stringify(value);\n } else if (\n (utils.isArray(value) && isFlatArray(value)) ||\n ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.toArray(value))\n )) {\n // eslint-disable-next-line no-param-reassign\n key = removeBrackets(key);\n\n arr.forEach(function each(el, index) {\n !(utils.isUndefined(el) || el === null) && formData.append(\n // eslint-disable-next-line no-nested-ternary\n indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),\n convertValue(el)\n );\n });\n return false;\n }\n }\n\n if (isVisitable(value)) {\n return true;\n }\n\n formData.append(renderKey(path, key, dots), convertValue(value));\n\n return false;\n }\n\n const stack = [];\n\n const exposedHelpers = Object.assign(predicates, {\n defaultVisitor,\n convertValue,\n isVisitable\n });\n\n function build(value, path) {\n if (utils.isUndefined(value)) return;\n\n if (stack.indexOf(value) !== -1) {\n throw Error('Circular reference detected in ' + path.join('.'));\n }\n\n stack.push(value);\n\n utils.forEach(value, function each(el, key) {\n const result = !(utils.isUndefined(el) || el === null) && visitor.call(\n formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers\n );\n\n if (result === true) {\n build(el, path ? path.concat(key) : [key]);\n }\n });\n\n stack.pop();\n }\n\n if (!utils.isObject(obj)) {\n throw new TypeError('data must be an object');\n }\n\n build(obj);\n\n return formData;\n}\n\nexport default toFormData;\n","'use strict';\n\nimport toFormData from './toFormData.js';\n\n/**\n * It encodes a string by replacing all characters that are not in the unreserved set with\n * their percent-encoded equivalents\n *\n * @param {string} str - The string to encode.\n *\n * @returns {string} The encoded string.\n */\nfunction encode(str) {\n const charMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00'\n };\n return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {\n return charMap[match];\n });\n}\n\n/**\n * It takes a params object and converts it to a FormData object\n *\n * @param {Object} params - The parameters to be converted to a FormData object.\n * @param {Object} options - The options object passed to the Axios constructor.\n *\n * @returns {void}\n */\nfunction AxiosURLSearchParams(params, options) {\n this._pairs = [];\n\n params && toFormData(params, this, options);\n}\n\nconst prototype = AxiosURLSearchParams.prototype;\n\nprototype.append = function append(name, value) {\n this._pairs.push([name, value]);\n};\n\nprototype.toString = function toString(encoder) {\n const _encode = encoder ? function(value) {\n return encoder.call(this, value, encode);\n } : encode;\n\n return this._pairs.map(function each(pair) {\n return _encode(pair[0]) + '=' + _encode(pair[1]);\n }, '').join('&');\n};\n\nexport default AxiosURLSearchParams;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosURLSearchParams from '../helpers/AxiosURLSearchParams.js';\n\n/**\n * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their\n * URI encoded counterparts\n *\n * @param {string} val The value to be encoded.\n *\n * @returns {string} The encoded value.\n */\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @param {?object} options\n *\n * @returns {string} The formatted url\n */\nexport default function buildURL(url, params, options) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n \n const _encode = options && options.encode || encode;\n\n const serializeFn = options && options.serialize;\n\n let serializedParams;\n\n if (serializeFn) {\n serializedParams = serializeFn(params, options);\n } else {\n serializedParams = utils.isURLSearchParams(params) ?\n params.toString() :\n new AxiosURLSearchParams(params, options).toString(_encode);\n }\n\n if (serializedParams) {\n const hashmarkIndex = url.indexOf(\"#\");\n\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\nclass InterceptorManager {\n constructor() {\n this.handlers = [];\n }\n\n /**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\n use(fulfilled, rejected, options) {\n this.handlers.push({\n fulfilled,\n rejected,\n synchronous: options ? options.synchronous : false,\n runWhen: options ? options.runWhen : null\n });\n return this.handlers.length - 1;\n }\n\n /**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n *\n * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise\n */\n eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n }\n\n /**\n * Clear all interceptors from the stack\n *\n * @returns {void}\n */\n clear() {\n if (this.handlers) {\n this.handlers = [];\n }\n }\n\n /**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n *\n * @returns {void}\n */\n forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n }\n}\n\nexport default InterceptorManager;\n","'use strict';\n\nexport default {\n silentJSONParsing: true,\n forcedJSONParsing: true,\n clarifyTimeoutError: false\n};\n","import URLSearchParams from './classes/URLSearchParams.js'\nimport FormData from './classes/FormData.js'\nimport Blob from './classes/Blob.js'\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n *\n * @returns {boolean}\n */\nconst isStandardBrowserEnv = (() => {\n let product;\n if (typeof navigator !== 'undefined' && (\n (product = navigator.product) === 'ReactNative' ||\n product === 'NativeScript' ||\n product === 'NS')\n ) {\n return false;\n }\n\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n})();\n\n/**\n * Determine if we're running in a standard browser webWorker environment\n *\n * Although the `isStandardBrowserEnv` method indicates that\n * `allows axios to run in a web worker`, the WebWorker will still be\n * filtered out due to its judgment standard\n * `typeof window !== 'undefined' && typeof document !== 'undefined'`.\n * This leads to a problem when axios post `FormData` in webWorker\n */\n const isStandardBrowserWebWorkerEnv = (() => {\n return (\n typeof WorkerGlobalScope !== 'undefined' &&\n // eslint-disable-next-line no-undef\n self instanceof WorkerGlobalScope &&\n typeof self.importScripts === 'function'\n );\n})();\n\n\nexport default {\n isBrowser: true,\n classes: {\n URLSearchParams,\n FormData,\n Blob\n },\n isStandardBrowserEnv,\n isStandardBrowserWebWorkerEnv,\n protocols: ['http', 'https', 'file', 'blob', 'url', 'data']\n};\n","'use strict';\n\nimport AxiosURLSearchParams from '../../../helpers/AxiosURLSearchParams.js';\nexport default typeof URLSearchParams !== 'undefined' ? URLSearchParams : AxiosURLSearchParams;\n","'use strict';\n\nexport default typeof FormData !== 'undefined' ? FormData : null;\n","'use strict'\n\nexport default typeof Blob !== 'undefined' ? Blob : null\n","'use strict';\n\nimport utils from '../utils.js';\n\n/**\n * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']\n *\n * @param {string} name - The name of the property to get.\n *\n * @returns An array of strings.\n */\nfunction parsePropPath(name) {\n // foo[x][y][z]\n // foo.x.y.z\n // foo-x-y-z\n // foo x y z\n return utils.matchAll(/\\w+|\\[(\\w*)]/g, name).map(match => {\n return match[0] === '[]' ? '' : match[1] || match[0];\n });\n}\n\n/**\n * Convert an array to an object.\n *\n * @param {Array} arr - The array to convert to an object.\n *\n * @returns An object with the same keys and values as the array.\n */\nfunction arrayToObject(arr) {\n const obj = {};\n const keys = Object.keys(arr);\n let i;\n const len = keys.length;\n let key;\n for (i = 0; i < len; i++) {\n key = keys[i];\n obj[key] = arr[key];\n }\n return obj;\n}\n\n/**\n * It takes a FormData object and returns a JavaScript object\n *\n * @param {string} formData The FormData object to convert to JSON.\n *\n * @returns {Object | null} The converted object.\n */\nfunction formDataToJSON(formData) {\n function buildPath(path, value, target, index) {\n let name = path[index++];\n const isNumericKey = Number.isFinite(+name);\n const isLast = index >= path.length;\n name = !name && utils.isArray(target) ? target.length : name;\n\n if (isLast) {\n if (utils.hasOwnProp(target, name)) {\n target[name] = [target[name], value];\n } else {\n target[name] = value;\n }\n\n return !isNumericKey;\n }\n\n if (!target[name] || !utils.isObject(target[name])) {\n target[name] = [];\n }\n\n const result = buildPath(path, value, target[name], index);\n\n if (result && utils.isArray(target[name])) {\n target[name] = arrayToObject(target[name]);\n }\n\n return !isNumericKey;\n }\n\n if (utils.isFormData(formData) && utils.isFunction(formData.entries)) {\n const obj = {};\n\n utils.forEachEntry(formData, (name, value) => {\n buildPath(parsePropPath(name), value, obj, 0);\n });\n\n return obj;\n }\n\n return null;\n}\n\nexport default formDataToJSON;\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosError from '../core/AxiosError.js';\nimport transitionalDefaults from './transitional.js';\nimport toFormData from '../helpers/toFormData.js';\nimport toURLEncodedForm from '../helpers/toURLEncodedForm.js';\nimport platform from '../platform/index.js';\nimport formDataToJSON from '../helpers/formDataToJSON.js';\n\nconst DEFAULT_CONTENT_TYPE = {\n 'Content-Type': undefined\n};\n\n/**\n * It takes a string, tries to parse it, and if it fails, it returns the stringified version\n * of the input\n *\n * @param {any} rawValue - The value to be stringified.\n * @param {Function} parser - A function that parses a string into a JavaScript object.\n * @param {Function} encoder - A function that takes a value and returns a string.\n *\n * @returns {string} A stringified version of the rawValue.\n */\nfunction stringifySafely(rawValue, parser, encoder) {\n if (utils.isString(rawValue)) {\n try {\n (parser || JSON.parse)(rawValue);\n return utils.trim(rawValue);\n } catch (e) {\n if (e.name !== 'SyntaxError') {\n throw e;\n }\n }\n }\n\n return (encoder || JSON.stringify)(rawValue);\n}\n\nconst defaults = {\n\n transitional: transitionalDefaults,\n\n adapter: ['xhr', 'http'],\n\n transformRequest: [function transformRequest(data, headers) {\n const contentType = headers.getContentType() || '';\n const hasJSONContentType = contentType.indexOf('application/json') > -1;\n const isObjectPayload = utils.isObject(data);\n\n if (isObjectPayload && utils.isHTMLForm(data)) {\n data = new FormData(data);\n }\n\n const isFormData = utils.isFormData(data);\n\n if (isFormData) {\n if (!hasJSONContentType) {\n return data;\n }\n return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;\n }\n\n if (utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);\n return data.toString();\n }\n\n let isFileList;\n\n if (isObjectPayload) {\n if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {\n return toURLEncodedForm(data, this.formSerializer).toString();\n }\n\n if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {\n const _FormData = this.env && this.env.FormData;\n\n return toFormData(\n isFileList ? {'files[]': data} : data,\n _FormData && new _FormData(),\n this.formSerializer\n );\n }\n }\n\n if (isObjectPayload || hasJSONContentType ) {\n headers.setContentType('application/json', false);\n return stringifySafely(data);\n }\n\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n const transitional = this.transitional || defaults.transitional;\n const forcedJSONParsing = transitional && transitional.forcedJSONParsing;\n const JSONRequested = this.responseType === 'json';\n\n if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {\n const silentJSONParsing = transitional && transitional.silentJSONParsing;\n const strictJSONParsing = !silentJSONParsing && JSONRequested;\n\n try {\n return JSON.parse(data);\n } catch (e) {\n if (strictJSONParsing) {\n if (e.name === 'SyntaxError') {\n throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);\n }\n throw e;\n }\n }\n }\n\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n maxBodyLength: -1,\n\n env: {\n FormData: platform.classes.FormData,\n Blob: platform.classes.Blob\n },\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n },\n\n headers: {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nexport default defaults;\n","'use strict';\n\nimport utils from '../utils.js';\nimport toFormData from './toFormData.js';\nimport platform from '../platform/index.js';\n\nexport default function toURLEncodedForm(data, options) {\n return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({\n visitor: function(value, key, path, helpers) {\n if (platform.isNode && utils.isBuffer(value)) {\n this.append(key, value.toString('base64'));\n return false;\n }\n\n return helpers.defaultVisitor.apply(this, arguments);\n }\n }, options));\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n// RawAxiosHeaders whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nconst ignoreDuplicateOf = utils.toObjectSet([\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n]);\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} rawHeaders Headers needing to be parsed\n *\n * @returns {Object} Headers parsed into an object\n */\nexport default rawHeaders => {\n const parsed = {};\n let key;\n let val;\n let i;\n\n rawHeaders && rawHeaders.split('\\n').forEach(function parser(line) {\n i = line.indexOf(':');\n key = line.substring(0, i).trim().toLowerCase();\n val = line.substring(i + 1).trim();\n\n if (!key || (parsed[key] && ignoreDuplicateOf[key])) {\n return;\n }\n\n if (key === 'set-cookie') {\n if (parsed[key]) {\n parsed[key].push(val);\n } else {\n parsed[key] = [val];\n }\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n });\n\n return parsed;\n};\n","'use strict';\n\nimport utils from '../utils.js';\nimport parseHeaders from '../helpers/parseHeaders.js';\n\nconst $internals = Symbol('internals');\n\nfunction normalizeHeader(header) {\n return header && String(header).trim().toLowerCase();\n}\n\nfunction normalizeValue(value) {\n if (value === false || value == null) {\n return value;\n }\n\n return utils.isArray(value) ? value.map(normalizeValue) : String(value);\n}\n\nfunction parseTokens(str) {\n const tokens = Object.create(null);\n const tokensRE = /([^\\s,;=]+)\\s*(?:=\\s*([^,;]+))?/g;\n let match;\n\n while ((match = tokensRE.exec(str))) {\n tokens[match[1]] = match[2];\n }\n\n return tokens;\n}\n\nconst isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());\n\nfunction matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {\n if (utils.isFunction(filter)) {\n return filter.call(this, value, header);\n }\n\n if (isHeaderNameFilter) {\n value = header;\n }\n\n if (!utils.isString(value)) return;\n\n if (utils.isString(filter)) {\n return value.indexOf(filter) !== -1;\n }\n\n if (utils.isRegExp(filter)) {\n return filter.test(value);\n }\n}\n\nfunction formatHeader(header) {\n return header.trim()\n .toLowerCase().replace(/([a-z\\d])(\\w*)/g, (w, char, str) => {\n return char.toUpperCase() + str;\n });\n}\n\nfunction buildAccessors(obj, header) {\n const accessorName = utils.toCamelCase(' ' + header);\n\n ['get', 'set', 'has'].forEach(methodName => {\n Object.defineProperty(obj, methodName + accessorName, {\n value: function(arg1, arg2, arg3) {\n return this[methodName].call(this, header, arg1, arg2, arg3);\n },\n configurable: true\n });\n });\n}\n\nclass AxiosHeaders {\n constructor(headers) {\n headers && this.set(headers);\n }\n\n set(header, valueOrRewrite, rewrite) {\n const self = this;\n\n function setHeader(_value, _header, _rewrite) {\n const lHeader = normalizeHeader(_header);\n\n if (!lHeader) {\n throw new Error('header name must be a non-empty string');\n }\n\n const key = utils.findKey(self, lHeader);\n\n if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {\n self[key || _header] = normalizeValue(_value);\n }\n }\n\n const setHeaders = (headers, _rewrite) =>\n utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));\n\n if (utils.isPlainObject(header) || header instanceof this.constructor) {\n setHeaders(header, valueOrRewrite)\n } else if(utils.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {\n setHeaders(parseHeaders(header), valueOrRewrite);\n } else {\n header != null && setHeader(valueOrRewrite, header, rewrite);\n }\n\n return this;\n }\n\n get(header, parser) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n if (key) {\n const value = this[key];\n\n if (!parser) {\n return value;\n }\n\n if (parser === true) {\n return parseTokens(value);\n }\n\n if (utils.isFunction(parser)) {\n return parser.call(this, value, key);\n }\n\n if (utils.isRegExp(parser)) {\n return parser.exec(value);\n }\n\n throw new TypeError('parser must be boolean|regexp|function');\n }\n }\n }\n\n has(header, matcher) {\n header = normalizeHeader(header);\n\n if (header) {\n const key = utils.findKey(this, header);\n\n return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));\n }\n\n return false;\n }\n\n delete(header, matcher) {\n const self = this;\n let deleted = false;\n\n function deleteHeader(_header) {\n _header = normalizeHeader(_header);\n\n if (_header) {\n const key = utils.findKey(self, _header);\n\n if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {\n delete self[key];\n\n deleted = true;\n }\n }\n }\n\n if (utils.isArray(header)) {\n header.forEach(deleteHeader);\n } else {\n deleteHeader(header);\n }\n\n return deleted;\n }\n\n clear(matcher) {\n const keys = Object.keys(this);\n let i = keys.length;\n let deleted = false;\n\n while (i--) {\n const key = keys[i];\n if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {\n delete this[key];\n deleted = true;\n }\n }\n\n return deleted;\n }\n\n normalize(format) {\n const self = this;\n const headers = {};\n\n utils.forEach(this, (value, header) => {\n const key = utils.findKey(headers, header);\n\n if (key) {\n self[key] = normalizeValue(value);\n delete self[header];\n return;\n }\n\n const normalized = format ? formatHeader(header) : String(header).trim();\n\n if (normalized !== header) {\n delete self[header];\n }\n\n self[normalized] = normalizeValue(value);\n\n headers[normalized] = true;\n });\n\n return this;\n }\n\n concat(...targets) {\n return this.constructor.concat(this, ...targets);\n }\n\n toJSON(asStrings) {\n const obj = Object.create(null);\n\n utils.forEach(this, (value, header) => {\n value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value);\n });\n\n return obj;\n }\n\n [Symbol.iterator]() {\n return Object.entries(this.toJSON())[Symbol.iterator]();\n }\n\n toString() {\n return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\\n');\n }\n\n get [Symbol.toStringTag]() {\n return 'AxiosHeaders';\n }\n\n static from(thing) {\n return thing instanceof this ? thing : new this(thing);\n }\n\n static concat(first, ...targets) {\n const computed = new this(first);\n\n targets.forEach((target) => computed.set(target));\n\n return computed;\n }\n\n static accessor(header) {\n const internals = this[$internals] = (this[$internals] = {\n accessors: {}\n });\n\n const accessors = internals.accessors;\n const prototype = this.prototype;\n\n function defineAccessor(_header) {\n const lHeader = normalizeHeader(_header);\n\n if (!accessors[lHeader]) {\n buildAccessors(prototype, _header);\n accessors[lHeader] = true;\n }\n }\n\n utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);\n\n return this;\n }\n}\n\nAxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);\n\nutils.freezeMethods(AxiosHeaders.prototype);\nutils.freezeMethods(AxiosHeaders);\n\nexport default AxiosHeaders;\n","'use strict';\n\nimport utils from './../utils.js';\nimport defaults from '../defaults/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Array|Function} fns A single function or Array of functions\n * @param {?Object} response The response object\n *\n * @returns {*} The resulting transformed data\n */\nexport default function transformData(fns, response) {\n const config = this || defaults;\n const context = response || config;\n const headers = AxiosHeaders.from(context.headers);\n let data = context.data;\n\n utils.forEach(fns, function transform(fn) {\n data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);\n });\n\n headers.normalize();\n\n return data;\n}\n","'use strict';\n\nexport default function isCancel(value) {\n return !!(value && value.__CANCEL__);\n}\n","'use strict';\n\nimport AxiosError from '../core/AxiosError.js';\nimport utils from '../utils.js';\n\n/**\n * A `CanceledError` is an object that is thrown when an operation is canceled.\n *\n * @param {string=} message The message.\n * @param {Object=} config The config.\n * @param {Object=} request The request.\n *\n * @returns {CanceledError} The created error.\n */\nfunction CanceledError(message, config, request) {\n // eslint-disable-next-line no-eq-null,eqeqeq\n AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);\n this.name = 'CanceledError';\n}\n\nutils.inherits(CanceledError, AxiosError, {\n __CANCEL__: true\n});\n\nexport default CanceledError;\n","'use strict';\n\nimport utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.isStandardBrowserEnv ?\n\n// Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n const cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n const match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n// Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })();\n","'use strict';\n\nimport isAbsoluteURL from '../helpers/isAbsoluteURL.js';\nimport combineURLs from '../helpers/combineURLs.js';\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n *\n * @returns {string} The combined full path\n */\nexport default function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n}\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n *\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nexport default function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(url);\n}\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n *\n * @returns {string} The combined URL\n */\nexport default function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n}\n","'use strict';\n\nimport utils from './../utils.js';\nimport platform from '../platform/index.js';\n\nexport default platform.isStandardBrowserEnv ?\n\n// Standard browser envs have full support of the APIs needed to test\n// whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n const msie = /(msie|trident)/i.test(navigator.userAgent);\n const urlParsingNode = document.createElement('a');\n let originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n let href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n const parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })();\n","'use strict';\n\n/**\n * Calculate data maxRate\n * @param {Number} [samplesCount= 10]\n * @param {Number} [min= 1000]\n * @returns {Function}\n */\nfunction speedometer(samplesCount, min) {\n samplesCount = samplesCount || 10;\n const bytes = new Array(samplesCount);\n const timestamps = new Array(samplesCount);\n let head = 0;\n let tail = 0;\n let firstSampleTS;\n\n min = min !== undefined ? min : 1000;\n\n return function push(chunkLength) {\n const now = Date.now();\n\n const startedAt = timestamps[tail];\n\n if (!firstSampleTS) {\n firstSampleTS = now;\n }\n\n bytes[head] = chunkLength;\n timestamps[head] = now;\n\n let i = tail;\n let bytesCount = 0;\n\n while (i !== head) {\n bytesCount += bytes[i++];\n i = i % samplesCount;\n }\n\n head = (head + 1) % samplesCount;\n\n if (head === tail) {\n tail = (tail + 1) % samplesCount;\n }\n\n if (now - firstSampleTS < min) {\n return;\n }\n\n const passed = startedAt && now - startedAt;\n\n return passed ? Math.round(bytesCount * 1000 / passed) : undefined;\n };\n}\n\nexport default speedometer;\n","'use strict';\n\nimport utils from './../utils.js';\nimport settle from './../core/settle.js';\nimport cookies from './../helpers/cookies.js';\nimport buildURL from './../helpers/buildURL.js';\nimport buildFullPath from '../core/buildFullPath.js';\nimport isURLSameOrigin from './../helpers/isURLSameOrigin.js';\nimport transitionalDefaults from '../defaults/transitional.js';\nimport AxiosError from '../core/AxiosError.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport parseProtocol from '../helpers/parseProtocol.js';\nimport platform from '../platform/index.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport speedometer from '../helpers/speedometer.js';\n\nfunction progressEventReducer(listener, isDownloadStream) {\n let bytesNotified = 0;\n const _speedometer = speedometer(50, 250);\n\n return e => {\n const loaded = e.loaded;\n const total = e.lengthComputable ? e.total : undefined;\n const progressBytes = loaded - bytesNotified;\n const rate = _speedometer(progressBytes);\n const inRange = loaded <= total;\n\n bytesNotified = loaded;\n\n const data = {\n loaded,\n total,\n progress: total ? (loaded / total) : undefined,\n bytes: progressBytes,\n rate: rate ? rate : undefined,\n estimated: rate && total && inRange ? (total - loaded) / rate : undefined,\n event: e\n };\n\n data[isDownloadStream ? 'download' : 'upload'] = true;\n\n listener(data);\n };\n}\n\nconst isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';\n\nexport default isXHRAdapterSupported && function (config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n let requestData = config.data;\n const requestHeaders = AxiosHeaders.from(config.headers).normalize();\n const responseType = config.responseType;\n let onCanceled;\n function done() {\n if (config.cancelToken) {\n config.cancelToken.unsubscribe(onCanceled);\n }\n\n if (config.signal) {\n config.signal.removeEventListener('abort', onCanceled);\n }\n }\n\n if (utils.isFormData(requestData)) {\n if (platform.isStandardBrowserEnv || platform.isStandardBrowserWebWorkerEnv) {\n requestHeaders.setContentType(false); // Let the browser set it\n } else {\n requestHeaders.setContentType('multipart/form-data;', false); // mobile/desktop app frameworks\n }\n }\n\n let request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n const username = config.auth.username || '';\n const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : '';\n requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password));\n }\n\n const fullPath = buildFullPath(config.baseURL, config.url);\n\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n function onloadend() {\n if (!request) {\n return;\n }\n // Prepare the response\n const responseHeaders = AxiosHeaders.from(\n 'getAllResponseHeaders' in request && request.getAllResponseHeaders()\n );\n const responseData = !responseType || responseType === 'text' || responseType === 'json' ?\n request.responseText : request.response;\n const response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config,\n request\n };\n\n settle(function _resolve(value) {\n resolve(value);\n done();\n }, function _reject(err) {\n reject(err);\n done();\n }, response);\n\n // Clean up request\n request = null;\n }\n\n if ('onloadend' in request) {\n // Use onloadend if available\n request.onloadend = onloadend;\n } else {\n // Listen for ready state to emulate onloadend\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n // readystate handler is calling before onerror or ontimeout handlers,\n // so we should call onloadend on the next 'tick'\n setTimeout(onloadend);\n };\n }\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';\n const transitional = config.transitional || transitionalDefaults;\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(new AxiosError(\n timeoutErrorMessage,\n transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,\n config,\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (platform.isStandardBrowserEnv) {\n // Add xsrf header\n const xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath))\n && config.xsrfCookieName && cookies.read(config.xsrfCookieName);\n\n if (xsrfValue) {\n requestHeaders.set(config.xsrfHeaderName, xsrfValue);\n }\n }\n\n // Remove Content-Type if data is undefined\n requestData === undefined && requestHeaders.setContentType(null);\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {\n request.setRequestHeader(key, val);\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (responseType && responseType !== 'json') {\n request.responseType = config.responseType;\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true));\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress));\n }\n\n if (config.cancelToken || config.signal) {\n // Handle cancellation\n // eslint-disable-next-line func-names\n onCanceled = cancel => {\n if (!request) {\n return;\n }\n reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);\n request.abort();\n request = null;\n };\n\n config.cancelToken && config.cancelToken.subscribe(onCanceled);\n if (config.signal) {\n config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled);\n }\n }\n\n const protocol = parseProtocol(fullPath);\n\n if (protocol && platform.protocols.indexOf(protocol) === -1) {\n reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));\n return;\n }\n\n\n // Send the request\n request.send(requestData || null);\n });\n}\n","'use strict';\n\nimport AxiosError from './AxiosError.js';\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n *\n * @returns {object} The response.\n */\nexport default function settle(resolve, reject, response) {\n const validateStatus = response.config.validateStatus;\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(new AxiosError(\n 'Request failed with status code ' + response.status,\n [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],\n response.config,\n response.request,\n response\n ));\n }\n}\n","'use strict';\n\nexport default function parseProtocol(url) {\n const match = /^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(url);\n return match && match[1] || '';\n}\n","import utils from '../utils.js';\nimport httpAdapter from './http.js';\nimport xhrAdapter from './xhr.js';\nimport AxiosError from \"../core/AxiosError.js\";\n\nconst knownAdapters = {\n http: httpAdapter,\n xhr: xhrAdapter\n}\n\nutils.forEach(knownAdapters, (fn, value) => {\n if(fn) {\n try {\n Object.defineProperty(fn, 'name', {value});\n } catch (e) {\n // eslint-disable-next-line no-empty\n }\n Object.defineProperty(fn, 'adapterName', {value});\n }\n});\n\nexport default {\n getAdapter: (adapters) => {\n adapters = utils.isArray(adapters) ? adapters : [adapters];\n\n const {length} = adapters;\n let nameOrAdapter;\n let adapter;\n\n for (let i = 0; i < length; i++) {\n nameOrAdapter = adapters[i];\n if((adapter = utils.isString(nameOrAdapter) ? knownAdapters[nameOrAdapter.toLowerCase()] : nameOrAdapter)) {\n break;\n }\n }\n\n if (!adapter) {\n if (adapter === false) {\n throw new AxiosError(\n `Adapter ${nameOrAdapter} is not supported by the environment`,\n 'ERR_NOT_SUPPORT'\n );\n }\n\n throw new Error(\n utils.hasOwnProp(knownAdapters, nameOrAdapter) ?\n `Adapter '${nameOrAdapter}' is not available in the build` :\n `Unknown adapter '${nameOrAdapter}'`\n );\n }\n\n if (!utils.isFunction(adapter)) {\n throw new TypeError('adapter is not a function');\n }\n\n return adapter;\n },\n adapters: knownAdapters\n}\n","// eslint-disable-next-line strict\nexport default null;\n","'use strict';\n\nimport transformData from './transformData.js';\nimport isCancel from '../cancel/isCancel.js';\nimport defaults from '../defaults/index.js';\nimport CanceledError from '../cancel/CanceledError.js';\nimport AxiosHeaders from '../core/AxiosHeaders.js';\nimport adapters from \"../adapters/adapters.js\";\n\n/**\n * Throws a `CanceledError` if cancellation has been requested.\n *\n * @param {Object} config The config that is to be used for the request\n *\n * @returns {void}\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n\n if (config.signal && config.signal.aborted) {\n throw new CanceledError(null, config);\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n *\n * @returns {Promise} The Promise to be fulfilled\n */\nexport default function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n config.headers = AxiosHeaders.from(config.headers);\n\n // Transform request data\n config.data = transformData.call(\n config,\n config.transformRequest\n );\n\n if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {\n config.headers.setContentType('application/x-www-form-urlencoded', false);\n }\n\n const adapter = adapters.getAdapter(config.adapter || defaults.adapter);\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData.call(\n config,\n config.transformResponse,\n response\n );\n\n response.headers = AxiosHeaders.from(response.headers);\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData.call(\n config,\n config.transformResponse,\n reason.response\n );\n reason.response.headers = AxiosHeaders.from(reason.response.headers);\n }\n }\n\n return Promise.reject(reason);\n });\n}\n","'use strict';\n\nimport utils from '../utils.js';\nimport AxiosHeaders from \"./AxiosHeaders.js\";\n\nconst headersToObject = (thing) => thing instanceof AxiosHeaders ? thing.toJSON() : thing;\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n *\n * @returns {Object} New object resulting from merging config2 to config1\n */\nexport default function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n const config = {};\n\n function getMergedValue(target, source, caseless) {\n if (utils.isPlainObject(target) && utils.isPlainObject(source)) {\n return utils.merge.call({caseless}, target, source);\n } else if (utils.isPlainObject(source)) {\n return utils.merge({}, source);\n } else if (utils.isArray(source)) {\n return source.slice();\n }\n return source;\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDeepProperties(a, b, caseless) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(a, b, caseless);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a, caseless);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function valueFromConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function defaultToConfig2(a, b) {\n if (!utils.isUndefined(b)) {\n return getMergedValue(undefined, b);\n } else if (!utils.isUndefined(a)) {\n return getMergedValue(undefined, a);\n }\n }\n\n // eslint-disable-next-line consistent-return\n function mergeDirectKeys(a, b, prop) {\n if (prop in config2) {\n return getMergedValue(a, b);\n } else if (prop in config1) {\n return getMergedValue(undefined, a);\n }\n }\n\n const mergeMap = {\n url: valueFromConfig2,\n method: valueFromConfig2,\n data: valueFromConfig2,\n baseURL: defaultToConfig2,\n transformRequest: defaultToConfig2,\n transformResponse: defaultToConfig2,\n paramsSerializer: defaultToConfig2,\n timeout: defaultToConfig2,\n timeoutMessage: defaultToConfig2,\n withCredentials: defaultToConfig2,\n adapter: defaultToConfig2,\n responseType: defaultToConfig2,\n xsrfCookieName: defaultToConfig2,\n xsrfHeaderName: defaultToConfig2,\n onUploadProgress: defaultToConfig2,\n onDownloadProgress: defaultToConfig2,\n decompress: defaultToConfig2,\n maxContentLength: defaultToConfig2,\n maxBodyLength: defaultToConfig2,\n beforeRedirect: defaultToConfig2,\n transport: defaultToConfig2,\n httpAgent: defaultToConfig2,\n httpsAgent: defaultToConfig2,\n cancelToken: defaultToConfig2,\n socketPath: defaultToConfig2,\n responseEncoding: defaultToConfig2,\n validateStatus: mergeDirectKeys,\n headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true)\n };\n\n utils.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {\n const merge = mergeMap[prop] || mergeDeepProperties;\n const configValue = merge(config1[prop], config2[prop], prop);\n (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);\n });\n\n return config;\n}\n","export const VERSION = \"1.4.0\";","'use strict';\n\nimport {VERSION} from '../env/data.js';\nimport AxiosError from '../core/AxiosError.js';\n\nconst validators = {};\n\n// eslint-disable-next-line func-names\n['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {\n validators[type] = function validator(thing) {\n return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;\n };\n});\n\nconst deprecatedWarnings = {};\n\n/**\n * Transitional option validator\n *\n * @param {function|boolean?} validator - set to false if the transitional option has been removed\n * @param {string?} version - deprecated version / removed since version\n * @param {string?} message - some message with additional info\n *\n * @returns {function}\n */\nvalidators.transitional = function transitional(validator, version, message) {\n function formatMessage(opt, desc) {\n return '[Axios v' + VERSION + '] Transitional option \\'' + opt + '\\'' + desc + (message ? '. ' + message : '');\n }\n\n // eslint-disable-next-line func-names\n return (value, opt, opts) => {\n if (validator === false) {\n throw new AxiosError(\n formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),\n AxiosError.ERR_DEPRECATED\n );\n }\n\n if (version && !deprecatedWarnings[opt]) {\n deprecatedWarnings[opt] = true;\n // eslint-disable-next-line no-console\n console.warn(\n formatMessage(\n opt,\n ' has been deprecated since v' + version + ' and will be removed in the near future'\n )\n );\n }\n\n return validator ? validator(value, opt, opts) : true;\n };\n};\n\n/**\n * Assert object's properties type\n *\n * @param {object} options\n * @param {object} schema\n * @param {boolean?} allowUnknown\n *\n * @returns {object}\n */\n\nfunction assertOptions(options, schema, allowUnknown) {\n if (typeof options !== 'object') {\n throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);\n }\n const keys = Object.keys(options);\n let i = keys.length;\n while (i-- > 0) {\n const opt = keys[i];\n const validator = schema[opt];\n if (validator) {\n const value = options[opt];\n const result = value === undefined || validator(value, opt, options);\n if (result !== true) {\n throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);\n }\n continue;\n }\n if (allowUnknown !== true) {\n throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);\n }\n }\n}\n\nexport default {\n assertOptions,\n validators\n};\n","'use strict';\n\nimport utils from './../utils.js';\nimport buildURL from '../helpers/buildURL.js';\nimport InterceptorManager from './InterceptorManager.js';\nimport dispatchRequest from './dispatchRequest.js';\nimport mergeConfig from './mergeConfig.js';\nimport buildFullPath from './buildFullPath.js';\nimport validator from '../helpers/validator.js';\nimport AxiosHeaders from './AxiosHeaders.js';\n\nconst validators = validator.validators;\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n *\n * @return {Axios} A new instance of Axios\n */\nclass Axios {\n constructor(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n }\n\n /**\n * Dispatch a request\n *\n * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)\n * @param {?Object} config\n *\n * @returns {Promise} The Promise to be fulfilled\n */\n request(configOrUrl, config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof configOrUrl === 'string') {\n config = config || {};\n config.url = configOrUrl;\n } else {\n config = configOrUrl || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n const {transitional, paramsSerializer, headers} = config;\n\n if (transitional !== undefined) {\n validator.assertOptions(transitional, {\n silentJSONParsing: validators.transitional(validators.boolean),\n forcedJSONParsing: validators.transitional(validators.boolean),\n clarifyTimeoutError: validators.transitional(validators.boolean)\n }, false);\n }\n\n if (paramsSerializer != null) {\n if (utils.isFunction(paramsSerializer)) {\n config.paramsSerializer = {\n serialize: paramsSerializer\n }\n } else {\n validator.assertOptions(paramsSerializer, {\n encode: validators.function,\n serialize: validators.function\n }, true);\n }\n }\n\n // Set config.method\n config.method = (config.method || this.defaults.method || 'get').toLowerCase();\n\n let contextHeaders;\n\n // Flatten headers\n contextHeaders = headers && utils.merge(\n headers.common,\n headers[config.method]\n );\n\n contextHeaders && utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n (method) => {\n delete headers[method];\n }\n );\n\n config.headers = AxiosHeaders.concat(contextHeaders, headers);\n\n // filter out skipped interceptors\n const requestInterceptorChain = [];\n let synchronousRequestInterceptors = true;\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {\n return;\n }\n\n synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;\n\n requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n const responseInterceptorChain = [];\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n let promise;\n let i = 0;\n let len;\n\n if (!synchronousRequestInterceptors) {\n const chain = [dispatchRequest.bind(this), undefined];\n chain.unshift.apply(chain, requestInterceptorChain);\n chain.push.apply(chain, responseInterceptorChain);\n len = chain.length;\n\n promise = Promise.resolve(config);\n\n while (i < len) {\n promise = promise.then(chain[i++], chain[i++]);\n }\n\n return promise;\n }\n\n len = requestInterceptorChain.length;\n\n let newConfig = config;\n\n i = 0;\n\n while (i < len) {\n const onFulfilled = requestInterceptorChain[i++];\n const onRejected = requestInterceptorChain[i++];\n try {\n newConfig = onFulfilled(newConfig);\n } catch (error) {\n onRejected.call(this, error);\n break;\n }\n }\n\n try {\n promise = dispatchRequest.call(this, newConfig);\n } catch (error) {\n return Promise.reject(error);\n }\n\n i = 0;\n len = responseInterceptorChain.length;\n\n while (i < len) {\n promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);\n }\n\n return promise;\n }\n\n getUri(config) {\n config = mergeConfig(this.defaults, config);\n const fullPath = buildFullPath(config.baseURL, config.url);\n return buildURL(fullPath, config.params, config.paramsSerializer);\n }\n}\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n url,\n data: (config || {}).data\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n\n function generateHTTPMethod(isForm) {\n return function httpMethod(url, data, config) {\n return this.request(mergeConfig(config || {}, {\n method,\n headers: isForm ? {\n 'Content-Type': 'multipart/form-data'\n } : {},\n url,\n data\n }));\n };\n }\n\n Axios.prototype[method] = generateHTTPMethod();\n\n Axios.prototype[method + 'Form'] = generateHTTPMethod(true);\n});\n\nexport default Axios;\n","'use strict';\n\nimport CanceledError from './CanceledError.js';\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @param {Function} executor The executor function.\n *\n * @returns {CancelToken}\n */\nclass CancelToken {\n constructor(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n let resolvePromise;\n\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n const token = this;\n\n // eslint-disable-next-line func-names\n this.promise.then(cancel => {\n if (!token._listeners) return;\n\n let i = token._listeners.length;\n\n while (i-- > 0) {\n token._listeners[i](cancel);\n }\n token._listeners = null;\n });\n\n // eslint-disable-next-line func-names\n this.promise.then = onfulfilled => {\n let _resolve;\n // eslint-disable-next-line func-names\n const promise = new Promise(resolve => {\n token.subscribe(resolve);\n _resolve = resolve;\n }).then(onfulfilled);\n\n promise.cancel = function reject() {\n token.unsubscribe(_resolve);\n };\n\n return promise;\n };\n\n executor(function cancel(message, config, request) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new CanceledError(message, config, request);\n resolvePromise(token.reason);\n });\n }\n\n /**\n * Throws a `CanceledError` if cancellation has been requested.\n */\n throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n }\n\n /**\n * Subscribe to the cancel signal\n */\n\n subscribe(listener) {\n if (this.reason) {\n listener(this.reason);\n return;\n }\n\n if (this._listeners) {\n this._listeners.push(listener);\n } else {\n this._listeners = [listener];\n }\n }\n\n /**\n * Unsubscribe from the cancel signal\n */\n\n unsubscribe(listener) {\n if (!this._listeners) {\n return;\n }\n const index = this._listeners.indexOf(listener);\n if (index !== -1) {\n this._listeners.splice(index, 1);\n }\n }\n\n /**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\n static source() {\n let cancel;\n const token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token,\n cancel\n };\n }\n}\n\nexport default CancelToken;\n","const HttpStatusCode = {\n Continue: 100,\n SwitchingProtocols: 101,\n Processing: 102,\n EarlyHints: 103,\n Ok: 200,\n Created: 201,\n Accepted: 202,\n NonAuthoritativeInformation: 203,\n NoContent: 204,\n ResetContent: 205,\n PartialContent: 206,\n MultiStatus: 207,\n AlreadyReported: 208,\n ImUsed: 226,\n MultipleChoices: 300,\n MovedPermanently: 301,\n Found: 302,\n SeeOther: 303,\n NotModified: 304,\n UseProxy: 305,\n Unused: 306,\n TemporaryRedirect: 307,\n PermanentRedirect: 308,\n BadRequest: 400,\n Unauthorized: 401,\n PaymentRequired: 402,\n Forbidden: 403,\n NotFound: 404,\n MethodNotAllowed: 405,\n NotAcceptable: 406,\n ProxyAuthenticationRequired: 407,\n RequestTimeout: 408,\n Conflict: 409,\n Gone: 410,\n LengthRequired: 411,\n PreconditionFailed: 412,\n PayloadTooLarge: 413,\n UriTooLong: 414,\n UnsupportedMediaType: 415,\n RangeNotSatisfiable: 416,\n ExpectationFailed: 417,\n ImATeapot: 418,\n MisdirectedRequest: 421,\n UnprocessableEntity: 422,\n Locked: 423,\n FailedDependency: 424,\n TooEarly: 425,\n UpgradeRequired: 426,\n PreconditionRequired: 428,\n TooManyRequests: 429,\n RequestHeaderFieldsTooLarge: 431,\n UnavailableForLegalReasons: 451,\n InternalServerError: 500,\n NotImplemented: 501,\n BadGateway: 502,\n ServiceUnavailable: 503,\n GatewayTimeout: 504,\n HttpVersionNotSupported: 505,\n VariantAlsoNegotiates: 506,\n InsufficientStorage: 507,\n LoopDetected: 508,\n NotExtended: 510,\n NetworkAuthenticationRequired: 511,\n};\n\nObject.entries(HttpStatusCode).forEach(([key, value]) => {\n HttpStatusCode[value] = key;\n});\n\nexport default HttpStatusCode;\n","'use strict';\n\nimport utils from './utils.js';\nimport bind from './helpers/bind.js';\nimport Axios from './core/Axios.js';\nimport mergeConfig from './core/mergeConfig.js';\nimport defaults from './defaults/index.js';\nimport formDataToJSON from './helpers/formDataToJSON.js';\nimport CanceledError from './cancel/CanceledError.js';\nimport CancelToken from './cancel/CancelToken.js';\nimport isCancel from './cancel/isCancel.js';\nimport {VERSION} from './env/data.js';\nimport toFormData from './helpers/toFormData.js';\nimport AxiosError from './core/AxiosError.js';\nimport spread from './helpers/spread.js';\nimport isAxiosError from './helpers/isAxiosError.js';\nimport AxiosHeaders from \"./core/AxiosHeaders.js\";\nimport HttpStatusCode from './helpers/HttpStatusCode.js';\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n *\n * @returns {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n const context = new Axios(defaultConfig);\n const instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context, {allOwnKeys: true});\n\n // Copy context to instance\n utils.extend(instance, context, null, {allOwnKeys: true});\n\n // Factory for creating new instances\n instance.create = function create(instanceConfig) {\n return createInstance(mergeConfig(defaultConfig, instanceConfig));\n };\n\n return instance;\n}\n\n// Create the default instance to be exported\nconst axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Expose Cancel & CancelToken\naxios.CanceledError = CanceledError;\naxios.CancelToken = CancelToken;\naxios.isCancel = isCancel;\naxios.VERSION = VERSION;\naxios.toFormData = toFormData;\n\n// Expose AxiosError class\naxios.AxiosError = AxiosError;\n\n// alias for CanceledError for backward compatibility\naxios.Cancel = axios.CanceledError;\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\n\naxios.spread = spread;\n\n// Expose isAxiosError\naxios.isAxiosError = isAxiosError;\n\n// Expose mergeConfig\naxios.mergeConfig = mergeConfig;\n\naxios.AxiosHeaders = AxiosHeaders;\n\naxios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing);\n\naxios.HttpStatusCode = HttpStatusCode;\n\naxios.default = axios;\n\n// this module should only have a default export\nexport default axios\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n *\n * @returns {Function}\n */\nexport default function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n}\n","'use strict';\n\nimport utils from './../utils.js';\n\n/**\n * Determines whether the payload is an error thrown by Axios\n *\n * @param {*} payload The value to test\n *\n * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false\n */\nexport default function isAxiosError(payload) {\n return utils.isObject(payload) && (payload.isAxiosError === true);\n}\n","// -* - coding: utf - 8 -* -\n// Copyright(c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport './App.scss';\nimport Diagnosis from './components/Diagnosis/Diagnosis';\nimport axios from 'axios';\n\nexport const api = axios.create({\n baseURL: `/`\n});\n\nfunction App() {\n document.body.style = 'background: #ececec;';\n localStorage.setItem('token', window.location.search.replace('?token=', ''));\n return (\n
\n \n
\n );\n}\n\nexport default App;\n","// -* - coding: utf - 8 -* -\n// Copyright(c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\nconst reportWebVitals = onPerfEntry => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","// -* - coding: utf - 8 -* -\n// Copyright(c) 2023 Intel Corporation\n//\n// Licensed under the Apache License, Version 2.0(the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nimport React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport './index.scss';\nimport App from './App';\nimport reportWebVitals from './reportWebVitals';\nimport 'bootstrap/dist/css/bootstrap.min.css';\n\nconst root = ReactDOM.createRoot(document.getElementById('root'));\nroot.render(\n \n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"names":["hasOwn","hasOwnProperty","classNames","classes","i","arguments","length","arg","argType","push","Array","isArray","inner","apply","toString","Object","prototype","includes","key","call","join","module","exports","default","factory","__WEBPACK_EXTERNAL_MODULE__245__","__webpack_modules__","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","n","getter","__esModule","d","a","definition","o","defineProperty","enumerable","get","obj","prop","__webpack_exports__","external_commonjs_elkjs_commonjs2_elkjs_amd_elkjs_root_ELK_","external_commonjs_elkjs_commonjs2_elkjs_amd_elkjs_root_ELK_default","src_assign","assign","bind","tgt","_len","srcs","_key","forEach","src","keys","k","src_defaults","nodeDimensionsIncludeLabels","fit","padding","animate","animateFilter","animationDuration","animationEasing","transform","node","pos","ready","stop","nodeLayoutOptions","elk","algorithm","priority","_defineProperties","target","props","descriptor","configurable","writable","elkOverrides","makeNode","options","_cyEle","id","layoutOptions","isParent","dims","layoutDimensions","p","position","x","w","y","h","width","height","scratch","makeEdge","edge","source","data","Layout","instance","Constructor","TypeError","_classCallCheck","this","elkOptions","cy","aspectRatio","protoProps","staticProps","value","layout","eles","nodes","edges","graph","elkNodes","elkEdges","elkEleLookup","children","_i","e","_k","_i2","_k2","_n","isChild","parentK","parent","_i3","_k3","makeGraph","then","filter","layoutPositions","ele","nonempty","kp","getPos","register","cytoscape","require","$$find","arr","predicate","thisArg","LabelElement","_a","params","_b","_c","updateParams","_node","initStyles","cssClass","updateData","updatePosition","tpl","_d","halign","_e","valign","_f","halignBox","_g","valignBox","_align","firstChild","removeChild","DOMParser","parseFromString","body","el","appendChild","getNode","_renderPosition","style","classList","add","prev","_position","val","toFixed","stl","webkitTransform","msTransform","LabelContainer","_elements","addOrUpdateElem","param","payload","cur","nodeElem","document","createElement","removeElemById","updateElemPosition","updatePanZoom","pan","zoom","origin","webkitTransformOrigin","msTransformOrigin","transformOrigin","cyNodeHtmlLabel","_cy","_params","_lc","_cyContainer","container","_titlesContainer","_cyCanvas","querySelector","parentNode","margin","border","outline","enablePointerEvents","createLabelContainer","one","elements","query","isNode","getNodePosition","createNodesCyHandler","wrapCyHandler","on","ev","slice","reverse","is","updateDataOrStyleCyHandler","setTimeout","removed","optArr","define","debounce","Heap","set","toPath","_interopDefaultLegacy","debounce__default","Heap__default","get__default","set__default","toPath__default","_typeof","Symbol","iterator","constructor","_createClass","_defineProperty","_slicedToArray","_arrayWithHoles","_s","_arr","next","done","err","_iterableToArrayLimit","minLen","_arrayLikeToArray","name","from","test","_unsupportedIterableToArray","_nonIterableRest","len","arr2","window$1","window","navigator","typeofstr","typeofobj","typeoffn","typeofhtmlele","HTMLElement","instanceStr","instanceString","fn$6","string","array","elementOrCollection","plainObject","number$1","isNaN","htmlElement","element","collection","_private","single","core","stylesheet","emptyString","match","promise","object","memoize","fn","keyFn","args","memoizedFn","ret","cache","camel2dash","str","replace","v","toLowerCase","dash2camel","toUpperCase","prependCamel","prefix","substring","capitalize","charAt","number","rgba","rgbaNoBackRefs","hsla","hslaNoBackRefs","ascending","b","extend","j","color2tuple","color","colors","colorname2tuple","hex","r","g","base","parseInt","hex2tuple","rgb","m","RegExp","exec","isPct","channel","parseFloat","Math","floor","atLeastOneIsPct","allArePct","alpha","rgb2tuple","hsl","s","l","hue2rgb","q","t","round","hsl2tuple","transparent","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","setMap","map","Error","getMap","performance","pnow","now","Date","raf","requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","msRequestAnimationFrame","performanceNow","DEFAULT_HASH_SEED","DEFAULT_HASH_SEED_ALT","hashIterableInts","entry","hash","hashInt","num","hashIntAlt","seed","combineHashesArray","hashes","hashArrays","hashes1","hashes2","hashString","charCodeAt","hashStrings","hashStringsArray","strs","warningsEnabled","warnSupported","console","warn","traceSupported","trace","MAX_INT$1","Number","MAX_SAFE_INTEGER","trueify","falsify","zeroify","noop$1","error","msg","warnings","enabled","log","copy","clone","uuid","random","_staticEmptyObject","staticEmptyObject","defaults$g","_defaults","opts","filledOpts","optVal","removeFromArray","oneCopy","splice","clearArray","getPrefixedProperty","propName","setPrefixedProperty","Map$1","Map","ObjectMap","_obj","ObjectSet","arrayOrObjectSet","create","size","toArray","_this","has","callback","Set$1","Set","Element","restore","group","_p","autoWidth","autoHeight","autoPadding","compoundBoundsClean","listeners","rstyle","styleCxts","styleKeys","selected","selectable","locked","grabbed","grabbable","pannable","active","animation","current","queue","rscratch","traversalCache","backgrounding","bbCache","bbCacheShift","bodyBounds","overlayBounds","labelBounds","all","main","arrowBounds","renderedPosition","rpos","split","cls","createEmitter","bypass","css","defineSearch","bfs","dfs","roots","directed","root","visit","found","Q","connectedNodes","connectedBy","id2depth","V","_this$byGroup","byGroup","vi","viId","unshift","_loop","shift","pop","vId","depth","prevEdge","prevNode","same","vwEdges","connectedEdges","wId","_ret","connectedEles","path","elesfn$v","breadthFirstSearch","depthFirstSearch","dijkstraDefaults","weight","elesfn$u","dijkstra","_dijkstraDefaults","weightFn","dist","knownDist","unmergeBy","isLoop","getDist","setDist","updateItem","Infinity","distBetween","u","smallestEdge","uvs","edgesTo","edgesWith","intersect","smallestDistance","_weight","smalletsDist","uid","neighbors","neighborhood","vid","vDist","alt","distanceTo","pathTo","S","spawn","elesfn$t","kruskal","numNodes","forest","A","findSetIndex","sort","setUIndex","setVIndex","setU","setV","merge","aStarDefaults","goal","heuristic","elesfn$s","aStar","_aStarDefaults","cMin","cMinId","sid","tid","gScore","fScore","closedSetIds","openSet","openSetIds","cameFrom","cameFromEdge","addToOpenSet","steps","pathNode","pathNodeId","pathEdge","distance","hasElementWithId","wSrc","wTgt","wid","tempScore","floydWarshallDefaults","elesfn$r","floydWarshall","_floydWarshallDefault","N","Nsq","indexOf","atIndex","edgeNext","st","ts","ik","_j","ij","kj","indexOfArgEle","getArgEle","res","to","fromNode","bellmanFordDefaults","elesfn$q","bellmanFord","_bellmanFordDefaults","infoMap","hasNegativeWeightCycle","negativeWeightCycles","numEdges","getInfo","getNodeFromTo","$","info","pred","replacedEdge","checkForEdgeReplacement","node1","node2","info1","info2","srcInfo","tgtInfo","negativeWeightCycleIds","_edge","_src","_tgt","_weight2","srcDist","tgtDist","findNegativeWeightCycles","negativeNodes","numNegativeNodes","start","cycle","smallestId","smallestIndex","c","concat","cycleId","thisStart","_getInfo","sqrt2","sqrt","collapse","edgeIndex","nodeMap","remainingEdges","edgeInfo","sourceIn","targetIn","partition1","partition2","newEdges","contractUntil","metaNodeMap","sizeLimit","elesfn$p","kargerStein","numIter","ceil","pow","LN2","stopSize","edgeIndexes","minCutSize","minCutEdgeIndexes","minCutNodeMap","metaNodeMap2","copyNodesMap","iter","_i4","edgesState","edgesState2","res1","res2","cut","witnessNodePartition","_i5","partitionId","constructComponent","subset","component","contains","components","modelToRenderedPosition","renderedToModelPosition","array2point","getAngleFromDisp","dispX","dispY","atan2","PI","log2","signum","p1","p2","sqdist","dx","dy","inPlaceSumNormalize","total","qbezierAt","p0","qbezierPtAt","bound","min","max","makeBoundingBox","bb","x1","y1","x2","y2","expandBoundingBoxByPoint","expandBoundingBox","expandBoundingBoxSides","top","right","bottom","left","_padding","assignBoundingBox","bb1","bb2","boundingBoxesIntersect","inBoundingBox","boundingBoxInBoundingBox","roundRectangleIntersectLine","nodeX","nodeY","straightLineIntersections","cornerRadius","getRoundRectangleRadius","halfWidth","halfHeight","topStartY","finiteLinesIntersect","rightStartX","bottomStartY","arcIntersections","leftStartX","topLeftCenterX","topLeftCenterY","intersectLineCircle","topRightCenterX","topRightCenterY","bottomRightCenterX","bottomRightCenterY","bottomLeftCenterX","bottomLeftCenterY","inLineVicinity","lx1","ly1","lx2","ly2","tolerance","inBezierVicinity","x3","y3","sqdistToQuadraticBezier","result","discriminant","dum1","term1","r13","acos","cos","solveCubic","index","abs","curX","curY","distSquared","minDistanceSquared","sqdistToFiniteLine","offset","line","lineSq","hypSq","dotProduct","adjSq","pointInsidePolygonPoints","points","up","pointInsidePolygon","basePoints","centerX","centerY","direction","angle","transformedPoints","atan","sin","expandedLineSet","expandPolygon","joinLines","lineSet","currentLineStartX","currentLineStartY","currentLineEndX","currentLineEndY","nextLineStartX","nextLineStartY","nextLineEndX","nextLineEndY","vertices","intersection","pad","currentPointX","currentPointY","nextPointX","nextPointY","offsetX","offsetY","offsetLength","normalizedOffsetX","normalizedOffsetY","checkInEllipse","radius","f","t1","t2","tMin","tMax","inRangeParams","nearIntersectionX","nearIntersectionY","midOfThree","x4","y4","infiniteLines","dx13","dx21","dx43","dy13","dy21","dy43","ua_t","ub_t","u_b","ua","ub","_min","polygonIntersectLine","currentX","currentY","nextX","nextY","intersections","doTransform","shortenIntersection","amount","disp","lenRatio","generateUnitNgonPointsFitToSquare","sides","rotationRadians","generateUnitNgonPoints","fitPolygonToSquare","minX","minY","maxX","maxY","sx","sy","_i6","increment","startAngle","currentAngle","getRoundPolygonRadius","getBarrelCurveConstants","heightOffset","widthOffset","ctrlPtOffsetPct","pageRankDefaults","dampingFactor","precision","iterations","elesfn$o","pageRank","_pageRankDefaults","numNodesSqd","matrix","columnSum","additionalProb","srcId","tgtId","indexOfId","_n3","previous","eigenvector","temp","_j2","_n4","diff","_i7","delta","rank","defaults$f","elesfn$n","degreeCentralityNormalized","indegrees","outdegrees","maxIndegree","maxOutdegree","_currDegree","degreeCentrality","indegree","outdegree","degrees","maxDegree","currDegree","degree","callingEles","_options","incoming","outgoing","k_in","k_out","s_in","s_out","connEdges","dc","dcn","degreeCentralityNormalised","defaults$e","harmonic","elesfn$m","closenessCentralityNormalized","closenesses","maxCloseness","fw","currCloseness","node_i","closeness","closenessCentrality","_defaults2","totalDistance","cc","ccn","closenessCentralityNormalised","defaults$d","elesfn$l","betweennessCentrality","weighted","_C","C","outgoers","openNeighborhood","P","_vid","empty","_v","vEle","getElementById","edgeWeight","_w","_w2","_v2","betweenness","betweennessNormalized","betweennessNormalised","bc","defaults$c","expandFactor","inflateFactor","multFactor","maxIterations","attributes","getSimilarity$1","normalize","M","sum","col","row","_row","mmult","B","expand","_M","inflate","hasConverged","n2","roundFactor","isDuplicate","c1","c2","markovClustering","setOptions$3","id2position","sim","addLoops","isStillMoving","clusters","cluster","assign$2","removeDuplicates","markovClustering$1","mcl","identity","absDiff","addAbsDiff","addSquaredDiff","maxAbsDiff","currentMax","getDistance","getP","getQ","init","post","dim","distances","euclidean","squaredEuclidean","manhattan","clusteringDistance","method","nodeP","nodeQ","impl","defaults$b","sensitivityThreshold","testMode","testCentroids","setOptions$2","type","centroid","mode","randomCentroids","ndim","centroids","classify","buildCluster","assignment","haveMatricesConverged","v1","v2","seenBefore","medoids","randomMedoids","findCost","potentialNewMedoid","cost","updateCentroids","U","numerator","denominator","_n2","updateMembership","_U","fuzzyCMeans","_c2","_c3","assign$1","degreeOfMembership","kClustering","kMeans","newCentroid","kMedoids","curCost","minCosts","fcm","defaults$a","linkage","threshold","addDendrogram","dendrogramDepth","linkageAliases","mergeClosest","dists","mins","minKey","attrs","n1","_dist","merged","key1","key2","getAllChildren","buildDendrogram","leftStr","rightStr","buildClustersFromTree","leaves","hierarchicalClustering","preferredAlias","setOptions$1","retClusters","hierarchicalClustering$1","hca","defaults$9","preference","damping","minIterations","getSimilarity","attr","getPreference","begin","end","includeHoles","off","isFinite","mid","median","mean","assignClusters","exemplars","ei","_ei","affinityPropagation","R","dmp","pref","validPrefs","some","setOptions","old","Rp","se","_i8","max2","maxI","AS","_i9","_j3","_j4","K","_i10","E","_sum","_i11","_j5","exemplarsIndices","indices","findExemplars","clusterIndices","ii","maxSum","_i12","clusterIndex","affinityPropagation$1","ap","hierholzerDefaults","elesfn$k","hierholzer","oddIn","oddOut","startVertex","_hierholzerDefaults","dflag","ind","outd","d1","d2","isEdge","trail","walk","adj","adjTail","adjHead","currentNode","subtour","hopcroftTarjanBiconnected","edgeCount","stack","visitedEdges","biconnectedSearch","low","cutVertex","sourceId","targetId","otherNodeId","edgeId","cutset","nodeId","buildComponent","cutVertices","tarjanStronglyConnected","stronglyConnectedSearch","sourceNodeId","explored","targetNodeId","componentNodes","componentEdges","difference","elesfn$j","htbc","htb","hopcroftTarjanBiconnectedComponents","tsc","tscc","tarjanStronglyConnectedComponents","api","executor","state","fulfillValue","rejectReason","onFulfilled","onRejected","proxy","fulfill","reject","deliver","curr","resolver","execute","execute_handlers","handlers","func","setImmediate","cb","resolve","resolved","ps","resolveAll","rejectAll","vals","doneCount","Promise$1","Promise","Animation","opts2","isCore","isEle","duration","started","playing","hooked","applying","progress","completes","frames","complete","startPosition","startStyle","getAnimationStartStyle","startPan","startZoom","anifn","hook","tAni","addToAnimationPool","play","stopped","pause","rewind","fastforward","time","wasPlaying","completed","swap","_pa","startStyleProp","run","running","define$3","animated","self","styleEnabled","clearQueue","delay","delayAnimation","properties","selfIsArrayLike","isEles","getPropsList","panBy","cyPan","center","centre","centerPan","getCenterPan","fitVp","getFitViewport","boundingBox","vp","getZoomedViewport","zoomed","panned","jumpToEnd","anis","ani_p","notify","define$2","field","bindingEvent","allowBinding","allowSetting","allowGetting","settingEvent","settingTriggersEvent","triggerFnName","immutableKeys","updateStyle","beforeGet","beforeSet","onSet","canSet","change","_ele","removeData","event","triggerEvent","names","i_a","l_a","_i_a","_l_a","_privateFields","_keys","define$1","eventAliasesOn","proto","addListener","listen","unlisten","unbind","removeListener","trigger","emit","pon","promiseOn","events","selector","onArgs","offArgs","elesfn$i","elesfn$h","_classes","changed","classesSet","eleClasses","changedEle","addClass","toggleClass","hasClass","className","toggle","toggleUndefd","il","changedNow","removeClass","flashClass","tokens","metaChar","comparatorOp","boolOp","meta","separator","descendant","child","subject","directedEdge","undirectedEdge","variable","ops","op","Type","stateSelectors","matches","visible","isChildless","isOrphan","isSimple","descending","lookup","selToFn","stateSelectorRegex","cleanMetaChars","$1","replaceLastQuery","examiningQuery","replacementQuery","exprs","regex","populate","_ref","checks","_ref3","_ref5","_ref7","_ref9","_ref11","_ref12","operator","_ref13","_ref14","_ref15","_ref16","currentSubject","compoundCount","lastQ","edgeQuery","srcTgtQ","_source","_target","nhoodQ","neighbor","parentChildQuery","compound","_child","_parent","_parent2","_child2","pcQChecks","ancChQuery","ancestor","_descendant","_ancestor","_ancestor2","_descendant2","adQChecks","modifier","topChk","topType","regexObj","consumeExpr","remaining","expr","consumed","parse$1","parse","inputText","currentQuery","consumeWhitespace","exprInfo","toStringCache","clean","cleanVal","space","checkToString","check","_operator","_field","_operator2","queryToString","lhs","sub","rhs","reduce","chk","valCmp","fieldVal","fieldStr","valStr","isFieldStr","isFieldNum","isValStr","caseInsensitive","notExpr","isIneqCmp","data$1","matches$1","every","sel","stateSelectorMatches","boolCmp","qA","qB","incomers","ancestors","descendants","matching","selectorFunction","text","Selector","addQuery","invalid","selfn","eq","sameText","otherSel","elesfn$g","allAre","selObj","thisLength","anySame","allAreNeighbors","nhood","allAreNeighbours","equal","equals","fn$5","elesfn$e","arg1","arg2","arg3","arg4","selectorOrEles","tch","ch","cacheHit","elesfn$f","parents","commonAncestors","orphans","stdFilter","nonorphans","eleChildren","siblings","not","forEachCompound","includeSelf","recursiveStep","did","hasCompounds","hasCompoundNodes","addChildren","addParent","addParentAndChildren","forEachDown","forEachUp","forEachUpAndDown","removeScratch","removeRscratch","removeAttr","fn$4","elesfn$c","elesfn$d","defineDegreeFunction","includeLoops","defineDegreeBoundsFunction","degreeFn","minDegree","minIndegree","minOutdegree","totalDegree","beforePositionSet","newPos","silent","oldPos","dirtyBoundingBoxCache","positionDef","validKeys","updateCompoundBounds","dirtyCompoundBoundsCache","silentPosition","positions","_fn","startBatch","_pos","endBatch","silentPositions","silentShift","setting","relativePosition","ppos","_hasParent","_relativeToParent","_origin","_ele2","hasParent","relativeToParent","modelPosition","point","modelPositions","renderedPoint","relativePoint","fn$3","elesfn$b","renderedBoundingBox","emitAndNotify","force","batching","update","includeLabels","pstyle","pfValue","includeOverlays","useCache","leftVal","units","rightVal","topVal","bottomVal","widthBiasDiffs","computeBiasValues","diffLeft","biasDiff","diffRight","biasComplementDiff","heightBiasDiffs","diffTop","diffBottom","paddingObject","relativeTo","computePaddingValues","propDiff","propBias","propBiasComplement","biasTotal","noninf","updateBounds","updateBoundsFromBox","b2","prefixedProperty","updateBoundsFromArrow","bounds","headless","halfArW","arrowWidth","srcX","srcY","tgtX","tgtY","midX","midY","bbs","updateBoundsFromLabel","prefixDash","strValue","labelWidth","labelHeight","labelX","labelY","marginX","marginY","rotation","outlineWidth","halfBorderWidth","lh","lw","lw_2","lh_2","bbPrefix","isAutorotate","isPfValue","theta","xo","yo","rotate","px1y1","px1y2","px2y1","px2y2","bbPrefixRot","bbRot","getKey","tf","incudeNodes","includeEdges","includeMainLabels","includeSourceLabels","includeTargetLabels","getBoundingBoxPosKey","ints","hashIntsArray","cachedBoundingBoxImpl","usingDefOpts","defBbOptsKey","currPosKey","isPosKeySame","bbCachePosKey","isDirty","styleDirty","recalculateRenderedStyle","ex1","ex2","ey1","ey2","manualExpansion","isDisplayed","displayed","overlayPadding","underlayPadding","includeUnderlays","wHalf","includeNodes","halfW","outerWidth","halfH","outerHeight","curveStyle","hpts","haystackPts","_temp","pts","bezierPts","linePts","pt","n1pos","n2pos","_temp2","_temp3","gx","gy","bbBody","bbOverlay","bbLabels","boundingBoxImpl","defBbOpts","mainRot","sourceRot","targetRot","filledBbOpts","boundingBoxAt","bbAtOldPos","copyBoundingBox","boundingbox","renderedBoundingbox","fn$2","elesfn$a","defineDimFns","uppercaseName","autoName","labelName","outerName","uppercaseOuterName","paddedHeight","paddedWidth","widthHeight","controlPoints","renderer","getControlPoints","mult","segmentPoints","getSegmentPoints","sourceEndpoint","getSourceEndpoint","targetEndpoint","getTargetEndpoint","midpoint","getEdgeMidpoint","edgePoints","spec","rName","substr","renderedName","getValue","ifEdge","getPoints","ifEdgeRenderedPositions","getPoint","ifEdgeRenderedPosition","dimensions","Event","recycle","returnFalse","returnTrue","isImmediatePropagationStopped","isPropagationStopped","isDefaultPrevented","preventDefault","defaultPrevented","originalEvent","namespace","timeStamp","stopPropagation","stopImmediatePropagation","eventRegex","defaults$8","qualifierCompare","q1","q2","eventMatches","addEventFields","callbackContext","context","beforeEmit","afterEmit","bubble","defaultsKeys","emptyOpts","Emitter","emitting","forEachEvent","handler","qualifier","conf","confOverrides","eventList","evt","makeEventObj","forEachEventObj","listener","removeAllListeners","extraParams","manualCallback","numListenersBeforeEmit","eventObj","_loop2","otherArr","emitterOptions$1","selector1","selector2","once","onceCollection","argSelector$1","elesfn$9","emitter","argSel","elesfn$8","_filter","filterEles","toRemove","absoluteComplement","mutableElements","other","col2","col1Smaller","colS","colL","xor","both","retEles","toAdd","spawnSelf","toAddEle","unmergeAt","unmergedLastEle","lastEleI","lastEle","lastEleId","unmergeOne","unmerge","toRmFn","mapFn","initialValue","valFn","maxEle","minEle","fn$1","union","or","relativeComplement","subtract","and","symmetricDifference","symdiff","fnFilter","filterFn","complement","abscomp","zIndexSort","getDepth","zDepth","depthDiff","getEleDepth","eleDiff","zDiff","poolIndex","elesfn$6","thisSize","first","last","sortFn","sorted","sortByZIndex","srcDepth","tgtDepth","each","typeofUndef","defineSymbolIterator","getLayoutDimensionOptions","elesfn$5","takesUpSpace","bbDim","layoutEles","getMemoizeKey","fnMem","animations","useSpacingFactor","spacingFactor","spacingBb","getFinalPos","spacing","nodesBb","calculateSpacing","ani","easing","fitAni","zoomPanAni","makeLayout","styleCache","cacheStyleFunction","cachePrototypeStyleFunction","selfFn","createLayout","elesfn$4","dirtyStyleCache","dirty","notifyRenderer","batchStyleEles","updatedEles","changedEles","cleanStyle","parsedStyle","property","includeNonDefault","overriddenStyle","getDefaultProperty","numericStyle","numericStyleUnits","renderedStyle","getRenderedStyle","applyBypass","getStylePropertyValue","getRawStyle","removeStyle","removeAllBypasses","removeBypasses","show","hide","effectiveOpacity","parentOpacity","checkCompound","parentOk","defineDerivedStateFunction","specs","ok","edgeOkViaNode","eleTakesUpSpace","eleInteractive","parentInteractive","interactive","noninteractive","eleVisible","edgeVisibleViaNode","hidden","isBundledBezier","renderedCss","removeBypass","removeCss","elesfn$3","defineSwitchFunction","_handler","addlEvents","able","ableField","overrideAble","changedColl","defineSwitchSet","overrideField","autolock","autoungrabify","autounselectify","deselect","unselect","inactive","elesfn$2","defineDagExtremity","disqualified","noIncomingEdges","noOutgoingEdges","defineDagOneHop","oEles","defineDagAllHops","sEles","sElesIds","newNext","nid","defineSourceFunction","sources","defineEdgesWithFunction","otherNodes","edgeData","thisToOther","otherToThis","thisIsSrc","thisIsTgt","defineParallelEdgesFunction","codirected","edge1_p","src1","srcid1","tgtid1","srcEdges1","edge2","edge2data","tgtid2","srcid2","oppdirected","clearTraversalCache","successors","predecessors","otherNode","closedNeighborhood","neighbourhood","closedNeighbourhood","openNeighbourhood","targets","parallelEdges","codirectedEdges","visited","unvisited","visitInComponent","cmpt","componentsOf","Collection","unique","createdElements","elesIds","json","_data","_l","element$1","lazyMap","rebuildMap","elesfn$1","$id","_data2","move","newParentValSpecd","checkSwitch","trueFnName","falseFnName","obj_k","jsons","elesArr","addToPool","cy_p","removeFromElements","_data3","fields","fieldsLength","badSourceOrTarget","_data4","parentId","selfAsParent","restored","_ele3","inside","remove","removeFromPool","elesToRemove","elesToRemoveIds","alreadyAdded","addConnectedEdges","removeEdgeRef","removeParallelRef","pllEdge","alteredParents","removeChildRef","pid","ids","_ele4","pllEdges","elesStillInside","removedElements","_ele6","struct","modifyPool","srcExists","tgtExists","batch","_data5","pidToAssign","updated","_data6","corefn$9","elesByGroup","_jsons2","grs","elesArray","jl","generateCubicBezier","mX1","mY1","mX2","mY2","NEWTON_ITERATIONS","SUBDIVISION_PRECISION","SUBDIVISION_MAX_ITERATIONS","kSplineTableSize","kSampleStepSize","float32ArraySupported","Float32Array","mSampleValues","aA1","aA2","calcBezier","aT","getSlope","getTForX","aX","intervalStart","currentSample","lastSample","guessForT","initialSlope","aGuessT","currentSlope","newtonRaphsonIterate","aA","aB","currentT","binarySubdivide","_precomputed","precompute","calcSampleValues","generateSpringRK4","springAccelerationForState","tension","friction","springEvaluateStateWithDerivative","initialState","dt","derivative","dv","springIntegrateState","dxdt","dvdt","springRK4Factory","have_duration","last_state","initState","time_lapsed","percentComplete","cubicBezier","bezier","percent","easings","linear","spring","getEasedValue","easingFn","roundValue","ease","startProp","endProp","propSpec","easedArr","si","step$1","pEasing","startTime","easingImpl","easingVals","startPos","endPos","valid","endPan","animatingPan","endZoom","animatingZoom","minZoom","maxZoom","_name","easedVal","overrideBypass","startAnimation","stepAll","aniEles","doneEles","stepOne","ranAnis","callbacks","_callbacks","step","ranEleAni","handledThisEle","ranCoreAni","corefn$8","stopAnimationLoop","animationsRunning","startAnimationLoop","beforeRender","willDraw","beforeRenderPriorities","headlessStep","emitterOptions","argSelector","elesfn","corefn$7","png","jpg","bg","jpeg","corefn$6","extension","corefn$5","eventName","eventEles","batchNotifications","notificationsEnabled","destroyed","notifications","bool","noNotifications","batchCount","batchData","rendererDefaults","hideEdgesOnViewport","textureOnViewport","motionBlur","motionBlurOpacity","pixelRatio","desktopTapThreshold","touchTapThreshold","wheelSensitivity","debug","showFps","corefn$4","renderTo","pxRatio","forceRender","resize","invalidateSize","initRenderer","RendererProto","rOpts","destroyRenderer","domEle","_cyreg","childNodes","onRender","offRender","invalidateDimensions","corefn$3","styfn$8","TRUE","ie","cxtMeta","getContextMeta","cxtStyle","getContextStyle","app","applyContextStyle","appliedInitStyle","updateTransitions","diffProps","updateStyleHints","getPropertiesDiff","oldCxtKey","newCxtKey","propDiffs","dualCxtKey","cachedVal","addedProp","cxt","oldHasCxt","newHasCxt","cxtHasDiffed","cxtHasMappedProps","mappedProperties","laterCxtOverrides","laterCxt","cxtKey","prevKey","styleCxtKey","diffPropNames","cxtStyles","contextStyles","retDiffProps","types","diffPropName","cxtProp","eleProp","deleteBypassed","mapped","mapping","fnValue","prevFnValue","retDiffProp","applyParsedProperty","bypassed","propNames","propertyGroupNames","propGrKeys","propertyGroupKeys","propHash","seedKey","getPropertiesHash","oldStyleKey","styleKey","overriddenStyles","grKey","updateGrKey1","updateGrKey2","updateGrKey","updateGrKeyWStr","strVal","parsedProp","propInfo","_grKey","groupKey","normalizedNumberVal","hashOverride","numberVal","enums","haveNormNum","haveNum","multiple","hash1","hash2","_grKey2","grHash","sk","labelDimsKey","labelDimensions","labelKeys","labelKey","labelStyleKey","commonLabel","sourceLabelKeys","sourceLabelKey","sourceLabelStyleKey","targetLabelKeys","targetLabelKey","targetLabelStyleKey","_p$styleKeys","nodeBody","nodeBorder","backgroundImage","pie","nodeKeys","nodeKey","hasPie","clearStyleHints","flatProp","propIsBypass","origProp","origPropIsBypass","flatPropMapping","getVal","checkTriggers","fromVal","toVal","deleteBypass","printMappingErr","mapData","fieldWidth","fieldMax","fieldMin","r1","valueMin","r2","valueMax","g1","g2","b1","a1","a2","clr","calcValue","_fields","_fieldVal","fnRetVal","cleanElements","keepBypasses","anyPrev","styProp","diffProp","fromProp","toProp","initVal","initDt","transitioning","checkTrigger","fromValue","toValue","getTrigger","onTrigger","triggerCheck","checkZOrderTrigger","triggersZOrder","checkBoundsTrigger","triggersBounds","triggersBoundsOfParallelBeziers","styfn$7","_parsedProp","specifiedProps","_name2","_value","_parsedProp2","_prop","prevProp","isColor","isMulti","mutiple","oldValue","propertyNames","styfn$6","px","containerCss","domElement","getComputedStyle","getPropertyValue","styfn$5","isRenderedVal","subproperty","alias","pointsTo","styleProp","getRenderedValue","getValueStringWithUnits","isArrayValue","aniProps","propsObj","chVal","getNonDefaultPropertiesHash","styfn$4","resetToDefault","appendFromJson","defaultLength","styfn$3","selAndBlockStr","blockRem","propAndValStr","removeSelAndBlockFromRemaining","removePropAndValFromRem","selAndBlock","selectorStr","blockStr","invalidBlock","propAndVal","propStr","appendFromString","styfn$2","mapArg","urlRegexes","implicitUnits","percentages","zeroOneNumber","unitless","zeroOneNumbers","nOneOneNumber","nonNegativeInt","integer","nodeSize","numbers","positiveNumber","strictMin","bidirectionalSize","bidirectionalSizeMaybePercent","allowPercent","bidirectionalSizes","sizeMaybePercent","axisDirection","paddingRelativeTo","bgWH","bgPos","bgRelativeTo","bgRepeat","bgFit","bgCrossOrigin","bgClip","bgContainment","fill","bools","lineStyle","lineCap","borderStyle","fontFamily","fontStyle","fontWeight","textDecoration","textTransform","textWrap","textOverflowWrap","textBackgroundShape","nodeShape","overlayShape","compoundIncludeLabels","arrowShape","arrowFill","display","visibility","zCompoundDepth","zIndexCompare","justification","layoutData","mapLayoutData","mapScratch","url","regexes","singleRegexMatchValue","urls","propList","textRotation","polygonPointList","evenMultiple","edgeDistances","edgeEndpoint","singleEnum","validate","valArr","unitsArr","gradientDirection","boundsExpansion","zeroNonZero","val1","val2","any","emptyNonEmpty","str1","str2","empty1","empty2","mainLabel","sourceLabel","targetLabel","behavior","overlay","underlay","transition","nodeSizeHashOverride","edgeLine","ghost","pieBackgroundN","edgeArrow","arrowPrefixes","propGroups","propertyGroups","propGroupNames","aliases","pointsToProp","aliasProp","getDefaultProperties","defaultProperties","rawProps","parsedProps","addDefaultStylesheet","styfn$1","propIsFlat","parseImplWarn","argHash","propCache","parseImpl","passedValue","valueIsString","trim","_mapped","pfValArr","hasEnum","deg","checkEnums","unitsRegex","strictMax","getEmSizeInPixels","propsStr","propsSplit","tuple","enumProp","Style","coreStyle","styfn","clear","ele_p","mapVal","cssRule","append","appendToStyle","fromJson","fromString","corefn$2","newStyle","setStyle","generateStyle","corefn$1","selectionType","selType","panningEnabled","userPanningEnabled","zoomingEnabled","userZoomingEnabled","boxSelectionEnabled","arg0","viewportState","bbe","zoomRange","currentPan","currentZoom","bail","level","pan1","zoom1","zoom2","viewport","zoomDefd","panDefd","zoomFailed","panFailed","z","cancelOnFailedZoom","reset","sizeCache","clientWidth","clientHeight","extent","rb","renderedExtent","multiClickDebounceTime","_int","autolockNodes","autoungrabifyNodes","Core","reg","destroy","readies","head","defVal","def","altVal","rendererOptions","extData","loadExtData","thens","initStyle","initEles","onload","ondone","oldEles","layoutOpts","setElesAndLayout","corefn","isReady","isHeadless","mount","unmount","idInJson","updateEles","gr","toMod","_toMod$_i","_json","parentsToRemove","getFreshRef","defaults$7","circle","grid","avoidOverlap","depthSort","deprecatedOptionDefaults","maximal","acyclic","setInfo","BreadthFirstLayout","maximalAdjustments","rootsArray","comp","compRoots","depths","foundByBfs","addToDepth","pNode","orphanNodes","assignDepthsAt","assignDepths","adjustMaximally","shifted","eInfo","maxDepth","incmr","iInfo","newDepth","changeDepth","enqueue","didShift","minDistance","nbb","cachedWeightedPercent","getWeightedPercent","eleDepth","samples","bf","nDepth","orphanDepth","biggestDepthSize","maxDepthSize","_getInfo2","depthSize","distanceX","distanceY","radiusStepSize","defaults$6","sweep","clockwise","CircleLayout","counterclockwise","dTheta","dcos","dsin","rMin","rx","ry","DEBUG","defaults$5","equidistant","minNodeSpacing","concentric","levelWidth","ConcentricLayout","nodeValues","maxNodeSize","levels","currentLevel","minDist","firstLvlHasMulti","rStep","rDeltaMax","_r","rDelta","_level2","_level3","_dTheta","_r2","_val","defaults$4","animationThreshold","refresh","randomize","componentSpacing","nodeRepulsion","nodeOverlap","idealEdgeLength","edgeElasticity","nestingFactor","gravity","initialTemp","coolingFactor","minTemp","CoseLayout","layoutInfo","createLayoutInfo","printLayoutInfo","randomizePositions","refreshPositions","mainLoop","temperature","getScaledPos","getScaleInBoundsFn","loopRet","frame","separateComponents","thread","isCompound","layoutNodes","idToIndex","graphSet","indexToGraph","layoutEdges","edgeSize","id2cmptId","tempNode","isLocked","cmptId","positionX","positionY","padLeft","padRight","padTop","padBottom","tempGraph","p_id","node_id","node_ix","tempEdge","idealLength","elasticity","sourceIx","targetIx","lca","findLCA","lcaGraph","findLCA_aux","count","graphIx","nodeIx","coseBB","lnode","pctX","pctY","_step","calculateNodeForces","calculateEdgeForces","calculateGravityForces","propagateForces","updatePositions","randomDistance","directionX","directionY","overlap","nodesOverlap","forceX","forceY","point1","findClippingPoint","point2","distanceSqr","dX","dY","overlapX","overlapY","X","Y","H","W","dirSlope","nodeSlope","lx","ly","fx","fy","nodeIndex","offX","offY","childNode","tempForce","limitForce","updateAncestryBoundaries","flag","cid","totalA","usedW","rowH","maxRowW","defaults$3","avoidOverlapPadding","condense","rows","cols","GridLayout","cells","splits","small","large","oRows","oCols","columns","sm","lg","_sm","_lg","cellWidth","cellHeight","cellUsed","used","use","moveToNextCell","id2manPos","rcPos","defaults$2","NullLayout","defaults$1","PresetLayout","posIsFn","copyPosition","getPosition","defaults","RandomLayout","NullRenderer","noop","throwImgErr","BRp$f","arrowShapes","bbCollide","translation","edgeWidth","xRotated","yScaled","transformPoints","retPts","pointsToArr","standardGap","defineArrowShape","defn","collide","roughCollide","draw","arrowShapeImpl","gap","controlPoint","ptsTrans","ctrlPt","ctrlPtTrans","pointsTee","triPts","teePts","pointsTr","circleInside","getArrowWidth","baseCrossLinePts","crossLinePts","shiftFactor","BRp$e","clientX","clientY","offsets","findContainerClientCoords","offsetLeft","offsetTop","scale","containerBB","rect","getBoundingClientRect","styleValue","paddingHor","paddingVer","borderHor","unscaledW","unscaledH","interactiveElementsOnly","isTouch","findNearestElements","nearEdge","nearNode","getCachedZSortedEles","near","edgeThreshold","nodeThreshold","labelThreshold","minSqDist","addEle","sqDist","checkNode","hw","hh","nodeShapes","getNodeShape","checkPoint","checkEdge","rs","styleWidth","widthSq","width2","edgeType","allpts","arSize","arrows","arrowStartX","arrowStartY","srcArrowAngle","arrowEndX","arrowEndY","tgtArrowAngle","midsrcArrowAngle","midtgtArrowAngle","ar","shape","preprop","pre","checkLabel","th","ox","oy","box","x1c","x2c","y1c","y2c","boxBb","nodeBb","startX","startY","endX","endY","allInside","BRp$d","isHaystack","isBezier","isMultibezier","isSegments","isSelf","segpts","i1","i2","i3","bp0x","bp0y","bp1x","bp1y","ctrlpts","ic","midDispX","midDispY","getArrowHeight","arrowWidthCache","BRp$c","getPts","findHaystackPoints","haystack","srcPos","tgtPos","srcW","tgtW","srcH","tgtH","halfRadius","storeEdgeProjections","calculateArrowAngles","recalculateEdgeLabelProjections","calculateLabelAngles","findSegmentsPoints","pairInfo","posPts","intersectionPts","vectorNormInverse","segmentWs","segmentDs","segmentsN","w1","w2","midptPts","adjustedMidpt","findLoopPoints","edgeIsUnbundled","dirCounts","ctrlptDists","ctrlptDist","loopDir","loopSwp","stepSize","loopDist","loopAngle","outAngle","inAngle","String","findCompoundLoopPoints","loopaPos","loopbPos","loopPos","compoundStretchA","compoundStretchB","findStraightEdgePoints","findBezierPoints","edgeIsSwapped","ctrlptWs","bezierN","ctrlptWeight","multi","normctrlptDist","manctrlptDist","sign","distanceFromMidpoint","findTaxiPoints","VERTICAL","HORIZONTAL","LEFTWARD","RIGHTWARD","DOWNWARD","UPWARD","dIncludesNodeBody","taxiDir","rawTaxiDir","taxiTurn","turnIsPercent","taxiTurnPfVal","turnIsNegative","minD","dw","dh","pdx","pdy","subDWH","dxy","dwh","isExplicitDir","isVert","pl","sgnL","forcedDir","getIsTooClose","isTooCloseSrc","isTooCloseTgt","lShapeInsideSrc","lShapeInsideTgt","_lShapeInsideSrc","_lShapeInsideTgt","_y","_x","_x2","_x3","_y2","_y3","_y4","_x4","_x5","_x6","_y5","_y6","tryToCorrectInvalidPoints","srcShape","tgtShape","badStart","badAStart","badEnd","badAEnd","minCpADist","arrowShapeWidth","startACpDist","closeStartACp","endACpDist","closeEndACp","overlapping","cpD","cpL","cpM","cpProj","srcCtrlPtIntn","intersectLine","_cpD","_cpL","_cpM","_radius","_cpProj","tgtCtrlPtIntn","findEndpoints","storeAllpts","checkForInvalidEdgeWarning","loggedErr","findEdgeControlPoints","hashTable","pairId","map2","pairIds","haystackEdges","edgeIsBezier","tableEntry","hasUnbundled","hasBezier","swappedpairInfo","edge1","firstEdge","_curveStyle","_edgeIsUnbundled","calculatedIntersection","srcOutside","srcIntn","tgtOutside","tgtIntn","vector","vectorNorm","passedPairInfo","BRp$b","npos","p1_i","p2_i","tgtArShape","srcArShape","et","lines","segments","hasEndpts","overrideEndpts","srcManEndpt","srcManEndptVal","tgtManEndpt","tgtManEndptVal","cpStart","srcArrowFromPt","manualEndptToPx","trs","lw2","lh2","va","ha","labelIntersect","refPt","intSqdist","labIntSqdist","arrowEnd","edgeEnd","srs","_lw","_lh","_lx","_ly","_lw2","_lh2","_va","_ha","_labelIntersect","_refPt","_intSqdist","_labIntSqdist","_minSqDist","arrowStart","edgeStart","badLine","BRp$a","pushBezierPts","qbezierAt$1","p3","bpts","bezierProjPcts","lpts","recalculateEdgeProjections","BRp$9","content","textX","textY","nodeWidth","nodeHeight","nodePos","textHalign","textValign","applyLabelDimensions","lineAngleFromDelta","lineAngle","setRs","midAngle","createControlPointInfo","startDist","nProjs","addSegment","cp","t0","prevSegment","segment","prevCp","calculateEndProjection","isSrc","cps","totalDist","_cp","_seg","lastSeg","seg","tSegment","segDt","lp0","lp1","bezierAngle","di","d0","_t","vec","vecDist","normVec","lineAt","applyPrefixedLabelDimensions","getLabelText","labelDims","calculateLabelDimensions","lineHeight","numLines","normPerLineHeight","labelLineHeight","pfd","wrapStyle","maxW","overflowAny","wrappedLines","wordsRegex","wordSeparator","lineW","processedLine","words","subline","word","testLine","_maxW","ellipsized","incLastCh","getLabelJustification","cacheKey","labelDimCache","existingVal","fStyle","family","canvas","labelCalcCanvas","c2d","labelCalcCanvasContext","getContext","ds","zIndex","pointerEvents","font","metrics","measureText","calculateLabelAngle","rot","rotStr","labelAutoAngle","labelAngle","sourceLabelAngle","targetLabelAngle","BRp$8","warnedCutRect","makePolygon","BRp$7","elesToUpdate","dirtyStyleCaches","cleanConnected","binder","updateEleCalcs","fns","onUpdateEleCalcsFns","flushRenderedStyleQueue","eleCalcs","isCleanConnected","_rstyle","recalculateNodeLabelProjection","nodeW","nodeH","_p3","_rstyle2","BRp$6","cachedZSortedEles","drag","nondrag","grabTargets","inDragLayer","forceRecalc","updateCachedGrabbedEles","BRp$5","BRp$4","crossOrigin","onLoad","imageCache","image","addEventListener","Image","dataUriPrefix","BRp$3","useCapture","tgtIsDom","supportsPassiveEvents","supportsPassive","capture","passive","bindings","nodeIsDraggable","nodeIsGrabbable","load","isSelected","triggerEvents","isMultSelKeyDown","shiftKey","metaKey","ctrlKey","allowPanningPassthrough","down","downs","allowPassthrough","setInDragLayer","setGrabTarget","isGrabTarget","addToDragList","list","addToList","setGrabbed","addNodesToDrag","innerNodes","addDescendantsToDrag","updateAncestorsInDragLayer","addNodeToDrag","freeDraggedElements","grabbedEles","setFreed","setOutDragLayer","removeGrabTarget","blurActiveDomElement","activeElement","blur","haveMutationsApi","MutationObserver","haveResizeObserverApi","ResizeObserver","removeObserver","mutns","rNodes","removedNodes","observe","childList","registerBinding","onResize","styleObserver","resizeObserver","invalidateCoords","invalidateContainerClientCoordsCache","clickTimeout","didDoubleClick","prevClickTimeStamp","eventInContainer","containerPageCoords","touches","atLeastOnePosInside","tParent","containerIsTarget","hoverData","which","gpos","projectIntoViewport","select","selection","nears","draggedElements","dragData","possibleDragElements","mdownPos","mdownGPos","cxtStarted","cxtEvt","activate","downTime","getTime","cxtDragged","makeEvent","selectedNodes","redrawHint","bgActivePosistion","redraw","tapholdCancelled","clearTimeout","tapholdTimeout","tapholdDuration","draggingEles","dragging","selecting","findNearestElement","isOverThresholdDrag","dx2","dist2","desktopTapThreshold2","multSelKeyDown","goIntoBoxMode","cxtOver","deltaP","justStartedPan","mdPos","dragged","unactivate","didDrag","justStartedDrag","totalShift","dragDelta","updateDragDelta","cxtTap","getAllInBox","eleWouldBeSelected","downWasGrabbed","f1x1","f1y1","f2x1","f2y1","distance1","distance1Sq","center1","modelCenter1","containerWidth","containerHeight","twoFingersStartInside","wheelHandler","scrollingPage","wheelZooming","wheelTimeout","deltaY","wheelDeltaY","wheelDelta","deltaMode","newZoom","gestureStartZoom","scrollingPageTimeout","hasTouchStarted","touchstartHandler","touchmoveHandler","touchcancelHandler","touchendHandler","didDoubleTouch","touchTimeout","prevTouchTimeStamp","distanceSq","touchData","earlier","singleTouchMoved","touchDragEles","cxtDistThreshold","near1","near2","starts","draggedEles","singleTouchStartTime","pinching","sPos","touch0","startGPosition","startGPos","touchTapThreshold2","f1x2","f1y2","f2x2","f2y2","distance2Sq","factorThreshold","distThreshold","lastThreeTouch","didSelect","de_p","_start","distance2","factor","tx","ty","ctrx","ctry","pan2","swipePanning","ctxTapend","ctxTap","startWasGrabbed","rdist2","TouchEvent","pointers","makeTouch","identifier","pointerId","pageX","pageY","radiusX","radiusY","screenX","screenY","addPointer","touch","makePointer","removePointer","addTouchesToEvent","pointerIsMouse","pointerType","updatePointer","BRp$2","nodeShapeImpl","generateEllipse","ellipseWradius","ellipseHradius","newLength","lenProportion","intersectLineEllipse","generateRoundPolygon","allPoints","sourceIndex","destIndex","xDest","yDest","norm","destUv","sourceUv","py","cosTheta","cp0x","cp0y","cp1x","cp1y","orthx","orthy","lowestIntersection","lowestSquaredDistance","squaredDistance","roundPolygonIntersectLine","cutPolygonPoints","squaredCornerRadius","cx","pointInsideRoundPolygon","generateRoundRectangle","diam","generateCutRectangle","cornerLength","generateCutTrianglePts","cl","xBegin","xEnd","yBegin","yEnd","topLeft","topRight","bottomRight","bottomLeft","cPts","cutTrianglePts","generateBarrel","bPts","generateBarrelBezierPts","approximateBarrelCurvePts","m0","m1","m2","curveConstants","hOffset","wOffset","ctrlPtXOffset","isTop","isBottom","barrelCurvePts","getCurveT","curvePts","x0","y0","xMin","xMax","yMin","yMax","coeff","validRoots","sqrtR","denom","solveQuadratic","curveRegions","cornerPts","bezY","generateBottomRoundrectangle","topIntersections","registerNodeShapes","generatePolygon","diamondPoints","star5Points","outerPoints","innerPoints","innerRadius","tagPoints","BRp$1","redrawTotalTime","redrawCount","averageRedrawTime","lastRedrawTime","lastDrawTime","requestedFrame","renderOptions","cbs","beforeRenderCallbacks","startRenderLoop","renderLoopStarted","renderFn","requestTime","skipFrame","render","endTime","BR","BRp","clientFunctions","ctr","stylesheetId","stylesheetAlreadyExists","textContent","insertBefore","triggerMode","initialPan","redraws","motionBlurEnabled","forcedPixelRatio","motionBlurTransparency","motionBlurPxRatio","mbPxRBlurry","minMbLowQualFrames","fullQualityMb","clearedForMotionBlur","eleTxrDeq","lyrTxrDeq","lyrTxrSkip","registerArrowShapes","registerCalculationListeners","invalidateCachedZSortedEles","matchCanvasSize","removeEventListener","disconnect","labelCalcDiv","fullFpsTime","defs","dequeueingSetup","queueRedraw","deqRedrawThreshold","frameStartTime","avgRenderTime","renderTime","deqd","getPixelRatio","frameDuration","timeAvailable","deqFastCost","deqCost","deqAvgCost","deqNoDrawCost","thisDeqd","deq","onDeqd","shouldRedraw","ElementTextureCacheLookup","doesEleInvalidateKey","idsByKey","keyForId","cachesByLvl","lvls","getIdsFor","currKey","deleteIdForKey","addIdForKey","keyHasChangedFor","lvl","caches","getCachesAt","getCache","updateKeyMappingFor","hasCache","setCache","deleteCache","deleteKeyMappingFor","entireKeyInvalidated","invalidateKey","getNumberOfIdsForKey","getTxrReasons","dequeue","downscale","highQuality","initDefaults","drawElement","getBoundingBox","getRotationPoint","getRotationOffset","isVisible","allowEdgeTxrCaching","allowParentTxrCaching","ElementTextureCache","initOptions","onDequeues","setupDequeueing","ETCp","reasons","getTextureQueue","txrH","eleImgCaches","getRetiredTextureQueue","rtxtrQs","retired","getElementQueue","eleCacheQueue","reqs","getElementKeyToQueue","eleKeyToCacheQueue","getElement","reason","eleScaledH","eleScaledW","scaledLabelShown","eleTextBiggerThanMin","eleCache","invalidated","texture","invalidatedWidth","txrQ","txr","addNewTxr","recycleTexture","addTexture","usedWidth","higherCache","scalableFrom","otherCache","deqing","highQualityReq","downscaleReq","oneUpCache","drawImage","setTransform","clearRect","queueElement","lowerCache","_l2","translate","eleCaches","checkTextureFullness","invalidateElements","invalidateElement","isInvalid","getForCachedKey","invalidate","_cache","checkTextureUtility","removeFromQueue","retireTexture","fullnessChecks","minW","makeOffscreenCanvas","rtxtrQ","k2q","existingReq","req","dequeued","cacheExists","onDequeue","offDequeue","LayeredTextureCache","layersByLevel","firstGet","lastInvalidationTime","skipping","eleTxrDeqs","scheduleElementRefinement","refineElementTextures","layersQueue","LTCp","layerIdPool","MAX_INT","makeLayer","layer","elesQueue","getLayers","validateLayersElesOrdering","tmpLayers","layersByLvl","layers","levelIsComplete","canUseAsTmpLvl","checkLvls","dir","checkTempLevels","after","getBb","insert","maxElesPerLayer","allowLazyQueueing","imgLayerCaches","existingLayer","queueLayer","drawEleInLayer","getEleLevelForLayerLevel","setImgSmoothing","drawCachedElement","numElesInLayers","invalidateLayer","updateElementsInLayers","haveLayers","replacement","rLyr","replaces","enqueueElementRefinement","elesQ","hasId","eleDeqs","peek","applyLayerReplacement","requestRedraw","layersInLevel","replaced","CRp$a","polygon","lineTo","triangleBackcurve","firstPt","quadraticCurveTo","triangleTee","trianglePoints","teePoints","beginPath","firstTeePt","moveTo","closePath","circleTriangle","arc","firstTrPt","CRp$9","shiftToOriginWithBb","showLabel","showOverlay","showOpacity","drawNode","drawEdge","drawNodeOverlay","drawEdgeOverlay","drawNodeUnderlay","drawEdgeUnderlay","eleTxrCache","getRotation","getOpacity","opacity","smooth","oldGlobalAlpha","rotPt","getImgSmoothing","globalAlpha","getZeroRotation","getLabelRotation","getTextAngle","getSourceLabelRotation","getTargetLabelRotation","getTextOpacity","requestHighQuality","_r$data","lblTxrCache","slbTxrCache","tlbTxrCache","drawElementUnderlay","drawCachedElementPortion","drawElementOverlay","drawElements","drawCachedElements","drawCachedNodes","drawLayeredElements","lyrTxrCache","CRp$8","drawLabel","shouldDrawOverlay","shouldDrawOpacity","lineOpacity","effectiveLineOpacity","effectiveArrowOpacity","drawLine","strokeOpacity","eleStrokeStyle","drawEdgeTrianglePath","lineWidth","drawEdgePath","drawArrows","arrowOpacity","drawArrowheads","lineJoin","ghostOpacity","effectiveGhostOpacity","drawElementText","drawEdgeOverlayUnderlay","overlayOrUnderlay","usePaths","colorStrokeStyle","canvasCxt","pathCacheHit","lineDashPattern","lineDashOffset","pathCacheKey","pathCache","Path2D","setLineDash","stroke","fillStyle","strokeStyle","normal","triangleHead","drawArrowhead","arrowClearFill","edgeOpacity","gco","globalCompositeOperation","colorFillStyle","drawArrowShape","canvasContext","shapeImpl","arrowPathCache","cachedPath","matchEdgeWidth","CRp$7","img","ix","iy","iw","ih","nodeOpacity","styleObj","getIndexedStyle","repeat","paddingX2","nodeTW","nodeTH","shouldClip","imgOpacity","imgW","cachedW","imgH","cachedH","offsetWidth","offsetHeight","posXUnits","posXPfVal","offXUnits","offXPfVal","posYUnits","posYPfVal","offYUnits","offYPfVal","gAlpha","smoothingEnabled","isSmoothingSwitched","save","clip","safeDrawImage","pattern","createPattern","CRp$6","useEleOpacity","label","textAlign","textBaseline","_label","srcLabel","tgtLabel","applyRotation","drawText","getFontCache","fontCaches","setupTextStyle","labelStyle","labelSize","labelFamily","labelWeight","outlineOpacity","outlineColor","pdash","textAngle","orgTextX","orgTextY","textW","textH","backgroundOpacity","borderOpacity","textBorderWidth","backgroundPadding","bgX","bgY","bgW","bgH","textFill","textBackgroundColor","ctx","roundRect","fillRect","textStroke","textLineWidth","textBorderColor","textBorderStyle","strokeRect","whiteWidth","halfTextW","strokeText","fillText","CRp$5","eleOpacity","urlDefined","numImages","bgImgCrossOrigin","getCachedImage","backgroundTimestamp","darkness","borderWidth","bgOpacity","borderColor","setupShapeColor","bgOpy","eleFillStyle","setupBorderColor","bdrOpy","styleShape","shapePts","nodePathCache","drawShape","drawImages","prevBging","totalCompleted","drawInscribedImage","drawPie","redrawShape","pieOpacity","darken","drawBorder","effGhostOpacity","drawNodeOverlayUnderlay","cyStyle","pieSize","lastPercent","angleStart","angleEnd","CRp$4","contexts","backingStore","backingStorePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","devicePixelRatio","paintCache","paintCaches","needToCreateCache","createGradientStyleFor","shapeStyleName","gradientStyle","createRadialGradient","_end","createLinearGradient","hasPositions","addColorStop","gradientFillStyle","backgroundFill","backgroundColor","gradientStrokeStyle","lineFill","lineColor","mbPxRatio","bufferCanvases","MOTIONBLUR_BUFFER_NODE","MOTIONBLUR_BUFFER_DRAG","canvasWidth","canvasHeight","canvasContainer","CANVAS_LAYERS","canvases","BUFFER_COUNT","textureMult","TEXTURE_BUFFER","forcedContext","forcedZoom","forcedPan","drawAllLayers","forcedPxRatio","drawOnlyNodeLayer","needDraw","canvasNeedsRedraw","textureDraw","inNodeDragGesture","inBoxSelection","motionBlurFadeEffect","prevPxRatio","motionBlurTimeout","mbFrames","clearingMotionBlur","textureDrawLastFrame","NODE","SELECT_BOX","effectiveZoom","effectivePan","prevVp","prevViewport","mbclear","setContextTransform","ePan","eZoom","bufferContexts","textureCache","mpan","DRAG","outsideBgColor","outsideBgOpacity","vpManip","hideEdges","needMbClear","useBuffer","drawDebugPoints","timeToRender","fps","cxtNode","txtNode","cxtDrag","txtDrag","drawMotionBlur","txt","needClear","pxr","motionBlurCleared","CRp$3","arcTo","barrelCurveConstants","sin0","cos0","ellipseStepSize","drawEllipsePath","ellipse","xPos","yPos","rw","rh","CRp$2","b64UriToB64","b64uri","output","mimeType","getB64Uri","toDataURL","quality","toBlob","blob","b64","bytes","atob","buff","ArrayBuffer","buffUint8","Uint8Array","Blob","b64ToBlob","createBuffer","buffer","bufferCanvasImage","ctrRect","full","specdMaxDims","maxWidth","maxHeight","maxScaleW","maxScaleH","buffCanvas","buffCxt","zsortedEles","CRp$1","drawPolygonPath","drawRoundPolygonPath","drawRoundRectanglePath","drawCutRectanglePath","drawBottomRoundRectanglePath","drawBarrelPath","CR","CanvasRenderer","CRp","tapHlOffAttr","tapHlOffStyle","containerStyle","overflow","styleMap","userAgent","setAttribute","topCanvas","pathsEnabled","emptyBb","getCenterOffset","getElementBox","getLabelBox","getSourceLabelBox","getTargetLabelBox","isLabelVisibleAtScale","addTextMargin","getRsPt","oldBackgroundTimestamp","onUpdateEleCalcs","refineInLayers","pathsImpld","path2dEnabled","imageSmoothingEnabled","webkitImageSmoothingEnabled","mozImageSmoothingEnabled","msImageSmoothingEnabled","OffscreenCanvas","incExts","extensions","modules","setExtension","registrant","ext","overrideErr","layoutProto","optLayoutFns","fnName","regStop","getCy","emitterOpts","BaseRenderer","getExtension","bProto","RegistrantRenderer","rProto","Renderer","pName","pVal","_pName","setModule","moduleType","moduleName","getModule","Stylesheet","sheetfn","version","code","defineProperties","ELK","_ref$defaultLayoutOpt","defaultLayoutOptions","_ref$algorithms","algorithms","workerFactory","workerUrl","initialized","Worker","worker","postMessage","PromisedWorker","cmd","catch","_ref2","_ref2$layoutOptions","_ref2$logging","logging","_ref2$measureExecutio","measureExecutionTime","terminate","_this2","resolvers","onmessage","answer","receive","convertGwtStyleError","javaException","cause","backingJsObject","$wnd","nb","xb","Fd","$g","yq","Sq","Es","Jw","Vw","VA","dA","MA","PA","PB","bx","vy","Nz","Yz","Ylb","Ymb","xmb","Fmb","Qmb","gcb","ccb","jcb","jtb","otb","qtb","_fb","bpb","kpb","ppb","Gpb","drb","dzb","fzb","fxb","Vxb","Ovb","byb","zyb","Zyb","_yb","hzb","jzb","lzb","nzb","rzb","zzb","Czb","Ezb","Gzb","Izb","Mzb","bBb","NBb","PBb","RBb","iCb","OCb","SCb","GDb","JDb","fEb","xEb","CEb","GEb","yFb","KGb","tIb","vIb","xIb","zIb","OIb","SIb","TJb","VJb","XJb","XKb","fKb","VKb","VLb","jLb","nLb","GLb","KLb","MLb","OLb","RLb","YLb","bMb","gMb","lMb","pMb","wMb","zMb","CMb","FMb","LMb","zNb","PNb","kOb","pOb","tOb","yOb","FOb","GPb","aQb","cQb","eQb","gQb","iQb","CQb","MQb","OQb","ASb","fTb","kTb","STb","fUb","DUb","VUb","YUb","_Ub","_Wb","QWb","XWb","jVb","DVb","VVb","$Vb","dXb","hXb","lXb","gYb","HYb","SYb","VYb","dZb","P$b","T$b","h1b","m1b","q1b","u1b","y1b","C1b","e2b","g2b","m2b","q2b","u2b","S2b","U2b","W2b","_2b","e3b","h3b","p3b","t3b","w3b","y3b","A3b","M3b","Q3b","U3b","Y3b","l4b","q4b","s4b","u4b","w4b","y4b","L4b","N4b","P4b","R4b","T4b","X4b","I5b","Q5b","T5b","Z5b","l6b","o6b","t6b","z6b","L6b","M6b","P6b","X6b","$6b","a7b","c7b","g7b","j7b","m7b","r7b","x7b","D7b","D9b","b9b","h9b","j9b","l9b","w9b","F9b","hac","jac","pac","uac","Iac","Kac","Sac","obc","rbc","vbc","Fbc","Jbc","Xbc","ccc","fcc","lcc","occ","tcc","ycc","Acc","Ccc","Ecc","Gcc","Zcc","_cc","bdc","fdc","jdc","pdc","sdc","ydc","Adc","Cdc","Edc","Idc","Ndc","Qdc","Sdc","Udc","Wdc","Ydc","aec","hec","jec","lec","nec","uec","wec","yec","Aec","Fec","Jec","Lec","Nec","Rec","Uec","Zec","Zfc","lfc","tfc","xfc","zfc","Ffc","Jfc","Nfc","Pfc","Vfc","_fc","fgc","jgc","lgc","Bgc","ehc","ghc","ihc","khc","mhc","ohc","qhc","yhc","Ahc","Ghc","Ihc","Khc","Mhc","Shc","Uhc","Whc","dic","dlc","blc","flc","hlc","jlc","Glc","Ilc","Klc","Mlc","Mjc","Qjc","Qlc","Ulc","Ylc","Lkc","Nkc","Pkc","Rkc","Xkc","_kc","gmc","kmc","zmc","Fmc","Wmc","$mc","anc","mnc","wnc","Hnc","Jnc","Lnc","Nnc","Pnc","Ync","eoc","Aoc","Coc","Eoc","Joc","Loc","Zoc","_oc","bpc","hpc","kpc","ppc","pFc","Ryc","QCc","PDc","xGc","HGc","JGc","NGc","GIc","iKc","mKc","wKc","yKc","AKc","EKc","KKc","OKc","QKc","SKc","UKc","YKc","aLc","fLc","hLc","nLc","pLc","tLc","vLc","zLc","BLc","DLc","FLc","sMc","JMc","hNc","RNc","ZNc","_Nc","bOc","dOc","fOc","hOc","hRc","jRc","KRc","NRc","NQc","LQc","_Qc","cPc","iPc","kPc","mPc","xPc","zPc","zSc","BSc","GSc","ISc","NSc","TSc","NTc","NVc","oVc","SVc","VVc","XVc","ZVc","bWc","bXc","CXc","FXc","IXc","MXc","UXc","bYc","fYc","oYc","qYc","uYc","pZc","G$c","h0c","N0c","k1c","I1c","Q1c","f2c","i2c","k2c","w2c","O2c","S2c","Z2c","v3c","x3c","R3c","U3c","e4c","w4c","x4c","z4c","B4c","D4c","F4c","H4c","J4c","L4c","N4c","P4c","R4c","T4c","V4c","X4c","Z4c","_4c","_7c","b5c","d5c","f5c","h5c","H5c","Hfd","Zfd","Zed","ged","Jed","Ned","Red","Ved","bbd","mdd","_fd","fgd","kgd","Mgd","Ahd","Ald","Tld","xkd","rmd","knd","Jod","JCd","Bpd","BFd","oFd","bqd","bvd","jvd","yud","Hxd","EBd","aDd","MGd","vHd","RHd","wNd","zNd","CNd","KNd","XNd","$Nd","HPd","lUd","XUd","DWd","GWd","JWd","MWd","PWd","SWd","VWd","YWd","_Wd","xYd","BYd","mZd","EZd","GZd","JZd","MZd","PZd","SZd","VZd","YZd","_Zd","c$d","f$d","i$d","l$d","o$d","r$d","u$d","x$d","A$d","D$d","G$d","J$d","M$d","P$d","S$d","V$d","Y$d","_$d","c_d","f_d","i_d","l_d","o_d","r_d","u_d","x_d","A_d","D_d","G_d","J_d","M_d","P_d","S_d","V_d","Y_d","h5d","U6d","U9d","_8d","fae","hae","kae","nae","qae","tae","wae","zae","Cae","Fae","Iae","Lae","Oae","Rae","Uae","Xae","$ae","ebe","hbe","kbe","nbe","qbe","tbe","wbe","zbe","Cbe","Fbe","Ibe","Lbe","Obe","Rbe","Ube","Xbe","$be","bce","ece","hce","kce","nce","qce","tce","wce","zce","Cce","Fce","Ice","Lce","Oce","Rce","Uce","Xce","ude","Vge","dhe","ol","wb","oPb","nPb","EPb","CPb","gFb","fFb","TRb","SRb","ySb","wSb","PSb","OSb","dTb","bTb","i4b","b4b","D2b","x2b","J6b","D6b","u9b","q9b","$9b","I9b","Umc","Imc","abc","Vac","ZCc","VCc","kCc","hCc","rCc","oCc","Tcc","Occ","xkc","gkc","xDc","rDc","iDc","cDc","kwc","jwc","tJc","jJc","dJc","aJc","Pyc","Nyc","VBc","SBc","CFc","yFc","CUc","wUc","lUc","fUc","sUc","pUc","IUc","GUc","IWc","HWc","_Wc","ZWc","fHc","dHc","f0c","d0c","B0c","A0c","L0c","J0c","LTc","JTc","sTc","rTc","KLc","ILc","wNc","tNc","PYc","OYc","nZc","lZc","q3c","p3c","Z7c","X7c","Z9c","Y9c","_ad","Zad","kdd","idd","$md","Smd","HGd","tGd","hLd","NKd","J6d","Uge","Mvb","uCb","Yb","cj","Dj","df","kf","ah","Ph","Ci","Fk","Ln","zp","Yp","qq","Dq","wr","Ir","sj","sw","xw","Cw","Qw","Rw","Xw","Xv","Sv","eu","Zx","xy","xB","HB","TB","fC","wB","MBb","ZGb","dRb","eRb","__b","njc","mjc","dFc","eFc","nOc","oOc","pOc","qOc","rOc","DVc","FVc","SZc","TZc","c$c","bJd","Cic","Dg","vib","eib","Pib","Vib","$ib","mcb","Mcb","Xcb","Ndb","_db","teb","Qeb","djb","Gjb","Njb","Bjb","lnb","Dnb","anb","Mob","Rob","iob","olb","qub","Tub","Vub","Xub","Zub","tpb","_pb","Wqb","nsb","Rxb","Txb","Xxb","bzb","tzb","vzb","xzb","Kzb","Ozb","iAb","kAb","mAb","BAb","hBb","jBb","nBb","TBb","XBb","QCb","WCb","_Cb","dEb","QGb","YGb","tKb","CLb","JMb","RNb","kQb","mQb","FQb","ETb","UTb","dUb","hUb","EZb","j$b","v$b","J0b","M0b","R0b","U0b","i2b","k2b","o2b","s2b","G2b","I2b","K2b","M2b","W3b","$3b","V4b","u5b","A7b","G7b","J7b","M7b","Mbc","Pbc","lac","nac","qcc","Gdc","$dc","cec","_ec","pfc","Bfc","Lfc","ygc","Dgc","shc","uhc","whc","Chc","Ehc","Ohc","Yhc","Tkc","Vkc","Olc","pnc","rnc","dpc","fpc","GCc","KCc","mDc","jEc","HEc","FEc","qoc","bFc","GFc","iGc","kGc","mGc","$Gc","hIc","lIc","pIc","tIc","xIc","zIc","CIc","LIc","CKc","IKc","MKc","$Kc","cLc","jLc","rLc","xLc","OMc","ZOc","ZRc","aSc","I$c","K$c","M$c","O$c","U$c","n1c","z1c","B1c","Q2c","U2c","z3c","med","Xed","_ed","Qfd","Bgd","$gd","lrd","urd","vrd","wrd","xrd","yrd","zrd","Ard","Brd","Crd","Ird","Krd","Lrd","Mrd","Nrd","Prd","Srd","Yrd","Zrd","_rd","asd","bsd","csd","dsd","msd","osd","qsd","ssd","Wsd","Lsd","thd","qtd","yBd","GBd","MBd","SBd","iCd","YMd","GNd","EPd","EQd","NTd","qOd","lVd","VVd","iYd","RYd","ZYd","z0d","O0d","s0d","W5d","cge","xfe","Tfd","jkb","Vjb","Rkb","Ckb","Lqb","Uhb","lEb","kEb","A_b","UQd","FQd","moc","yXb","Ji","vbb","DB","LB","ZB","lC","EC","wC","SB","j5b","g5b","PXc","ad","As","Zl","Ql","jq","sq","Fq","im","Sz","Rz","Qz","be","gz","Xy","xcb","pcb","tcb","Bdb","Vdb","Ydb","Geb","bgb","Apb","Jpb","utb","rQd","MPd","Bb","tTb","mt","fA","rcb","dCb","Tvb","Ekb","GLd","Uhd","d7d","D2d","Odb","Hcb","Pje","Qje","Tdb","Tqb","gyb","Wvb","KFb","PFb","FFb","pGb","MFb","ZQb","Gxb","Pwb","jUb","PTb","sDb","oDb","zDb","tDb","CWb","HXb","nYb","BYb","fLb","vYb","a2b","wZb","TCc","zJc","uMc","wdc","vKc","twb","oHb","$Gb","LXb","L_b","H_b","p0b","s0b","WMc","VMc","bNc","EPc","CPc","JPc","OPc","w1c","s1c","s7c","Psb","apd","ppd","lDd","YCd","NDd","mFd","vFd","GFd","KPd","OJd","hJd","aQd","SSd","FId","rUd","oUd","NYd","cZd","R8d","o9d","i9d","hee","Dd","yd","Hd","ph","Sh","Wc","oi","Ii","Zdd","QSc","D2c","QXc","e_c","d_c","$k","al","Lk","Kk","Mk","vb","hs","gs","Gp","xp","Lo","Ep","Tp","Wn","wx","un","ov","Mv","Br","Ov","Lw","hz","Yy","MB","eC","Ftb","Atb","zwb","LVb","BD","mlb","fad","gad","KVb","ZVb","KC","IP","Uhe","RVb","rXb","amb","OC","GC","bQ","MVb","NVb","lIb","vfd","nmd","Fyd","xMd","gc","ukd","Dyd","gmd","Dfd","Odc","Ajc","xjc","Ucd","zcd","yjc","Tcd","P6c","sjc","Acd","tjc","rjc","Wyc","Y1c","W1c","Ky","Edb","ED","Ksd","dzc","bzc","Xyc","td","Xr","tC","vC","yC","ocb","qcb","ucb","vcb","fGc","LFc","c0d","kzd","bhd","Rgd","dhd","Cdb","Wdb","Zdb","Feb","Heb","Ccb","Gdb","jfb","akb","Hwb","wVb","qVb","Blb","Glb","cgb","cqd","n8d","z2c","mde","pc","qc","Ki","Kz","Jz","jz","iz","KA","JA","OB","NB","jc","zh","Pi","Gb","GD","Qb","She","Bs","Td","Sd","scb","Oeb","Hfb","Ifb","Ufb","Vfb","Xfb","zob","Yob","Inb","Gob","Az","wrb","vrb","entries","Nhe","createObject","hke","getOwnPropertyNames","xrb","zrb","yrb","Mtb","Vtb","eCb","PC","rdb","_Db","$Db","HGb","IGb","JGb","dLb","zVb","KOb","SFc","M3c","L3c","N3c","O3c","P3c","Q3c","b4c","c4c","d4c","z5c","y5c","A5c","B5c","D5c","E5c","F5c","G5c","Vdd","T$c","Qqb","aDb","R$c","RGc","cEc","iHc","t7c","Qsb","aPb","_Ob","Ixd","zud","dCd","ZBd","fCd","p_b","q_b","d7c","aPc","NJd","DId","Oc","gdb","Vd","sn","Gv","hdb","fdb","Fhd","Ehd","mUd","yFd","xFd","yte","JD","ubb","uvd","h0d","ond","Hhd","Ghd","yod","nUd","Phb","Bod","Lnd","Qnd","Knd","Mnd","zod","pnd","cod","dod","Gnd","wtd","_Kd","Xnd","P3","Ile","Dnd","Hnd","Nnd","j5","Ond","PQd","Fnd","Ate","Bte","xId","Fi","End","Cte","Xse","_nd","qud","ZKd","Dte","C2","Zse","Vnd","_","Ete","G2","Fte","$je","Gte","D2","dte","Hte","Ite","z2","$se","E2","ete","Jte","Kte","F2","fte","B2","_se","Lte","Mte","Nte","Yse","A2","ate","Ote","Pte","Qte","Rte","Ste","CK","Wnd","Znd","Q3","SI","Rnd","Aod","Tnd","Shb","Cod","LFd","KFd","_ve","qZd","p8d","o8d","A9d","Ewe","Y9d","r8d","q8d","Z9d","rEd","Q9","S9","T9","U9","ZI","SD","wI","xI","BI","yK","FI","JI","MI","UI","eae","cae","fb","qb","D","F","G","J","I","L","T","Z","ab","db","eb","gb","hb","ib","jb","kb","lb","mb","ob","pb","aae","O","Qve","Jwe","bue","Kwe","Lwe","jxe","sbb","bJ","UD","Rwe","VD","WD","cJ","XD","Swe","axe","rbb","Vie","Bnd","Rve","nie","fue","Sve","xwe","Dwe","Fwe","Owe","vwe","Cwe","ywe","Khe","cwe","Eve","Gve","Pwe","Qwe","zwe","Hve","Twe","Ive","Uwe","Vwe","Wwe","Xwe","Jve","Ywe","Zwe","$we","_we","bxe","cxe","dxe","exe","Mhe","uwe","Kve","twe","fxe","gxe","hxe","ixe","wwe","Awe","Bwe","_9d","bae","Rhb","JFd","IFd","dae","mvd","lvd","n4c","Srb","enb","fnb","gnb","jnb","Cnb","Uqb","Mqb","tgb","lgb","BCb","Oje","qfb","Xhe","Icb","Rie","Ohe","QD","kgb","NaN","ugb","Mgb","heb","hhb","Mbb","Nbb","xbb","Yje","Sbb","Ibb","ogb","Ygb","bfb","ngb","Hxb","Qwb","_ub","ye","Sub","sd","Bfb","Cfb","Ffb","Lfb","WAb","Tzb","Wsb","pD","aIc","h2c","j4c","tg","cUd","Zod","uqb","N5c","K5c","L5c","I5c","M5c","J5c","c2c","cCb","WHb","VHb","XHb","jVc","ZUc","L2c","K$","tRc","h$","Q$c","J_","OCd","PCd","QCd","RCd","SCd","TCd","UCd","VCd","WCd","XCd","Rge","ege","Afb","aje","Xee","nde","rde","tvd","sue","Uvb","tue","ode","dge","Uee","Vee","Fhe","Ehe","dde","$ce","Iz","xz","zz","Ybb","Wbb","Yf","zf","$f","Hf","rk","ek","gk","pk","yk","Ak","Fj","dr","zr","So","qp","$q","$r","ne","Wo","bu","qu","qv","Px","mC","Lb","rf","Zv","$u","eB","Zfb","Yfb","Emb","Dmb","Vhb","hnb","Hc","inb","Ic","knb","Qc","Dob","dob","uc","Rqb","fob","jt","Mhb","Lp","Iie","sC","GB","FB","EB","Whb","yAb","Vzb","Gqb","Dqb","Csb","Osb","MAb","Nb","Myb","Gc","qDb","wDb","xDb","yDb","BFb","CFb","DFb","EFb","oGb","Ltb","Ktb","Otb","Utb","Ttb","Wtb","$xb","Zxb","$Yb","ZYb","cPb","bPb","dPb","EAb","DAb","a$b","_Zb","FDb","EDb","xUb","wUb","w2b","iVb","hVb","nVb","mVb","OVb","LWb","KWb","a4b","p9b","qgc","pgc","Hmc","FUc","j3c","i_c","h_c","k_c","s_c","r_c","t_c","R0c","Q0c","T0c","Vyc","Uyc","DCc","vCc","Une","r4c","Xrb","s4c","B3c","kKb","Xe","W8c","We","qJb","wJb","Jkb","pJb","uJb","sJb","UHb","Mpb","bIb","Npb","NC","CHb","Rcd","Scd","rJb","lKb","jKb","E3b","tN","ile","Ikb","D3b","N3b","F1","xqb","_Bb","G3b","rqb","K3b","F3b","yNb","wtc","Csc","J6c","H6c","L3b","J3b","e9b","vNb","tyc","uyc","ryc","I6c","d9b","rcd","ncd","Hsc","pcd","f9b","g3c","DQd","fB","getFullYear","nje","getMonth","getDate","nB","oje","uA","ofb","wA","dB","ZA","getHours","setMonth","YA","setHours","$A","setMinutes","_A","setSeconds","bB","cB","wbb","Abb","Cbb","_ie","Gbb","getDay","getTimezoneOffset","mB","pA","Pgd","Ogd","AFd","zFd","tFd","sFd","EFd","DFd","nRd","mRd","u4d","LRd","KRd","y4d","g5d","f5d","Q6d","P6d","pEd","oEd","tZd","rZd","Xge","Wge","jw","Lv","cd","sib","Lpb","tqb","Dbb","ybb","Crb","Vrb","Nvb","Rub","Kub","wcb","Zy","mxb","Gyb","zx","yx","zlb","Dlb","Alb","Flb","aCb","pjb","kqb","VBb","BEb","sBb","yBb","EBb","KBb","tMb","oOb","SOb","SMb","NEb","VEb","sFb","hHb","OHb","FIb","wLb","YRb","zTb","rUb","oWb","SXb","k0b","z5b","T8b","ibc","Cec","rfc","Rfc","Tfc","bgc","ngc","Qhc","$hc","Z0b","Dfc","dgc","Bmc","cWb","I$b","Unc","Oic","Bjc","Yjc","Gkc","Bpc","Jpc","Tpc","cqc","oqc","yqc","Hqc","Uqc","mrc","zrc","Prc","Yrc","fsc","nsc","nzc","zzc","Kzc","Xzc","Dtc","lAc","uAc","CAc","LAc","UAc","aBc","uBc","DBc","MBc","sGc","VIc","EIc","qKc","GKc","lLc","mMc","fMc","ZLc","ZMc","IOc","GQc","PQc","RQc","ARc","rSc","TTc","_Tc","RUc","uVc","hWc","rWc","kXc","uXc","AYc","l$c","Z$c","D_c","O_c","c1c","D3c","O5c","a6c","m2c","W2c","f7c","G7c","j8c","iad","rad","Bad","Nad","ibd","tbd","Ibd","Ubd","gcd","scd","Ycd","udd","Jdd","Eed","bfd","dfd","ffd","Kfd","Mfd","Ofd","vgd","qgd","jrd","krd","mrd","nrd","qrd","rrd","srd","trd","Drd","Frd","Hrd","Jrd","Ord","oo","Yqd","iqd","Ohb","jqd","hqd","Wpd","Rrd","Qrd","meb","Hhe","Dhe","cC","ikd","Q8c","hkd","reb","Upd","Mld","gqd","Xte","Fe","Xqd","BIc","FHc","gIc","Arb","CMc","wMc","NNc","FNc","eCc","ZBc","aCc","Dsd","Urd","Wrd","kGd","nGd","bUd","zVd","C1d","MLd","Wud","f7d","_zd","Y1d","c8d","$Id","_Id","hCd","qAd","e7d","R2d","Wd","dd","PD","KD","LD","Lhe","ND","Em","Xb","Kq","Ob","QNc","Pb","hr","Kc","Bbb","Kbb","Jdb","pfb","cg","ag","oVb","DD","Kb","pVb","RD","CCb","Dfb","Efb","Nfb","Pfb","Qfb","Mfb","Esb","Gsb","Fsb","setTime","fvb","bvb","jvb","nvb","Nqb","Ld","wmb","tCb","X6c","f3c","_Pb","QPb","Xod","jtd","ltd","VPb","yJb","xJb","as","Y8b","X8b","W8b","Cv","sl","vl","Nsd","Msd","$zd","Cyd","nNd","s4d","p4d","w4d","qRd","lcb","ww","hfb","Ny","kB","SC","TC","Hdb","NIb","beb","Fbb","G1b","lrb","Frb","swb","E2c","d3c","Nlb","Klb","zsb","$rb","I_b","B_b","g7c","aad","bad","dad","_9c","Jzc","Fzc","Ezc","fcd","bcd","ccd","oid","Lg","Mg","Gfd","Kkd","k3c","y2d","vkd","wkd","_kd","cld","ald","bld","dld","eld","hmd","imd","omd","pmd","iKd","$Jd","_Jd","_ud","Xg","Vg","Hgb","Zgb","rxb","wxb","MGb","Hkb","xf","xtb","tb","Vq","lr","Osd","q0b","HOb","LOb","IOb","lzd","mBc","Lge","wfe","fNc","eNc","Rpb","i0d","GA","FA","Iy","UVd","TVd","Gg","Bp","Okb","Mlb","llb","Eqb","Ntb","De","Deb","Ctb","hDb","dOb","n_b","txb","bUb","ZTb","zP","jBc","hBc","E6c","F6c","R6c","CQd","UA","RA","SA","TA","gB","vA","fromCharCode","hA","AOc","BOc","COc","RRd","a7d","Pp","mmb","Py","VI","JLd","Uxd","b7d","Oj","T6d","hi","F2d","Tje","R6d","Fc","Hwe","S6d","Tg","rl","ak","Gtd","ytd","t2d","Lq","Rb","rr","Sqb","Bc","pr","yfb","zfb","AD","Yrb","jsb","isb","RJc","V_b","OZb","Su","sCb","Bib","uib","SJc","Eub","kke","xHb","REc","aEc","tEc","OJc","Tbb","HAb","JAb","YAb","aKc","Y6c","mud","Ozd","Ajd","Wzd","otd","ytb","hue","Rld","y5d","atd","ul","KI","Rr","Qr","ntd","htd","gtd","ztb","Ivb","Hvb","pMd","BMd","K4d","N4d","X4d","_4d","C4d","k2d","G4d","I4d","c5d","aj","Jj","Rj","she","xl","Qo","Eb","Fb","Cb","ycb","Db","ur","Gr","Hs","Eg","Uk","Ub","ot","I6d","H6d","Bcb","zcb","Acb","Jfb","Wfb","Xnb","Zob","Ry","Qv","au","xu","kfb","lastIndexOf","ifb","xfb","fcb","Etb","Fxb","Jwb","FCb","$H","ECb","pDb","vDb","nGb","Btb","Asb","_rb","GUb","HUb","cxb","CKb","BKb","tle","NFb","OFb","Lkb","zXb","a1b","iBc","gBc","i3c","B2c","hhd","Sb","n5b","jm","Vp","Oyd","$yd","bzd","sgc","Pu","Xj","Jie","Skb","Vz","gfb","wfb","Pkb","ZBb","Zr","Hsb","Isb","Cmd","Gh","Wwb","tib","Ptb","Xtb","Trb","ksb","mkb","lCb","yCb","lsb","Cg","qg","wNb","St","Zc","O6c","Z6c","b7c","a7c","V6c","Dic","xed","u7c","n7c","AXb","xXb","mf","GRd","dSd","hSd","fSd","sId","dId","zXd","nXd","BXd","DXd","FXd","PXd","RXd","XXd","w1d","V1d","p1d","a3d","xid","ypb","$modCount","MUc","LUc","LCd","KCd","KVc","Hp","FUd","C9d","ade","TD","$ie","_ce","cde","G9d","hde","gde","jde","pe","qe","me","oe","ydb","vdb","Mf","Sf","Hg","bAb","vAb","sNb","pNb","dg","Yg","g4c","Wrb","i4c","wic","B6c","eLc","FJc","$Jb","ZJb","pqb","tdd","sdd","fOb","Axb","Ywb","bOb","gOb","qyb","lyb","_Hb","lle","Kld","_hd","bmd","kpd","Cvd","Atd","Avd","Hi","bRd","c7d","C2d","DAd","uVd","sYd","zyd","YOd","fTd","Xp","cq","LA","XMb","Opb","Sfb","ijb","trb","Aib","Vc","Urb","zc","HD","gRb","iTb","_Qb","sec","NIc","LDc","hSc","HRc","aHb","Zwb","lxb","hxb","J_b","Tod","c7c","PYd","gve","mue","gUd","Q4d","U4d","n5d","i5d","p5d","v5d","t5d","A5d","D5d","d6d","Y5d","tk","j6d","Aj","Nh","Kh","h6d","Ih","Fdb","dfb","Dxb","Cwb","Exb","Dwb","HBb","lfb","S_b","ecd","Zbd","_bd","$bd","zAd","Btd","ujb","Awb","czd","Pyd","fBb","rie","Avb","Bvb","bId","mk","Q2d","Rk","P2d","k3d","$j","H2d","M2d","Kj","zj","Ei","j3d","tn","Hv","Kcb","ke","Ldb","dIc","Nrb","$sb","Tkb","bCb","Pc","Xwb","Kwb","iyb","JCb","GCb","ICb","ntb","ltb","mtb","jzd","sGd","$Gd","ZGd","jmb","Mb","r0b","K_b","mKb","BZb","TNb","uOb","S3b","Z6b","n9b","x$b","LGb","iLb","B6b","C6b","Hgc","Fgc","Ggc","bPc","nYc","L1c","T1c","zCd","IVd","kWd","cWd","HXd","oXd","TXd","ZXd","JXd","LXd","NXd","VXd","_Xd","Nq","Wq","Nu","fr","Hx","Jq","Ru","YEc","WA","Yc","ed","pzb","qvb","fAb","$Bb","HVb","v_b","h5b","k5b","Lbb","zbb","Eje","Fje","iD","Rbb","DHc","EHc","DRb","vSb","aBb","C6c","Lsb","Nsb","Msb","rCb","mCb","dWb","Dnc","Cnc","_Gd","PNd","UNd","y1d","T0d","z1d","gFd","OEd","CEd","DEd","dFd","jFd","Sdd","Ydd","$6c","W6c","G6c","Dsb","Aq","Wm","Ed","vvb","Eeb","iYb","hYb","_Gb","YHb","ZHb","zfe","ige","X6d","W6d","ex","oeb","neb","d$c","e$c","B0b","D0b","Ojc","lHd","R7d","odb","ldb","Evd","Ti","e3c","Vte","Qpd","Spd","Yte","dmd","Tpd","kqd","emd","Kqd","Zj","rAb","pAb","oAb","Ie","IC","JC","Ucb","Tcb","Ceb","Beb","Yeb","Xeb","ddb","cdb","yI","IVb","my","ir","vc","fqb","Vqb","Bsb","Rfb","$lb","Bzb","Aeb","Qyb","vic","uNb","kmb","Xi","q$c","sEc","bVc","hVc","Voc","Toc","qed","pFd","KYd","jgd","MOb","Nr","ejc","djc","$ic","ju","bt","Bfe","rge","SEd","Qpb","oCb","Dkb","wCb","qqb","nmb","Oz","Wyb","Ayb","xL","Kie","Nyb","vqb","wqb","Aub","Cub","ike","jke","MC","$Nb","ZNb","BLb","SVb","oEb","uEb","$Jc","Qgd","s9c","Mr","Lr","mHb","nHb","c3c","Dod","JHd","JMd","UTd","eXd","nWd","lXd","MD","OD","ID","u1d","X1d","Hh","h1d","lse","AAd","jGd","fGd","x6","W1d","Qh","Ty","Sr","Yge","Id","Xm","Jd","Rl","fe","Dc","Ec","Ffe","Hge","Ubb","qD","a4d","kD","Obb","lD","Pbb","mD","Dcb","Ecb","Ddb","Kdb","Ad","QAb","TAb","RAb","g1b","z0b","l1b","Rnc","Zsc","Xsc","ltc","xc","Snc","koc","poc","Iub","_vb","n6c","i6c","m6c","tcd","D6c","oOd","kh","oie","gub","ipb","fpb","nHc","lHc","Pzd","Xzd","jUd","nSd","oSd","DSd","ESd","x0d","Lj","Dm","Cfe","Dge","Efe","nfb","Qhb","irb","Rrb","Vgb","amc","xJc","fkb","bkb","gkb","ckb","cv","ylb","Clb","Lyb","zjb","vCb","Goc","K2c","ese","Nkb","A2c","C2c","i2d","mfb","bKd","Hj","d1d","nlb","Kkb","zpb","Plb","oke","avb","Olb","Jhe","ueb","HMb","IMb","iq","Lub","Rzb","uB","tB","vB","ffb","Iwb","Vsb","d3d","gl","hkc","NAb","kkc","jkc","lOc","mOc","it","gKc","aRb","tPc","DPc","A6d","aLd","TKd","oRd","ote","w2d","t3d","lud","pSd","Qk","h3d","v2d","nk","uId","Dtd","Wh","mdb","zdb","jdb","Vi","ci","Uc","qo","Ix","by","qj","Dfe","zge","qCb","HC","__elementTypeId$","FC","bv","Kfb","ovb","ze","dVb","H1b","pRb","HA","gA","lA","nA","mA","sA","v4c","hm","ux","xx","lmb","NFd","MFd","sZd","b5","a5","c5","d5","f5","h5","g5","i5","k5","l5","m5","n5","o5","p5","q5","t5","v5","u5","$J","O4","T4","U4","O9","E9","AI","DK","v8","u8","X4","V4","CZd","AZd","Pnd","yZd","qve","nve","$nd","WKd","dwe","ewe","fwe","gwe","hwe","rve","vZd","iwe","jwe","kwe","kse","lwe","sve","bte","cte","Cnd","uve","mwe","vve","wve","pve","ove","tve","xve","zZd","BZd","PFd","xZd","bwe","wZd","YFd","QQd","DZd","pTb","NHc","MHc","THc","gCb","Bvd","dYd","f0d","mxd","ct","usb","$c","U6c","Hb","Q_b","LHd","LQd","Qzb","He","Qy","Szb","Uzb","Kpb","Ae","WHc","AYd","$1d","e2d","O6d","L6d","X0d","pdb","Qzd","Yzd","Ms","$o","jrb","umb","fod","vfb","tmb","ve","hpb","Vm","Um","zie","hob","Cc","eob","gob","ec","keb","wtb","kcb","OJb","MJb","QJb","vtb","xkb","Ynd","LPd","Yod","a2d","Gwe","g2d","a1d","b2d","h2d","b1d","Ah","Fg","Xx","Zeb","Zie","Mub","nqd","ctd","Xpd","Aqd","qBb","IBb","OAb","wBb","PAb","CBb","l$b","QIc","rKc","WKc","gPc","Blc","Ggd","pec","Jmc","Bkc","Rmc","Qmc","Omc","Mmc","Pmc","Wwc","_Ac","ZAc","Fqb","wjc","$lc","bmc","cmc","dmc","dle","knc","fnc","uOc","gnc","jnc","inc","uPc","jtc","dnc","ojc","cnc","lnc","enc","c_b","lyc","nyc","xyc","bne","Vje","vmc","smc","tmc","rmc","pmc","omc","Uf","wmc","ymc","xmc","Pid","QEd","KPb","NQd","RQd","JZb","$sc","O2b","P2b","Wod","pQb","prd","ord","JVd","ZVd","cXd","mWd","jXd","Ng","YBd","lBb","Sie","FD","p4b","Gkb","PPb","OPb","NPb","gpb","ODb","LDb","NDb","MDb","nd","POc","vPc","ooc","noc","FSd","U5d","QRc","Vod","Dx","Ex","rz","hashCode","Brb","Oq","mr","vmb","VDb","Ne","Gfb","fVb","pu","hOb","FYb","UZb","K6c","Ay","eod","bod","Gz","$Kd","wjd","Jsd","stackTraceLimit","Xz","Wy","gm","Eob","Fob","grb","hrb","O7d","Cxd","nxd","vyd","$Ec","OQ","kne","KVd","R5d","cIb","THb","kBc","nBc","lid","jh","Sg","hgd","$e","pNd","MKd","Dmd","eue","zUd","vud","qNd","bQc","$Pc","_Pc","FQc","DQc","jle","EQc","kle","YLc","XLc","WLc","aIb","$Cb","ahd","Gf","NGb","UGb","tlb","pCb","vlb","Ksb","Cx","QUb","zUb","Lwb","NJb","zid","sh","hvd","evd","dvd","cvd","g_c","VZc","b$c","setDate","no","Od","Fx","aC","rC","qC","xC","bC","mpd","fmd","Ind","Fod","Ve","Uud","t_b","A4b","BGc","SX","RHc","SHc","BHc","eMc","cMc","vle","dMc","STc","QTc","Yqe","RTc","hK","MHd","ZJd","WId","le","Drb","FLd","Tfb","bq","Wj","uu","vu","RZb","QZb","$_b","F0b","jDb","qXb","aOb","Ake","Bke","Ppb","qs","yG","RBc","qUb","pUb","S8b","J8b","YBc","nCc","_Ic","h8b","EJc","HLc","vMc","eUc","yRc","xRc","qSc","kSc","DOc","W3c","e7c","D1c","E1c","cJd","XMd","lKd","T2d","YId","XOd","eTd","yCc","Aw","UAb","VAb","nr","mie","Jib","xCb","Mkb","Rje","kkb","geb","A0b","l7c","o3d","b3d","wud","p3d","tMc","av","Z1d","S0d","d2d","l1d","U0d","_1d","f2d","q1d","r1d","i1d","e1d","j1d","s1d","m1d","Y0d","hEb","dD","jD","Vbb","rD","Mu","bjc","ajc","iSc","WRc","oRb","qz","dkd","Tdd","cIc","kxd","lxd","$fe","sSd","rSd","uSd","tSd","wSd","vSd","ySd","xSd","ASd","zSd","CSd","BSd","HSd","GSd","JSd","ISd","x$c","b2c","j2d","O1d","R0d","h9d","u3d","f3d","Q8d","I8d","$Tc","ZTc","YTc","Zb","Mc","Ofb","eLd","fLd","Ysb","Jgb","wwb","$i","k_b","Qkb","AQ","jne","l_b","kDb","Ke","iDb","pXb","Nwb","Owb","YXc","gVc","ZXc","o4c","p4c","i6d","s6d","tsb","Ij","y6d","xh","dl","z6d","H2c","h3c","tgc","Zw","Jc","Bh","hc","The","Vhe","Ib","Tb","Jb","eVb","Hke","xpb","$pb","dib","msb","eD","wD","vD","Hje","Ije","aD","hD","oD","tAb","Yzb","orb","Qu","Mie","Oy","m_b","aR","lne","SZb","a5b","e5b","ayc","mwc","F7c","A7c","E7c","G0b","$4b","Wxc","Jsb","Xsb","jxc","j0b","e0b","b5b","i5b","wxc","_4b","d5b","D7c","C7c","Z4b","c5b","f5b","Ypd","Zpd","$pd","_pd","aqd","Ez","sz","yz","Pz","Lz","Cz","Bz","Mz","Hz","Fz","C6d","Wg","Zh","jk","uEc","msc","ksc","gle","lsc","bDc","aDc","z_c","y_c","O_","q_c","p_c","N_","Z0c","Y0c","W_","hPb","gPb","GO","Smc","Tmc","rmb","Qq","ugc","Ko","Xjb","_jb","Wjb","rg","goc","DZc","Nj","Sj","yh","Uqd","ro","dtd","ri","$fb","qEd","wj","sr","nx","xd","E2d","q3d","xud","r3d","JJc","h0b","Nd","Rqd","Bfd","kt","wu","Yj","zb","ite","kVd","Mj","Ok","TOc","UOc","SOc","NOc","$Oc","YOc","OOc","sOc","tOc","HOc","FOc","pPc","XOc","mic","lic","kic","setFullYear","ee","VKd","Yjb","AQb","lge","lSd","mSd","LVd","nYd","Irb","mRb","uFd","FFd","Ucc","Dtb","Itb","Gx","GAb","SAb","Ee","Hub","zub","nke","REb","QEb","MEb","aN","LEb","KEb","ZEb","YEb","UEb","bN","SEb","TEb","aSb","_Rb","XRb","gP","VRb","WRb","D5b","C5b","y5b","ZR","x5b","w5b","Cqc","Bqc","xqc","JW","vqc","wqc","erc","drc","_qc","MW","$qc","Zqc","eBc","dBc","fX","$Ac","GAc","FAc","BAc","cX","zAc","AAc","Npc","Mpc","Ipc","FW","Gpc","Hpc","rsc","qsc","SW","MOc","LOc","DZ","GOc","ZIc","YIc","UIc","mY","TIc","SIc","bMc","aMc","fZ","jMc","iMc","gZ","KQc","JQc","YZ","dUc","cUc","F$","XUc","WUc","PUc","NUc","OUc","XTc","WTc","E$","lWc","kWc","fWc","X$","dWc","eWc","i1c","h1c","a1c","X_","_0c","$0c","H_c","G_c","C_c","P_","B_c","A_c","zHc","Cfd","fRb","FAb","pv","ko","PYb","MYb","NYb","jYb","wyb","oyb","jyb","kyb","nyb","myb","C3c","zUc","Lzd","Uzd","vtd","yUd","RC","Tc","Iv","$b","tjb","Qgb","ihb","lhb","Rgb","Yac","kZb","tNb","hid","uHb","rHb","vHb","sHb","oxd","qSd","CWd","AWd","_6d","qi","bi","oud","Ou","Iu","km","smb","cfb","Fpb","uwb","zhb","Qbb","Ahb","Thb","krb","Erb","b1b","kRb","Gjc","rd","qd","BQc","SRc","g6c","f6c","Uac","gbc","fbc","PHc","XHc","QHc","Psc","yc","VHc","AHc","gtc","KAb","xHc","OHc","JJd","pvb","QYd","UDc","Mi","Ugb","o5b","lHb","kHb","gHb","pN","dHb","eHb","fHb","SHb","RHb","NHb","sN","LHb","KHb","MHb","JIb","IIb","EIb","zN","DIb","CIb","BIb","Kyb","Jyb","Fyb","Cyb","Dyb","Eyb","DTb","CTb","yTb","oP","wTb","vTb","xTb","WXb","VXb","RXb","hQ","QXb","PXb","OXb","Zpc","Ypc","Rpc","GW","Ppc","Opc","Qpc","gqc","fqc","bqc","HW","$pc","aqc","_pc","Lqc","Kqc","Gqc","KW","Eqc","Dqc","Fqc","Kkc","Jkc","Fkc","vV","Ekc","Dkc","Ckc","jsc","isc","esc","RW","csc","dsc","bsc","asc","_rc","Xrc","QW","Vrc","Wrc","Urc","Dzc","Czc","xzc","ZW","uzc","vzc","wzc","YAc","XAc","TAc","eX","QAc","RAc","SAc","yAc","xAc","tAc","bX","rAc","qAc","sAc","PAc","OAc","KAc","JAc","HAc","IAc","QBc","PBc","LBc","jX","JBc","KBc","IBc","yBc","xBc","tBc","hX","qBc","rBc","sBc","HBc","GBc","CBc","iX","BBc","zBc","ABc","wGc","vGc","rGc","PX","oGc","pGc","qGc","zVc","yVc","tVc","O$","sVc","qVc","rVc","vWc","uWc","pWc","Y$","mWc","nWc","oWc","EYc","DYc","zYc","q_","xYc","yYc","wYc","yXc","xXc","sXc","b_","qXc","rXc","pXc","b_c","a_c","Y$c","V$c","W$c","X$c","mbd","lbd","hbd","z1","fbd","ebd","gbd","vad","uad","qad","u1","nad","oad","Thd","Qhd","S2","FAd","fi","uhb","vhb","LC","KNb","ACb","xke","zke","zCb","exb","dL","VRc","Ut","zGc","S6c","gCc","lUb","n8b","mib","kib","kSd","XKd","Yh","$Hb","Lfe","Kfe","bfe","Nfe","vXb","uXb","tXb","sXb","KZc","MZc","Jjc","Pjc","Byb","rj","v1d","gid","oUc","b3c","vRc","pSc","lSc","dBb","vr","m3c","o3c","w9c","b9c","n3c","yHc","nud","pOd","Itd","KLd","Ek","Bwb","ulb","Llb","bid","Pj","nDb","ixb","jxb","kxb","zxb","yxb","iL","uWb","tWb","lWb","SP","hWb","kWb","iWb","jWb","ALb","zLb","vLb","PN","uLb","rLb","sLb","tLb","WMb","VMb","RMb","jO","OMb","NMb","PMb","QMb","WOb","VOb","ROb","CO","OOb","NOb","POb","QOb","GRc","FRc","uRc","wRc","mbc","lbc","VS","dbc","ebc","cbc","oXc","nXc","iXc","a_","hXc","fXc","gXc","eXc","Fjc","Ejc","mV","zjc","Pzc","Ozc","Izc","$W","Gzc","Hzc","ugd","tgd","pgd","k2","mgd","ngd","lgd","ogd","xbd","wbd","rbd","A1","qbd","nbd","obd","pbd","Fad","Ead","Aad","zad","xad","wad","yad","Ied","Hed","Ded","O1","Ced","zed","Bed","Aed","ydd","xdd","I1","rdd","qdd","pdd","x9d","w9d","z9d","y9d","ane","Zrb","Jbb","Ygc","Tnc","zoc","Rwd","Ai","rFd","$d","dDb","ghd","t9c","MCd","Wxd","NCd","Oh","Rh","QSd","mle","sD","tD","Gje","uD","WDc","VDc","$Dc","TDc","rfb","Aid","bk","Pg","xjd","CD","yjd","iid","bLd","fid","vgc","omb","agd","Ac","INb","HNb","FNb","GNb","JNb","uud","gi","Ftd","Xc","Cj","Bve","LAb","__elementTypeCategory$","dub","fub","sgb","vgb","ghb","vge","EA","Scb","es","DCb","nCb","S9b","Ogb","Ggb","Dhb","Ehb","AWb","xWb","yWb","vWb","wWb","zWb","uqc","tqc","mqc","IW","iqc","hqc","kqc","lqc","jqc","bAc","aAc","Vzc","_W","Uzc","Rzc","Szc","Qzc","Tzc","bkc","akc","Xjc","uV","Tjc","Vjc","Wjc","Ujc","Sjc","Htc","Gtc","Ctc","TW","Btc","xtc","ytc","ztc","Atc","S_c","R_c","N_c","Q_","I_c","J_c","M_c","K_c","L_c","S5c","R5c","e1","p$c","o$c","k$c","y_","g$c","f$c","i$c","h$c","j$c","vUb","uUb","mUb","nUb","oUb","mad","lad","ead","cad","Ybd","Xbd","Tbd","C1","Qbd","Sbd","Obd","Pbd","Rbd","cdd","bdd","_1c","hoc","usc","ioc","Jub","Hie","dC","Emc","ple","sfb","toLocaleLowerCase","idb","VWb","mDb","Zsb","xac","Ssc","t9b","Zwc","iZb","Rc","Bid","YKd","lte","lo","vo","Eie","Fie","kcd","jcd","dcd","D1","acd","tHb","wed","aid","cKd","gZd","Qmd","Umd","li","Xcd","ZEc","q7c","lib","dcb","TLc","Qwd","OQd","ADb","My","Qie","Kv","uo","o0b","n0b","NQ","g0b","i0b","f0b","d0b","n8c","m8c","i8c","h8c","g8c","f8c","d8c","c8c","e8c","K7c","J7c","o1","z7c","B7c","Fpc","Epc","Apc","EW","wpc","ypc","vpc","xpc","zpc","upc","Drc","Crc","yrc","OW","wrc","trc","xrc","vrc","urc","rrc","qrc","prc","lrc","NW","irc","hrc","krc","grc","jrc","frc","tzc","szc","lzc","YW","jzc","hzc","fzc","gzc","kzc","izc","Yqc","Xqc","Sqc","LW","Nqc","Mqc","Pqc","Oqc","Rqc","Qqc","wSc","vSc","t$","nSc","mSc","oSc","ycd","xcd","E1","ocd","mcd","lcd","qcd","Rad","Qad","Mad","Kad","Iad","Lad","Gad","Jad","Had","qQd","AId","izd","xj","he","ftd","God","Hod","LLd","Bk","Xdd","ndb","rDb","Uz","Xie","_bb","tdb","RPb","s$c","wkb","hkb","ikb","ekb","pgb","fhb","f4c","l4c","m4c","C0","ole","Bne","Cne","ztd","JAd","LAd","yId","CId","BId","Bt","Nc","ieb","CUb","XZb","c6d","zte","qeb","peb","uCc","Z7b","w8b","v8b","UCc","qDc","xFc","z8b","p8b","y8b","Tne","RLc","Lkd","kmd","lmd","zpd","UUd","VUd","Apd","pQd","PHd","jKd","Rdd","g3d","_o","Fv","Kp","T6c","_Mb","DUd","jmd","$jb","eub","bub","M5b","Odd","Vxc","O5b","N5b","L5b","R_b","K5b","U_b","Fsc","P5b","Qdd","GOb","jfc","Swc","XGc","ku","UHc","nMc","$B","pRd","Jk","r$c","HSb","FSb","Ime","GSb","Jme","ESb","Kme","DSb","Lme","H9b","$Xc","Tqe","Sqe","cme","$Fc","oHc","ZFc","yb","ktb","Bx","Bnc","gKd","Poc","Soc","p7c","Zzb","$zb","uAb","zZb","AZb","aod","MJd","tJb","IJb","KKd","Mve","LKd","Nve","w0b","u0b","v0b","t0b","x0b","y0b","nfd","mfd","sfd","Udd","Wdd","Pdd","kUc","jUc","FTc","iUc","gUc","mTc","gTc","hUc","zic","CHc","tic","xic","Aud","D9","Fcb","wd","WZc","hKd","xk","KFc","cHc","xle","pAc","oAc","kAc","iAc","dAc","gAc","eAc","fAc","cAc","hAc","jAc","Flc","Elc","Alc","KV","tlc","wlc","slc","zlc","vlc","ulc","ylc","xlc","e6c","d6c","_5c","f1","$5c","T5c","X5c","Z5c","U5c","V5c","W5c","Y5c","Hsd","Gsd","Csd","O3","Bsd","ysd","zsd","xsd","Asd","vsd","usd","wsd","XNb","VNb","WNb","Xyb","hyb","dyb","uyb","eyb","T3c","h4c","jkd","F9c","M9b","_$b","stb","cId","HAd","IAd","Wb","crb","n3b","mxc","Bsc","o3b","m3b","l3b","tAd","sAd","aKb","Idd","Ddd","_Jb","phb","ohb","nhb","Hhb","xhb","dhb","Vb","Kje","ZC","fD","Yyb","Jg","ui","f_b","Si","pQc","zjd","Hkd","gNc","vQc","MRd","Ox","Ewb","xwb","xRb","eSb","uSb","qSb","Nbd","Mbd","Hbd","B1","zbd","ybd","Bbd","Gbd","Fbd","Ebd","Cbd","Dbd","Abd","wFb","vFb","rFb","dN","qFb","lFb","mFb","kFb","oFb","pFb","nFb","jFb","iFb","pTc","Zqe","qTc","nTc","$qe","oTc","TQc","PEc","QEc","urb","bZb","o7c","M_b","lBc","Gkd","Txd","ckd","Zqd","drd","lqd","KJd","Be","nD","bdb","__java$exception","lz","btd","gue","Zjb","vkb","yac","mEb","CDb","xyb","fyb","J2c","Etd","ki","Wi","p6c","A6c","Gne","Hne","V1c","URc","dVc","q1c","p1c","QLc","ZEd","pmb","etd","fkd","Cid","jEb","sbd","Zac","Trc","Src","Orc","PW","Frc","Hrc","Irc","Jrc","Krc","Lrc","Nrc","Erc","Grc","Mrc","Ndd","Mdd","J1","Bdd","Add","Edd","Fdd","Hdd","Gdd","Cdd","zdd","vUc","uC","_Ed","Jy","I4b","Uy","Tz","ce","xtd","Vh","xNb","TQb","mSb","VQb","_sd","Pld","lRb","UQb","Mic","Nic","nNb","YMb","aNb","rNd","hj","$C","EDc","Gwb","xVb","sVb","XDb","RDb","AUd","w6c","crd","grd","hrd","Dqd","qmb","WC","YC","QC","jRb","xld","Ykd","qic","nic","w7c","rVb","LCb","PH","j_c","Mre","S0c","ekd","yid","XRc","PZc","nib","Pr","bRc","Ife","dfe","Afe","ue","OYb","Esc","syb","qL","tke","Zmd","icb","Rmd","Qe","q4c","aub","Ss","BG","Gie","whb","nzd","$3","hve","JEd","NEd","oNb","Tt","Nhb","re","Hic","oic","pic","Gic","ai","b4d","c4d","ql","Xdb","jPb","Tle","kPb","iPb","Ule","lPb","Vle","mPb","Wle","Mcc","Ncc","Lcc","Kcc","Icc","Xad","Wad","f9c","Yad","C9c","Sad","s8c","Tad","Y8c","Vad","_8c","Uad","$8c","$Pd","nQd","Ly","Ebb","rwb","yke","j5c","Fkb","Hlb","eDc","HZb","w$c","_Zc","aRc","Rqe","pHb","Re","qHb","Se","Tgb","Bgb","Dgb","Sy","F$c","ss","LUb","JUb","KUb","VQc","Lcd","qtc","wZc","ZZc","$Zc","PVc","jid","And","IEd","PEd","Vk","Sc","mc","j7c","E_b","Ngb","Z1b","A9b","UDb","JDc","cVc","fVc","qKb","AJb","wf","bFd","Kic","Iic","jjc","Tmd","GQd","IQd","q6d","Xk","x6c","Jkd","Vn","Up","qr","Ck","KXb","gic","u4c","qnd","Eid","Jnd","sb","_ic","zId","o1d","vk","wk","kud","Fhb","Lhb","Ghb","c6b","_5b","i6b","Ekd","bkd","eid","jte","Vj","yZb","VOd","QHd","N7d","Gj","Og","Web","cTd","kue","Xh","$hd","lYb","jf","Osc","_Fc","bGc","Rf","loc","zGb","bLb","had","Vcd","Wcd","ej","fj","sud","Zi","vAd","KAd","xAd","ZId","dJd","eJd","Cve","fJd","Dve","k6d","l6d","ved","Efd","RUb","aJd","CUd","EUd","Tee","Uje","a_b","Lwc","owc","Mkd","ttb","CI","hDc","cD","gD","N_b","Gub","yub","lke","mke","O_b","n6d","o6d","aeb","Ev","ln","EZc","QZc","GZc","LFb","Ycc","yOc","t4c","Tj","xFb","GVb","Xkd","Ljc","JOb","t6c","o6c","Q9b","pyc","wyc","N9b","EHb","Htd","Q9c","XGb","MUb","JTb","Vme","qZb","ITb","Iwc","Cwc","aUb","itc","pf","LTb","Byc","zsc","aZb","Y$b","qme","utc","cZb","_Yb","ezc","h0","czc","I2c","Kf","Kgb","Lgb","Zcd","QUc","Dne","b1c","zg","Ug","zvd","Gxd","Di","pvd","lsd","cLb","_Kb","UKb","mKd","nm","wm","W_b","$kd","vyc","zqe","kyc","oyc","syc","zyc","myc","Y9b","U9b","tWd","uWd","vWd","wWd","xWd","yWd","zWd","BWd","FHb","oN","Sje","$Ed","Sxd","Lzc","Cxc","Dxc","pBc","qyc","Ze","wAd","B6d","Zg","Myd","mj","IA","Epb","Hbb","UC","p5b","r5b","t5b","s5b","q5b","m5b","Rwc","Tqc","rHc","yic","fdd","edd","hdd","T9c","gdd","E9c","ddd","r8c","tme","Ree","Ufe","OZc","jhb","Ofe","Zee","$ee","Qsc","gjc","LHc","Zic","cjc","Yic","JHc","fjc","bIc","ijc","hnc","mzd","wCc","vd","BDb","DDb","N9d","Qge","Q9d","R9d","ted","sed","sde","Kge","$l","Vpd","eh","Wje","fh","fvd","vg","uDc","Igb","Zcb","Ue","VOc","aAb","_zb","xM","ROc","QOc","Cjd","Bjd","vjd","EOb","bFb","_Eb","dFb","gNb","Ce","dNb","ELb","ENb","efb","_0d","FMc","gVb","Xgb","mIb","Kjc","Vbc","Wbc","q2c","J8c","OEc","TPb","tyb","ryb","yyb","pyb","xKb","zKb","vKb","AKb","wKb","b0d","xlb","dYb","HFb","umc","r2c","igd","Vqd","k4c","o5c","Ye","UEd","_lb","P9d","wte","fde","ide","Wgb","DN","nJb","mJb","oJb","eJb","dJb","fJb","iJb","hJb","gJb","lJb","kJb","jJb","bJb","aJb","cJb","$Ib","ZIb","_Ib","XIb","WIb","YIb","vjc","cYb","h4b","Dsc","c4b","gkd","nj","Roc","XEd","O9c","oQc","mse","ise","Y3","jse","L9d","ede","bde","Zyd","BPb","K9c","vPb","G8c","qPb","wPb","zPb","yPb","APb","xPb","$Eb","sPb","rPb","tPb","uPb","NWb","ued","JKb","DKb","a0b","P_b","kid","Qg","zld","Zje","tud","PJb","yle","zle","Ale","eVc","zD","yD","xD","u6d","mh","x6d","v6d","kCb","d4d","HLd","rud","Gk","mi","mYb","Nac","zHb","Bub","KCb","HCb","vZb","Qwc","nZb","Ksc","btc","pZb","Nsc","uZb","tXc","jre","FZc","JFb","IFb","AFb","GFb","uAd","jve","uj","BAd","m3d","wo","GF","b0b","Scc","Rcc","Pcc","Aqe","XDc","Y_b","HVc","BVc","FMd","QTd","UPc","Oqe","WPc","XPc","I0c","z0c","G0c","H0c","x0c","E0c","n0c","F0c","o0c","D0c","y8c","uld","JQd","yde","jIb","kIb","IZc","RZc","P1c","N1c","hNb","Gle","iNb","ZMb","jNb","$Mb","XZc","r6c","k6c","jud","Fwb","Dle","Ele","Fle","Nyd","rJc","otc","eyc","hJc","iJc","oJc","yJc","mJc","sY","Iqe","eme","sJc","nJc","Bxc","Ayc","lJc","pJc","kJc","qJc","ZOb","YOb","Vne","Wqd","rTb","TMc","qmc","Uoc","Qoc","s3d","Yxd","H9d","_I","PDb","Me","QDb","sRb","cRb","a$c","AHb","lNb","mNb","xxc","ikc","Kmc","Nmc","dKd","Fve","eKd","EXb","GXb","d_b","pHc","qHc","hQc","aKd","C0b","Ogc","uoc","voc","u$c","M6d","bD","UId","AGb","MSb","Mme","ISb","Nme","JSb","Ome","KSb","LSb","Pme","NSb","Qme","ric","HHc","KHc","gJc","UWc","XWc","NWc","OWc","PWc","MWc","QWc","e9c","TWc","x9c","KWc","wWc","LWc","xWc","RWc","zWc","SWc","BWc","VWc","CWc","WWc","DWc","YWc","FWc","ni","Z_b","p7b","rMc","yxc","bgd","yf","Vt","_tb","VSb","O8c","B8c","YSb","ZSb","$Sb","XSb","_Sb","aTb","USb","SSb","TSb","WSb","RSb","H6b","bd","Xec","ttc","Lhd","Eod","Nhd","lpd","Phd","mQd","VFd","KHd","OFd","Snd","cGd","ird","p6d","v$c","ere","Lld","Khd","Uod","Ohd","PSd","aGd","qUd","dGd","yHb","BHb","O9b","K9b","L9b","V9b","R9b","LZb","JNc","Yke","eFb","Zke","cFb","$ke","aFb","_ke","cfc","AZc","po","Ooc","Vsc","Wsc","l6c","WTb","m8b","q8b","x8b","a8b","YTb","S7b","b8b","XTb","d8b","E$c","t$c","j0d","l0d","oh","rEc","GHc","MVc","qWc","hg","vld","Fkd","wld","tj","t1d","OKd","DJb","MKb","q6c","h6c","dre","y6c","pud","woc","oEc","nEc","WOc","Rpd","Ute","T_b","ixc","Ikd","Zkd","Ui","Eyd","UZc","bEb","BVb","znc","yzc","NZc","HZc","$sd","XId","w6d","t6d","llc","Vwc","nlc","olc","mlc","KXc","LXc","gLd","SQd","E9d","I9d","KDc","Kd","LNb","ONb","WZb","eLb","H3b","C3b","sic","SEc","Rsc","CX","FX","tKc","rRc","F2c","vTc","sRc","HXc","Qlb","Wlb","Md","F6b","WNc","Xac","Fne","Wac","ctc","_ac","qhb","Jje","oQb","wub","xub","S1b","fxc","Qld","gxc","kjc","ujc","qjc","E3c","hsd","sg","rpc","qf","Qj","iud","oA","H1c","F1c","IVc","JVc","AVc","cub","bYb","P9b","Tsc","Dpb","Bpb","Cpb","fje","uke","hCb","wg","SUb","IWb","pWb","mWb","RVc","CVc","c0c","__c","v0c","$_c","t0c","Y_c","p0c","Z_c","r0c","X_c","W_c","a0c","b0c","T_c","k0c","U_c","m0c","V_c","U7c","T7c","W7c","V7c","D9c","O7c","I8c","Q7c","S7c","L7c","pse","P7c","R7c","M7c","t8c","N7c","w8c","iue","ktd","mtd","Dvd","lue","nue","Oi","m6d","Ymd","gh","MQd","HQd","ufb","dkc","ckc","ekc","fkc","oFc","oY","nY","KIc","IHc","jZb","XQc","Qqe","$Tb","dtc","qRc","sZc","yZc","s6c","qec","rec","Gcb","jfd","Vud","og","fld","Rlb","LRb","mme","MRb","KRb","nme","PRb","ome","QRb","pme","NRb","rme","RRb","ORb","NUb","vdc","mkc","lkc","rkc","tkc","skc","qkc","ukc","vkc","Yi","wkc","Znc","H0b","j3b","k3b","uic","VGc","UGc","WGc","TGc","MSc","kTc","lTc","JZc","LZc","ofd","Ax","Q6c","esd","fsd","gsd","zMc","ljc","Zjc","UQc","BGb","Iod","Z2d","Xxd","ffe","qde","ae","Z9b","fac","ktc","Wec","Vec","iCc","p5c","pjc","QVc","mte","nte","ORd","QRd","I2d","swe","K6d","N6d","sKc","cRc","eqd","fqd","dqd","rEb","Cxb","Bxb","sEb","FJb","KJb","JJb","KIb","OKb","SKb","RKb","cOb","JM","rQb","TBc","pCc","jOc","eg","fg","rfd","PKd","SKd","ESc","jTc","FSc","kFd","HEd","BEd","zEd","AEd","GEd","mve","eFd","fFd","hFd","VEd","iFd","aFd","lFd","NFc","YQc","a0d","wi","ti","Gac","Hac","GDc","rUc","qUc","Ffd","PRd","Ilb","Jlb","nEb","PM","tEb","qh","LEd","Wk","tfb","YUc","valueOf","RJb","gIb","fIb","hIb","iIb","SJb","Gqd","Hqd","Iqd","Jqd","TMd","Slb","Tlb","Ulb","Xlb","xGb","YNb","wOb","tpc","spc","MJc","MZb","uRb","d4b","qPc","X_b","Gsc","Spc","tDc","_Uc","Tqd","$od","brd","Fqd","Vlb","DGb","EKb","Idb","Bw","TZb","KZb","gne","zRc","LJd","tde","Fue","Gue","m5c","fs","ll","rA","LNc","$Pb","Lc","UPb","SPb","D$c","Jqe","z6c","xOb","hl","Pgb","Cgb","Sgb","Fgb","bhb","Jhb","CVb","u0d","KTb","gyc","KQ","cne","DYb","Hxc","twc","EYb","MTb","lf","CYb","Fxc","Ixc","Gxc","zwc","OTb","NTb","qYb","oQd","NRd","pi","Ri","vz","tz","wz","uz","cEb","m8d","k8d","h8d","i8d","j8d","l8d","If","Bf","IKb","Q1b","$xc","lfd","M1b","swd","bj","Bhb","Chb","Egb","K4b","DMc","qmd","EId","vyb","BOb","COb","MPb","DOb","eNb","$Ob","AOb","Y5b","Qxd","jj","ILd","dj","pkc","zCc","Rxd","rwd","l5c","ug","gvd","Rg","nTb","hbc","Wne","vNd","Nid","bcb","ecb","GGb","O3b","Ysc","a9b","Rs","XOb","Dac","zac","Xoc","Dyc","CTc","BTc","HTc","uTc","ETc","GTc","H9c","xTc","yTc","zTc","wTc","ATc","DTc","ITc","RBd","KYc","Bre","LYc","IYc","Cre","FYc","Dre","GYc","Ere","JYc","Fre","MYc","Gre","HYc","Hre","NYc","Ire","yld","At","Wzc","nqc","lre","mre","nre","yWc","ore","EWc","qre","GWc","rre","AWc","XXb","T6b","rPc","IAb","dme","Ju","kr","Aac","uKc","bfc","tQb","sGb","qTb","mTb","LSc","xSc","ySc","q$","fme","frd","cue","due","Eqd","Pqd","Qqd","aNc","NLc","OLc","PLc","SLc","f1d","g1d","Yfe","UUb","PFc","ync","TDb","TM","Jke","Kke","SDb","Le","ard","$qd","erd","mqd","xqd","YCc","XCc","YGc","FKb","Woc","RYc","VYc","gZc","fZc","jZc","SYc","_Yc","aZc","bZc","$Yc","cZc","hZc","eZc","ZYc","dZc","iZc","WYc","XYc","YYc","P8c","UYc","TYc","kZc","Ab","kNb","LPb","JPb","IQb","e4b","mzc","AQc","r9b","zbc","HNc","aWc","_Vc","aYb","WQb","jSb","pSb","XQb","YQb","fSb","LQb","tRb","SQb","KQb","yoc","PZb","Asc","Noc","xoc","Jyc","roc","soc","toc","KQd","_Fd","eRc","WSc","ml","AXc","gWc","jXc","zXc","ig","BXc","npd","UKd","mo","DWb","Y2b","vsc","mmd","ste","opd","Sld","VId","Ej","IJc","vQb","uQb","xQb","jcc","ftc","XNc","YNc","VNc","_od","u6c","x1d","wXb","LYb","YZc","Y7b","V7b","G8b","r8b","M8b","E8b","i8b","A8b","F8b","e8b","O8b","P7b","I8b","o8b","H8b","Q8b","C8b","Q7b","D8b","R8b","K8b","P8b","N8b","T7b","_7b","t8b","u8b","k8b","f8b","W7b","U7b","l8b","g8b","L8b","R7b","B8b","j8b","s8b","c8b","$7b","X7b","UWb","qWb","nWb","NHd","Ihb","yhb","thb","aGc","groupCollapsed","fCb","Yie","jCb","groupEnd","dGc","cGc","Jsc","mtc","Lmc","a6b","Txc","bcc","fN","jN","oPc","Rac","jQc","See","F5b","H5b","G5b","b_b","j_b","E5b","eec","QFc","N8d","v8d","t8d","u8d","s8d","Z6d","Tbc","Ubc","TFc","Dub","fFc","DNc","zNc","CNc","ENc","ANc","BNc","cQc","gQc","dQc","fQc","eQc","GNc","Qac","rMb","Igc","aQc","Pq","vGb","yGb","rGb","$doc","documentMode","Zd","Xd","suppressed","Yd","mhb","p2d","R1b","RFc","rQc","$wd","Swd","Twd","Uwd","Vwd","Wwd","Ywd","Xwd","Zwd","hxd","_wd","axd","bxd","cxd","dxd","fxd","exd","gxd","Usc","ybc","wbc","wHb","AYb","Xqe","bTc","bJc","atc","sQb","itd","wQb","V6b","Eac","Fac","o2c","L1b","PGb","o9c","p9c","n9c","q9c","l9c","OCc","vre","wre","xre","B9b","hTc","_Sc","iTc","aTc","D4b","jdd","Rse","ame","wme","yme","_le","QKd","uNd","tNd","eee","uue","Yue","G6b","rAd","e6b","g6b","h6b","htc","k6b","sPc","j6b","f6b","d6b","b6b","jnd","AUc","yUc","BUc","sbc","_D","hjc","hKb","Vgc","hic","Ngc","Xgc","Ugc","oSb","tSb","M9c","bSb","sSb","lSb","kSb","dSb","cSb","iSb","hSb","gSb","nSb","rSb","Qre","Vre","y0c","Rre","w0c","Sre","u0c","Tre","Ure","s0c","Wre","l0c","Xre","Yre","Zre","q0c","Lyc","Tf","p2c","HJb","LJb","QKb","TKb","gJd","x2d","l1","j1","DJ","xK","jK","uK","kL","Bj","YDb","yVb","cNb","qNb","rNb","fTc","cTc","kHc","g_b","N1b","OFc","ywc","uwc","vwc","SGb","gac","dac","eac","Owc","Anc","doc","Gyc","Vf","Iyc","boc","Hyc","coc","Wf","Myc","aoc","oqd","pqd","Zte","$te","rqd","qqd","_te","aue","_qd","CGb","ixd","$ad","Qse","uqe","Fme","Tme","bqe","E4b","ht","lastIndex","nOd","k1d","n1d","B2d","kme","af","cf","K0c","ase","Zpe","q2d","uVb","LP","tVb","ef","ff","JVb","Ijc","hfd","G9c","Mq","Rq","Bg","r9c","ULc","X9b","jg","kg","uGb","FGb","wGb","tGb","EGb","qGb","JQb","_Bc","cyc","LEc","MEc","NEc","JRc","Jh","vh","x6b","YDc","bEc","ZDc","nFc","vDc","dyc","oNc","qNc","rNc","nNc","sNc","pNc","lNc","mNc","fee","kee","nxe","oxe","pxe","qxe","rxe","mxe","wac","tA","Hjc","uh","Zk","Yk","YEd","YFc","axc","UFc","Lf","mHc","eGc","khb","ZJc","yyc","uZc","gRc","dRc","n$","Sqd","wqd","yqd","zqd","sqd","tqd","uqd","vqd","i_b","Msc","etc","X$b","_bc","ysc","BPc","fNb","Y7c","qse","vme","Jre","Eme","Ame","rse","lqe","W$b","VGb","C8c","mgb","Xje","Khb","Wcc","ine","tfd","Neb","Jeb","Keb","Leb","Meb","Tse","qfd","_Mc","qwd","wwd","rRb","iRb","Tge","w5","Axe","nh","W6b","U6b","S6b","WFc","XFc","X2d","Uxc","P1b","iKb","LIb","OGb","Kxc","_Nb","lQc","nQc","mQc","kQc","wQc","zQc","fKd","uk","Sse","_fe","Vfe","lxe","Pxd","gSc","fSc","$Sc","ZSc","XSc","VPc","Te","KMc","LMc","MMc","HQb","$O","e3d","ifd","UVc","eDb","GM","nvd","_Ec","odc","age","YPc","TPc","Bac","Zxd","lj","getMinutes","getSeconds","getMilliseconds","opc","npc","MFc","Fub","RKd","bh","ji","E6b","Oac","Mac","Lsc","Pac","U1b","Yxc","ELd","O1b","Y1b","Mxc","hyc","Jwc","Awc","xwc","Jxc","o8c","sne","$1b","X1b","xsc","V1b","T1b","oTb","xMc","$8b","Z8b","dDc","lde","kde","DPb","Yle","Zle","$le","Zbc","Pmd","c6","v6c","kMc","vZc","kYc","tYc","sYc","J2d","K2d","Xfe","TQd","$$b","uxc","exc","TUb","gf","e0c","Pre","$Mc","$Ic","Of","Pf","Qf","Nf","J4b","Xwc","swc","H4b","rtc","stc","B4b","ptc","bKc","oZb","vxc","Z$b","hZb","mZb","lZb","Mh","uEd","vEd","wEd","sEd","tEd","xEd","yEd","EEd","FEd","lve","xUc","Dbc","Cbc","sTb","UCb","Je","bm","Vvb","em","am","rhb","shb","egb","rgc","Pgc","pwc","Wgc","aEb","rwc","ZDb","Kgc","Lgc","Mgc","mYc","z_","o_","mg","lYc","ZQc","o7b","txc","Dk","zk","WGb","vwd","Gi","eed","fed","bed","aed","ced","Afd","h_b","_z","de","VC","XC","rid","kte","qid","Vcb","dTc","YSc","eTc","VSc","MNc","F8d","H8d","K8d","L8d","M8d","P8d","O8d","w8d","x8d","y8d","z8d","A8d","B8d","C8d","D8d","E8d","G8d","J8d","kKd","Lve","n5c","Jf","jxd","gj","Cyc","EJb","NKb","BUb","oqb","AUb","hf","oBc","wDc","sDc","OUb","Wfe","PUb","AVb","vVb","nc","yUb","sZb","W9b","J9b","T9b","AFc","_sc","Bbc","Abc","rxc","qxc","Ebc","wFc","qY","Ewc","AGc","gg","wPc","fyc","Axc","sxc","Exc","kNc","$wc","hxc","_wc","cxc","Hwc","Dwc","Bwc","cUb","Kyc","_Tb","y$c","KTc","are","bre","zme","Gme","Dme","Hme","Gcd","Bcd","Ocd","Qcd","Hcd","Ccd","Pcd","Ncd","Ecd","Dcd","Mcd","Kcd","Jcd","Vmd","tte","ute","bl","nse","cTb","Rme","Sme","ume","Cme","Zfe","Mwb","pEc","wlb","zQb","zfd","z8c","A9c","Elb","YJc","eYb","_Xb","wsc","_1b","F4b","G4b","j6c","yfd","Ag","y2b","C2b","CZc","xZc","tZc","BZc","zZc","lDb","Lke","Mke","cVb","Isc","IDc","CDc","DDc","ADc","HDc","BDc","FDc","rZb","tZb","ssc","oMc","UMc","pMc","qMc","Cf","vf","rKb","DHb","eKb","GJb","PKb","BJb","pKb","GKb","HKb","CJb","oKb","cKb","KKb","LKb","oc","Ff","dKb","uf","$2b","iyc","kfd","E0b","W1b","V$b","e_b","$Wc","sre","Cy","Df","M8c","ucd","z9c","Jbd","U8c","P9c","X9c","R9c","S9c","V9c","Jcb","yKb","Bmd","dgb","fgb","ggb","hgb","igb","jgb","z2b","w_b","z_b","x_b","y_b","A2b","B2b","xSb","xme","Bme","Fcd","Icd","LOG10E","Gwc","nxc","pje","qje","bje","cje","dje","eje","gje","hje","ije","jje","kje","lje","mje","BA","rje","sje","tje","uje","vje","wje","xje","AA","DA","yA","CA","iQc","Yfd","ded","$dd","Ioc","KJc","Af","Ef","bKb","lbb","_ee","Yee","wxe","afe","uxe","vxe","xxe","c3b","vtc","d3b","gDc","oxc","pxc","fDc","zd","Ctd","Vxd","fYb","$Xb","ZXb","BWb","JWb","SMc","u2c","d9c","N8c","s2c","v2c","_6c","_dd","e7b","DXb","FXb","WJc","xY","wY","VJc","HJc","UJc","TJc","GJc","lMc","Shd","Mhd","Rhd","Jhd","Ihd","Ml","Ol","Tl","Ul","yl","Dl","Kl","El","zl","Jl","Hl","Vl","Wl","Nl","Sl","Pl","efe","wl","tl","Fl","Al","Il","Bl","Gl","Cl","Iue","Hue","pde","Xl","Yl","Zue","bve","_ue","ave","$ue","dm","cm","$bc","NCb","mZc","Kre","xqe","Wmd","_Pd","vte","YXb","Kgd","I9c","jyc","J9c","L9c","N9c","U9c","Bvc","Cvc","Dvc","Evc","byc","yvc","zvc","Avc","awc","Hvc","Kvc","Svc","Eyc","Nvc","Fyc","Pvc","fwc","cwc","Yvc","Wvc","$vc","pvc","qvc","Auc","Ywc","Duc","Lxc","E8c","Twc","Kwc","p8c","Nwc","Xxc","Zxc","Oxc","Qxc","Rxc","Sxc","Pxc","Gvc","avc","$uc","Fvc","Suc","muc","kuc","Xtc","Ytc","buc","Ztc","iuc","cvc","dvc","Luc","uvc","zxc","hvc","Guc","nvc","wuc","yuc","evc","Mtc","Ktc","qwc","Jtc","Juc","bxc","Iuc","dxc","Kuc","Pwc","euc","v9c","v8c","L8c","h9c","Nxc","j9c","Vuc","Xuc","nwc","Itc","Zuc","suc","quc","S8c","kxc","Puc","kvc","Mwc","ouc","_xc","wvc","Uwc","uuc","lxc","Ruc","Fwc","guc","Uuc","huc","Vtc","wwc","Stc","Qtc","Rtc","Utc","Otc","Huc","z$c","vue","wue","xue","BCc","CCc","gee","Mue","Nue","Oue","Pue","Kue","Sue","HVd","BMc","AMc","te","yMc","EMc","IMc","kA","jA","iA","OA","NA","QA","sse","tse","$pe","q8c","x8c","cqe","A8c","ype","F8c","tpe","K8c","g9c","u9c","R8c","mqe","pqe","qqe","vse","T8c","vqe","Xpe","wse","xse","yse","zse","Ase","Bse","Cse","Dse","Ese","Fse","u8c","Lpe","Mpe","Npe","Ope","Ppe","Spe","Qpe","Rpe","Tpe","Upe","Vpe","W9c","wqe","tqe","sqe","i9c","V8c","dqe","X8c","gqe","m9c","hqe","iqe","jqe","kqe","Z8c","c9c","a9c","nqe","D8c","Gse","Hse","rqe","oqe","Ype","B9c","Wpe","y9c","eqe","fqe","_pe","aqe","Ise","H8c","k9c","ntc","Xne","Yne","puc","Zne","$ne","Muc","_ne","aoe","boe","coe","xvc","doe","eoe","foe","goe","nuc","hoe","bvc","ioe","Tuc","joe","koe","loe","moe","noe","_uc","ooe","poe","qoe","luc","roe","soe","toe","uoe","voe","woe","xoe","cuc","yoe","$tc","zoe","vvc","Aoe","Boe","fvc","Coe","ivc","Doe","Eoe","Foe","rvc","Goe","xuc","Hoe","zuc","Ioe","Buc","Joe","Koe","Loe","Moe","Noe","Ooe","Poe","Qoe","Roe","Soe","Toe","Ntc","Uoe","Ltc","Voe","Woe","Xoe","Yoe","bwc","Zoe","$oe","_oe","Tvc","ape","Qvc","bpe","cpe","gwc","dpe","epe","fpe","gpe","hpe","tuc","ipe","ruc","jpe","Wtc","kpe","lpe","Ptc","mpe","Ttc","npe","ope","Ouc","Nuc","Wuc","Yuc","Quc","fuc","juc","duc","_tc","auc","lvc","mvc","gvc","jvc","ovc","tvc","svc","Cuc","Euc","Fuc","vuc","Ivc","Jvc","Lvc","Mvc","Uvc","Vvc","Ovc","Rvc","hwc","iwc","dwc","ewc","Zvc","Xvc","_vc","hfe","ife","ofe","pfe","qfe","tfe","mfe","rfe","ufe","cfe","sfe","nfe","jfe","lfe","kfe","LK","QFd","SFd","RFd","TFd","UFd","WFd","ZFd","$Fd","bGd","eGd","gGd","hGd","XFd","iGd","Oyc","cee","dee","sxe","txe","yue","zue","Aue","Bue","Cue","Due","Eue","Jue","Lue","Que","Rue","Tue","Uue","Vue","Wue","Xue","global","Phe","Qhe","Rhe","Whe","Yhe","Zhe","$he","_he","aie","bie","cie","die","eie","fie","gie","hie","iie","jie","kie","lie","qie","sie","tie","uie","vie","wie","xie","yie","Aie","Bie","Cie","Die","Lie","Nie","Oie","Pie","Tie","Uie","Wie","yje","zje","Aje","Bje","Cje","Dje","Lje","Mje","Nje","_je","ake","bke","cke","dke","eke","fke","gke","pke","qke","rke","ske","vke","wke","Cke","Dke","Eke","Fke","Gke","Ike","Nke","Oke","Pke","Qke","Rke","Ske","Tke","Uke","Vke","Wke","Xke","ale","ble","cle","fle","hle","nle","qle","rle","sle","ule","wle","Ble","Cle","Hle","Jle","Kle","Lle","Mle","Nle","Ole","Ple","Qle","Rle","Sle","Xle","bme","gme","hme","ime","jme","lme","sme","Ume","Wme","Xme","Yme","Zme","$me","_me","dne","ene","fne","hne","mne","nne","pne","qne","rne","tne","une","vne","wne","xne","yne","zne","Ane","Ene","Ine","Jne","Kne","Lne","Mne","Nne","One","Pne","Qne","Rne","Sne","ppe","qpe","rpe","spe","upe","vpe","wpe","xpe","zpe","Ape","Bpe","Cpe","Dpe","Epe","Fpe","Gpe","Hpe","Ipe","Jpe","Kpe","yqe","Bqe","Cqe","Dqe","Eqe","Fqe","Gqe","Hqe","Kqe","Lqe","Mqe","Nqe","Pqe","Uqe","Vqe","Wqe","_qe","cre","fre","gre","hre","ire","kre","tre","ure","yre","zre","Are","Lre","Nre","Ore","$re","_re","bse","cse","dse","fse","gse","hse","ose","Jse","Kse","Lse","Mse","Nse","Ose","Pse","Use","Vse","Wse","gte","hte","pte","qte","rte","xte","Tte","Wte","jue","oue","pue","que","rue","cve","dve","eve","fve","ive","kve","yve","zve","Ave","Ove","Pve","Tve","Uve","Vve","Wve","Xve","Yve","Zve","$ve","awe","nwe","owe","pwe","qwe","rwe","Iwe","Mwe","Nwe","kxe","yxe","zxe","Bxe","Cxe","Dxe","Exe","Fxe","Gxe","Hxe","goog","ac","kc","lc","fc","rc","sc","wc","tc","fd","$w","ax","gd","hd","jd","kd","zy","Qi","ld","md","od","xe","ud","tr","Bd","Cd","Gd","Ku","Lu","Dv","Ym","Jv","pd","so","hp","Pd","jr","Zq","Qd","Gs","Rd","Qs","Ud","lt","Tw","Uw","uy","XAb","nz","message","mz","kz","callee","caller","Wz","XA","ge","je","_B","Lcb","Wcb","Mdb","$db","seb","Peb","dkb","Function","jpb","opb","we","uvb","zvb","Pxb","Qxb","vwb","Oyb","Pyb","Ryb","Syb","Tyb","Vyb","Uyb","eAb","gAb","dAb","qAb","eBb","pBb","vBb","uBb","BBb","Ge","ABb","GBb","$Ab","_Ab","Xzb","VCb","Oe","Pe","WDb","wEb","qEb","pIb","qIb","sf","MIb","zJb","sKb","WKb","gLb","hLb","aLb","FLb","QLb","XLb","aMb","fMb","kMb","sMb","vMb","yMb","BMb","EMb","MNb","NNb","jOb","eOb","yQb","qQb","WPb","XPb","YPb","ZPb","Ig","BQb","EQb","NQb","yRb","CRb","JRb","ERb","uTb","QTb","RTb","WUb","XUb","QVb","UVb","PVb","TP","MWb","PWb","EWb","FWb","GWb","HWb","nf","of","GYb","UYb","DZb","O$b","o_b","Old","b2b","Nld","c2b","d2b","E2b","F2b","Q2b","R2b","Z2b","b3b","g3b","r3b","u3b","s3b","I3b","f4b","k4b","g4b","C4b","l5b","S5b","X5b","n6b","s6b","y6b","I6b","f7b","i7b","TGb","l7b","zS","q7b","s7b","t7b","u7b","v7b","_8b","g9b","s9b","C9b","_9b","aac","bac","tac","Cac","$ac","nbc","qbc","ubc","Gbc","Hbc","Sbc","acc","dcc","kcc","mcc","scc","wcc","vcc","xcc","Qcc","Vcc","ndc","rdc","udc","Kdc","Ldc","Mdc","gec","fec","Eec","Gec","Hec","Tec","dfc","efc","ffc","gfc","hfc","ifc","fBc","iEb","wgc","Zgc","$gc","_gc","ahc","bhc","Qgc","Rgc","chc","Jgc","Sgc","dhc","Tgc","cic","bic","aic","fic","Bic","Jic","Lic","ykc","zkc","Akc","nkc","okc","plc","qlc","rlc","emc","fmc","Dmc","Vmc","nnc","onc","vnc","Hoc","Yoc","Xf","C5c","UBc","Zf","$Bc","jCc","qCc","xCc","ACc","PCc","WCc","lDc","ODc","_Dc","qEc","mFc","zFc","BFc","FFc","VFc","eHc","YHc","ZHc","$Hc","_Hc","eIc","fIc","MIc","PIc","cJc","wJc","dKc","LJc","NJc","eKc","fKc","PJc","QJc","cKc","XJc","NZb","JLc","NMc","uNc","vNc","INc","KNc","kOc","_Oc","qQc","uQc","sQc","tQc","WQc","iRc","pRc","oRc","fRc","nRc","PSc","SSc","HUc","aVc","iVc","nVc","EVc","GVc","SXc","jYc","cYc","dYc","A$c","B$c","C$c","c_c","j1c","ng","r1c","G1c","O1c","a2c","$1c","pg","d2c","M2c","G2c","Y2c","r3c","s3c","t3c","E0","S3c","k5c","jeb","r7c","h1","led","hed","ied","jed","Yyc","Zyc","$yc","azc","_yc","ufd","wfd","xfd","Sfd","cgd","Lgd","ehd","fhd","shd","xg","yg","zhd","Kg","ck","dk","fk","hk","kk","wh","Uj","Ch","Dh","Eh","Fh","yj","Lh","Und","J4","Uh","Th","Bqd","Cqd","Lqd","Mqd","Nqd","Oqd","isd","jsd","ksd","Isd","Vsd","ptd","$h","_h","Nk","sqb","_3","Li","Ni","xi","yi","zi","Bi","oj","pj","ozd","oAd","pAd","GAd","MAd","vBd","wBd","xBd","I4","vj","TEd","KEd","Did","OHd","_Hd","lk","aId","qk","dLd","SMd","GMd","HMd","IMd","UMd","Hk","FNd","NNd","ONd","SNd","TNd","twd","uwd","TOd","UOd","WOd","Ik","aTd","bTd","dTd","RTd","STd","TTd","BUd","SUd","WUd","TUd","Pk","sVd","tVd","nl","fl","kl","Sk","Tk","bYd","cYd","IYd","JYd","iZd","fZd","Xmd","jZd","kZd","lZd","__d","k0d","t0d","W0d","V0d","Z0d","$0d","c1d","o2d","r2d","N2d","O2d","W2d","_2d","c3d","i3d","l3d","CAd","Y6d","s2d","u2d","A2d","G2d","L2d","V2d","Y2d","$2d","n3d","Z8d","$8d","g9d","qgb","D9d","F9d","J9d","B9d","M9d","O9d","S9d","Ll","gfe","Jfe","fm","Wee","_ge","ahe","bhe","che","ohe","phe","qhe","rhe","Ihe","gwtOnLoad","Xbb","dispatch","svd","Z1c","rvd","t2c","Ghe","qvd","saveDispatch","dispatcher","ovd","ELKNode","_ELK","optionsClone","workerThreadsExist","_Worker","ReferenceError","_possibleConstructorReturn","__proto__","getPrototypeOf","subClass","superClass","setPrototypeOf","_inherits","defaultCmp","heapify","heappop","heappush","heappushpop","heapreplace","insort","nlargest","nsmallest","_siftdown","_siftup","cmp","item","lastelt","returnitem","_ref1","_results","_results1","elem","los","startpos","newitem","parentpos","childpos","endpos","rightpos","pushpop","heap","front","condition","format","argIndex","framesToPop","hashClear","hashDelete","hashGet","hashHas","hashSet","Hash","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","ListCache","getNative","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","MapCache","iteratee","baseAssignValue","objValue","castPath","toKey","getRawTag","objectToString","symToStringTag","toStringTag","isFunction","isMasked","isObject","toSource","reIsHostCtor","funcProto","objectProto","funcToString","reIsNative","assignValue","isIndex","customizer","nested","newValue","arrayMap","isSymbol","symbolProto","symbolToString","baseToString","trimmedEndIndex","reTrimStart","isKey","stringToPath","coreJsData","freeGlobal","isKeyable","__data__","baseIsNative","nativeObjectToString","isOwn","tag","unmasked","nativeCreate","reIsUint","reIsDeepProp","reIsPlainProp","maskSrcKey","IE_PROTO","assocIndexOf","getMapData","freeSelf","memoizeCapped","rePropName","reEscapeChar","quote","subString","reWhitespace","toNumber","nativeMax","nativeMin","wait","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","invokeFunc","shouldInvoke","timeSinceLastCall","timerExpired","trailingEdge","timeWaiting","remainingWait","debounced","isInvoking","leadingEdge","cancel","flush","baseGet","defaultValue","baseGetTag","isObjectLike","memoized","Cache","baseSet","baseTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","isBinary","copyArray","hookCallback","hooks","setHookCallback","input","hasOwnProp","isObjectEmpty","isUndefined","isNumber","isDate","arrLen","createUTC","locale","strict","createLocalOrUTC","defaultParsingFlags","unusedTokens","unusedInput","charsLeftOver","nullInput","invalidEra","invalidMonth","invalidFormat","userInvalidated","iso","parsedDateParts","era","meridiem","rfc2822","weekdayMismatch","getParsingFlags","_pf","isValid","_isValid","flags","parsedParts","isNowValid","invalidWeekday","_strict","bigHour","isFrozen","createInvalid","fun","momentProperties","updateInProgress","copyConfig","momentPropertiesLen","_isAMomentObject","_tzm","_isUTC","_offset","_locale","Moment","config","updateOffset","isMoment","suppressDeprecationWarnings","deprecate","firstTime","deprecationHandler","argLen","deprecations","deprecateSimple","_config","_dayOfMonthOrdinalParseLenient","_dayOfMonthOrdinalParse","_ordinalParse","mergeConfigs","parentConfig","childConfig","Locale","defaultCalendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","calendar","mom","_calendar","zeroFill","targetLength","forceSign","absNumber","zerosToFill","formattingTokens","localFormattingTokens","formatFunctions","formatTokenFunctions","addFormatToken","token","padded","ordinal","localeData","removeFormattingTokens","makeFormatFunction","formatMoment","expandFormat","invalidDate","replaceLongDateFormatTokens","longDateFormat","defaultLongDateFormat","LTS","LT","LL","LLL","LLLL","_longDateFormat","formatUpper","tok","defaultInvalidDate","_invalidDate","defaultOrdinal","defaultDayOfMonthOrdinalParse","_ordinal","defaultRelativeTime","future","past","mm","MM","yy","relativeTime","withoutSuffix","isFuture","_relativeTime","pastFuture","addUnitAlias","unit","shorthand","lowerCase","normalizeUnits","normalizeObjectUnits","inputObject","normalizedProp","normalizedInput","priorities","addUnitPriority","getPrioritizedUnits","unitsObj","isLeapYear","year","absFloor","toInt","argumentForCoercion","coercedNumber","makeGetSet","keepTime","set$1","month","date","daysInMonth","stringGet","stringSet","prioritized","prioritizedLen","match1","match2","match3","match4","match6","match1to2","match3to4","match5to6","match1to3","match1to4","match1to6","matchUnsigned","matchSigned","matchOffset","matchShortOffset","matchTimestamp","matchWord","addRegexToken","strictRegex","isStrict","getParseRegexForToken","unescapeFormat","regexEscape","matched","p4","addParseToken","tokenLen","addWeekParseToken","addTimeToArrayFromToken","YEAR","MONTH","DATE","HOUR","MINUTE","SECOND","MILLISECOND","WEEK","WEEKDAY","mod","modMonth","monthsShort","months","monthsShortRegex","monthsRegex","monthsParse","defaultLocaleMonths","defaultLocaleMonthsShort","MONTHS_IN_FORMAT","defaultMonthsShortRegex","defaultMonthsRegex","localeMonths","_months","isFormat","localeMonthsShort","_monthsShort","handleStrictParse","monthName","_monthsParse","_longMonthsParse","_shortMonthsParse","localeMonthsParse","_monthsParseExact","dayOfMonth","getSetMonth","getDaysInMonth","computeMonthsParse","_monthsShortStrictRegex","_monthsShortRegex","_monthsStrictRegex","_monthsRegex","cmpLenRev","shortPieces","longPieces","mixedPieces","daysInYear","parseTwoDigitYear","getSetYear","getIsLeapYear","createDate","ms","createUTCDate","UTC","getUTCFullYear","setUTCFullYear","firstWeekOffset","dow","doy","fwd","getUTCDay","dayOfYearFromWeeks","week","weekday","resYear","resDayOfYear","dayOfYear","weekOfYear","resWeek","weekOffset","weeksInYear","weekOffsetNext","localeWeek","_week","defaultLocaleWeek","localeFirstDayOfWeek","localeFirstDayOfYear","getSetWeek","getSetISOWeek","parseWeekday","weekdaysParse","parseIsoWeekday","shiftWeekdays","ws","weekdaysMin","weekdaysShort","weekdays","weekdaysMinRegex","weekdaysShortRegex","weekdaysRegex","defaultLocaleWeekdays","defaultLocaleWeekdaysShort","defaultLocaleWeekdaysMin","defaultWeekdaysRegex","defaultWeekdaysShortRegex","defaultWeekdaysMinRegex","localeWeekdays","_weekdays","day","localeWeekdaysShort","_weekdaysShort","localeWeekdaysMin","_weekdaysMin","handleStrictParse$1","weekdayName","_weekdaysParse","_shortWeekdaysParse","_minWeekdaysParse","localeWeekdaysParse","_weekdaysParseExact","_fullWeekdaysParse","getSetDayOfWeek","getSetLocaleDayOfWeek","getSetISODayOfWeek","computeWeekdaysParse","_weekdaysStrictRegex","_weekdaysRegex","_weekdaysShortStrictRegex","_weekdaysShortRegex","_weekdaysMinStrictRegex","_weekdaysMinRegex","minp","shortp","longp","minPieces","hFormat","hours","kFormat","lowercase","minutes","matchMeridiem","_meridiemParse","localeIsPM","seconds","kInput","_isPm","isPM","_meridiem","pos1","pos2","defaultLocaleMeridiemParse","getSetHour","localeMeridiem","isLower","globalLocale","baseConfig","dayOfMonthOrdinalParse","meridiemParse","locales","localeFamilies","commonPrefix","arr1","minl","normalizeLocale","chooseLocale","loadLocale","isLocaleNameSane","oldLocale","_abbr","aliasedRequire","getSetGlobalLocale","values","getLocale","defineLocale","abbr","parentLocale","updateLocale","tmpLocale","listLocales","checkOverflow","_overflowDayOfYear","_overflowWeeks","_overflowWeekday","extendedIsoRegex","basicIsoRegex","tzRegex","isoDates","isoTimes","aspNetJsonRegex","obsOffsets","UT","GMT","EDT","EST","CDT","CST","MDT","MST","PDT","PST","configFromISO","allowTime","dateFormat","timeFormat","tzFormat","isoDatesLen","isoTimesLen","configFromStringAndFormat","extractFromRFC2822Strings","yearStr","monthStr","dayStr","hourStr","minuteStr","secondStr","untruncateYear","preprocessRFC2822","checkWeekday","weekdayStr","parsedInput","calculateOffset","obsOffset","militaryOffset","numOffset","configFromRFC2822","parsedArray","setUTCMinutes","getUTCMinutes","configFromString","createFromInputFallback","currentDateArray","nowValue","_useUTC","getUTCMonth","getUTCDate","configFromArray","currentDate","expectedWeekday","yearToUse","dayOfYearFromWeekInfo","_dayOfYear","_nextDay","weekYear","weekdayOverflow","curWeek","GG","createLocal","ISO_8601","RFC_2822","skipped","stringLength","totalParsedInputLength","meridiemFixWrap","erasConvertYear","hour","isPm","meridiemHour","configFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","validFormatFound","bestFormatIsValid","configfLen","score","configFromObject","dayOrDate","minute","second","millisecond","createFromConfig","prepareConfig","preparse","configFromInput","isUTC","prototypeMin","prototypeMax","pickBy","moments","ordering","isDurationValid","unitHasDecimal","orderLen","isValid$1","createInvalid$1","createDuration","Duration","years","quarters","quarter","weeks","isoWeek","days","milliseconds","_milliseconds","_days","_bubble","isDuration","absRound","compareArrays","array1","array2","dontConvert","lengthDiff","diffs","utcOffset","offsetFromString","chunkOffset","matcher","parts","cloneWithOffset","model","local","getDateOffset","getSetOffset","keepLocalTime","keepMinutes","localAdjust","_changeInProgress","addSubtract","getSetZone","setOffsetToUTC","setOffsetToLocal","setOffsetToParsedOffset","tZone","hasAlignedHourOffset","isDaylightSavingTime","isDaylightSavingTimeShifted","_isDSTShifted","isLocal","isUtcOffset","isUtc","aspNetRegex","isoRegex","diffRes","parseIso","momentsDifference","inp","positiveMomentsDifference","isAfter","isBefore","createAdder","period","tmp","isAdding","isString","isMomentInput","isNumberOrStringArray","isMomentInputObject","objectTest","propertyTest","propertyLen","arrayTest","dataTypeTest","isCalendarSpec","getCalendarFormat","myMoment","calendar$1","formats","sod","startOf","calendarFormat","localInput","endOf","isBetween","inclusivity","localFrom","localTo","isSame","inputMs","isSameOrAfter","isSameOrBefore","asFloat","that","zoneDelta","monthDiff","wholeMonthDiff","anchor","toISOString","keepOffset","toDate","inspect","datetime","suffix","zone","inputString","defaultFormatUtc","defaultFormat","postformat","humanize","fromNow","toNow","newLocaleData","lang","MS_PER_SECOND","MS_PER_MINUTE","MS_PER_HOUR","MS_PER_400_YEARS","mod$1","dividend","divisor","localStartOfDate","utcStartOfDate","startOfDate","isoWeekday","unix","toObject","toJSON","isValid$2","parsingFlags","invalidAt","creationData","localeEras","eras","_eras","since","until","localeErasParse","eraName","narrow","localeErasConvertYear","getEraName","getEraNarrow","getEraAbbr","getEraYear","erasNameRegex","computeErasParse","_erasNameRegex","_erasRegex","erasAbbrRegex","_erasAbbrRegex","erasNarrowRegex","_erasNarrowRegex","matchEraAbbr","matchEraName","matchEraNarrow","matchEraYearOrdinal","_eraYearOrdinalRegex","abbrPieces","namePieces","narrowPieces","addWeekYearFormatToken","getSetWeekYear","getSetWeekYearHelper","getSetISOWeekYear","getISOWeeksInYear","getISOWeeksInISOWeekYear","isoWeekYear","getWeeksInYear","weekInfo","getWeeksInWeekYear","weeksTarget","setWeekAll","dayOfYearData","getSetQuarter","erasParse","eraYearOrdinalParse","getSetDayOfMonth","getSetDayOfYear","getSetMinute","getSetMillisecond","getSetSecond","parseMs","getZoneAbbr","getZoneName","createUnix","createInZone","parseZone","preParsePostFormat","for","eraNarrow","eraAbbr","eraYear","isoWeeks","weeksInWeekYear","isoWeeksInYear","isoWeeksInISOWeekYear","isDST","zoneAbbr","zoneName","dates","isDSTShifted","proto$1","get$1","setter","listMonthsImpl","out","listWeekdaysImpl","localeSorted","listMonths","listMonthsShort","listWeekdays","listWeekdaysShort","listWeekdaysMin","firstDayOfYear","firstDayOfWeek","langData","mathAbs","addSubtract$1","add$1","subtract$1","absCeil","monthsFromDays","monthsToDays","daysToMonths","valueOf$1","makeAs","asMilliseconds","asSeconds","asMinutes","asHours","asDays","asWeeks","asMonths","asQuarters","asYears","clone$1","get$2","makeGetter","thresholds","substituteTimeAgo","relativeTime$1","posNegDuration","getSetRelativeTimeRounding","roundingFunction","getSetRelativeTimeThreshold","limit","argWithSuffix","argThresholds","withSuffix","abs$1","toISOString$1","totalSign","ymSign","daysSign","hmsSign","proto$2","toIsoString","relativeTimeRounding","relativeTimeThreshold","HTML5_FMT","DATETIME_LOCAL","DATETIME_LOCAL_SECONDS","DATETIME_LOCAL_MS","TIME","TIME_SECONDS","TIME_MS","__unused_webpack_module","__unused_webpack_exports","Lib","rules","fullSelector","addStyleRule","Plotly","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","shim","componentName","location","propFullName","secret","getShim","isRequired","ReactPropTypes","bigint","symbol","arrayOf","elementType","instanceOf","objectOf","oneOf","oneOfType","exact","checkPropTypes","PropTypes","aa","ca","encodeURIComponent","da","ea","fa","ia","ja","ka","la","ma","acceptsBooleans","attributeName","attributeNamespace","mustUseProperty","propertyName","sanitizeURL","removeEmptyString","ra","sa","ta","pa","qa","oa","removeAttribute","setAttributeNS","xlinkHref","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","wa","ya","za","Aa","Ba","Ca","Da","Ea","Fa","Ga","Ha","Ia","Ja","Ka","La","Ma","Na","Oa","prepareStackTrace","Reflect","construct","displayName","Pa","Qa","$$typeof","_context","_payload","_init","Ra","Sa","Ta","nodeName","Va","_valueTracker","getOwnPropertyDescriptor","setValue","stopTracking","Ua","Wa","checked","Xa","Ya","defaultChecked","_wrapperState","initialChecked","Za","controlled","ownerDocument","defaultSelected","disabled","dangerouslySetInnerHTML","namespaceURI","innerHTML","MSApp","execUnsafeLocalFunction","lastChild","nodeType","nodeValue","animationIterationCount","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridArea","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","lineClamp","order","tabSize","widows","fillOpacity","floodOpacity","stopOpacity","strokeDasharray","strokeDashoffset","strokeMiterlimit","strokeWidth","setProperty","menuitem","area","br","embed","keygen","link","track","wbr","srcElement","correspondingUseElement","stateNode","onError","alternate","return","memoizedState","dehydrated","sibling","unstable_scheduleCallback","unstable_cancelCallback","unstable_shouldYield","unstable_requestPaint","unstable_now","unstable_getCurrentPriorityLevel","unstable_ImmediatePriority","unstable_UserBlockingPriority","unstable_NormalPriority","unstable_LowPriority","unstable_IdlePriority","clz32","pendingLanes","suspendedLanes","pingedLanes","entangledLanes","entanglements","eventTimes","delete","nativeEvent","blockedOn","domEventName","eventSystemFlags","targetContainers","isDehydrated","containerInfo","dispatchEvent","ReactCurrentBatchConfig","keyCode","charCode","_reactName","_targetInst","currentTarget","returnValue","cancelBubble","persist","isPersistent","eventPhase","bubbles","cancelable","isTrusted","view","detail","altKey","getModifierState","button","buttons","relatedTarget","fromElement","toElement","movementX","movementY","dataTransfer","animationName","elapsedTime","pseudoElement","clipboardData","Spacebar","Left","Right","Down","Del","Win","Menu","Apps","Scroll","MozPrintableKey","Alt","Control","Meta","Shift","pressure","tangentialPressure","tiltX","tiltY","twist","isPrimary","targetTouches","changedTouches","deltaX","wheelDeltaX","deltaZ","email","password","range","search","tel","oninput","detachEvent","attachEvent","nextSibling","compareDocumentPosition","HTMLIFrameElement","contentWindow","href","contentEditable","focusedElem","selectionRange","documentElement","selectionStart","selectionEnd","defaultView","getSelection","rangeCount","anchorNode","anchorOffset","focusNode","focusOffset","createRange","setStart","removeAllRanges","addRange","setEnd","scrollLeft","scrollTop","focus","animationend","animationiteration","animationstart","transitionend","parentWindow","na","xa","$a","ba","char","__html","queueMicrotask","previousSibling","contextTypes","__reactInternalMemoizedUnmaskedChildContext","__reactInternalMemoizedMaskedChildContext","childContextTypes","getChildContext","__reactInternalMemoizedMergedChildContext","deletions","pendingProps","treeContext","retryLane","memoizedProps","defaultProps","_currentValue","childLanes","dependencies","firstContext","lanes","memoizedValue","interleaved","updateQueue","baseState","firstBaseUpdate","lastBaseUpdate","shared","pending","effects","eventTime","lane","Component","refs","isMounted","_reactInternals","enqueueSetState","enqueueReplaceState","enqueueForceUpdate","shouldComponentUpdate","isPureReactComponent","contextType","updater","componentWillReceiveProps","UNSAFE_componentWillReceiveProps","getDerivedStateFromProps","getSnapshotBeforeUpdate","UNSAFE_componentWillMount","componentWillMount","componentDidMount","ref","_owner","_stringRef","implementation","tagName","revealOrder","_workInProgressVersionPrimary","ReactCurrentDispatcher","baseQueue","lastRenderedReducer","action","hasEagerState","eagerState","lastRenderedState","getSnapshot","lastEffect","stores","deps","readContext","useCallback","useContext","useEffect","useImperativeHandle","useInsertionEffect","useLayoutEffect","useMemo","useReducer","useRef","useState","useDebugValue","useDeferredValue","useTransition","useMutableSource","useSyncExternalStore","useId","unstable_isNewReconciler","identifierPrefix","digest","WeakMap","getDerivedStateFromError","componentDidCatch","componentStack","pingCache","ReactCurrentOwner","compare","baseLanes","cachePool","transitions","UNSAFE_componentWillUpdate","componentWillUpdate","componentDidUpdate","pendingContext","fallback","dataset","dgst","_reactRetry","subtreeFlags","isBackwards","rendering","renderingStartTime","tail","tailMode","wasMultiple","suppressHydrationWarning","onClick","onclick","createElementNS","autoFocus","createTextNode","WeakSet","_reactRootContainer","onCommitFiberUnmount","componentWillUnmount","isHidden","__reactInternalSnapshotBeforeUpdate","callbackNode","expirationTimes","expiredLanes","callbackPriority","finishedWork","finishedLanes","timeoutHandle","mutableReadLanes","onCommitFiberRoot","onRecoverableError","onPostCommitFiberRoot","isReactComponent","pendingChildren","mutableSourceEagerHydrationData","pendingSuspenseBoundaries","reportError","_internalRoot","unstable_scheduleHydration","querySelectorAll","JSON","stringify","form","usingClientEntryPoint","Events","findFiberByHostInstance","bundleType","rendererPackageName","rendererConfig","overrideHookState","overrideHookStateDeletePath","overrideHookStateRenamePath","overrideProps","overridePropsDeletePath","overridePropsRenamePath","setErrorHandler","setSuspenseHandler","scheduleUpdate","currentDispatcherRef","findHostInstanceByFiber","findHostInstancesForRefresh","scheduleRefresh","scheduleRoot","setRefreshHandler","getCurrentFiber","reconcilerVersion","__REACT_DEVTOOLS_GLOBAL_HOOK__","isDisabled","supportsFiber","inject","createPortal","createRoot","unstable_strictMode","findDOMNode","flushSync","hydrate","hydrateRoot","hydratedSources","_getVersion","unmountComponentAtNode","unstable_batchedUpdates","unstable_renderSubtreeIntoContainer","checkDCE","PlotlyComponent","_Component","_super","_createSuper","resizeHandler","syncWindowResize","_assertThisInitialized","syncEventHandlers","attachUpdateEvents","getRef","handleUpdate","figureCallback","updatePlotly","shouldInvokeResizeHandler","figureCallbackFunction","shouldAttachUpdateEvents","unmounting","react","onInitialized","prevProps","numPrevFrames","numNextFrames","figureChanged","revisionDefined","revision","revisionChanged","onUpdate","onPurge","isBrowser","removeUpdateEvents","purge","_this3","updateEvents","updateEvent","_this4","_this$el","_transitionData","_frames","invoke","_this5","useResizeHandler","Plots","_this6","eventNames","hasHandler","Boolean","addEventHandler","removeEventHandler","getPlotlyEventName","_react","divId","propTypes","_propTypes","_interopRequireWildcard","_factory","_interopRequireDefault","_plotly","__self","__source","Fragment","jsx","jsxs","setState","forceUpdate","escape","_status","_result","Children","only","Profiler","PureComponent","StrictMode","Suspense","cloneElement","createContext","_currentValue2","_threadCount","Provider","Consumer","_defaultValue","_globalName","createFactory","createRef","forwardRef","isValidElement","lazy","memo","startTransition","unstable_act","sortIndex","expirationTime","priorityLevel","scheduling","isInputPending","MessageChannel","port2","port1","unstable_Profiling","unstable_continueExecution","unstable_forceFrameRate","unstable_getFirstCallbackNode","unstable_next","unstable_pauseExecution","unstable_runWithPriority","unstable_wrapCallback","warning","loaded","chunkId","promises","miniCssF","globalThis","inProgress","dataWebpackPrefix","script","needAttach","scripts","getElementsByTagName","getAttribute","charset","timeout","onScriptComplete","onerror","doneFns","paths","installedChunks","installedChunkData","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","chunkLoadingGlobal","_toPropertyKey","hint","prim","toPrimitive","_setPrototypeOf","_getPrototypeOf","_isNativeReflectConstruct","sham","Proxy","Derived","hasNativeReflectConstruct","Super","NewTarget","_toConsumableArray","ownKeys","enumerableOnly","getOwnPropertySymbols","symbols","sym","_objectSpread2","getOwnPropertyDescriptors","excluded","sourceKeys","_objectWithoutProperties","sourceSymbolKeys","propertyIsEnumerable","_excluded","useButtonProps","rel","role","_ref2$tabIndex","tabIndex","handleClick","isTrivialHref","onKeyDown","Button","React","asProp","_objectWithoutPropertiesLoose","_useButtonProps2","buttonProps","_jsx","DEFAULT_BREAKPOINTS","ThemeContext","prefixes","breakpoints","minBreakpoint","useBootstrapPrefix","defaultPrefix","useIsRTL","bsPrefix","_ref$variant","variant","_ref$active","_ref$disabled","_objectSpread","Spinner","_ref$animation","_ref$as","bsSpinnerPrefix","nodeHtmlLabel","Graph","setSelectedNode","selectedWorkload","selectedOp","selectedPattern","setWarningText","_useState2","setGraph","_useState4","groupNode","setGroupNode","groupNodeOpList","workload_id","model_path","localStorage","getItem","response","op_name","groups","status","CytoGraph","_React$Component","handleCallback","childData","renderCytoscapeElement","getElements","node_type","newExpandedNodes","_jsxs","GraphButtons","parentCallback","collapseNode","tooltip","_React$Component2","_super2","getLabel","highlight","border_color","customColor","getHash","OpDetails","setHistogramType","setSelectedPattern","opDetails","setOpDetails","Pattern","sequence","framework","colSpan","Weights","dtype","granularity","Activation","_Fragment","Table","striped","bordered","borderless","hover","responsive","decoratedBsPrefix","table","responsiveClass","OpList","setSelectedOp","opList","setOpList","MSE","_error$response","tableContent","opData","scrollIntoView","toExponential","Histogram","histogramType","histogramData","setHistogramData","Plot","getHistogramData","colorPalette","generateColor","histograms","series","orientation","side","fillcolor","hoverinfo","spanmode","yaxis","autorange","showgrid","legend","tracegroupgap","violinmode","_get","receiver","desc","_construct","Parent","Class","_wrapNativeSuper","Wrapper","PACKET_TYPES","PACKET_TYPES_REVERSE","TEXT_ENCODER","ERROR_PACKET","withNativeBlob","withNativeArrayBuffer","isView","encodePacket","supportsBinary","encodeBlobAsBase64","fileReader","FileReader","readAsDataURL","byteOffset","byteLength","chars","TEXT_DECODER","decodePacket","encodedPacket","binaryType","mapBinary","decodeBase64Packet","decoded","base64","encoded1","encoded2","encoded3","encoded4","bufferLength","arraybuffer","decode","SEPARATOR","mixin","emitReserved","hasListeners","globalThisShim","pick","NATIVE_SET_TIMEOUT","NATIVE_CLEAR_TIMEOUT","installTimerFunctions","useNativeTimers","setTimeoutFn","clearTimeoutFn","TransportError","_Error","description","Transport","_Emitter","socket","readyState","doOpen","doClose","onClose","packets","write","packet","onPacket","details","onPause","schema","_hostname","_port","_query","hostname","port","secure","encodedQuery","encode","alphabet","encoded","yeast","XMLHttpRequest","hasCORS","XHR","xdomain","hasXHR2","responseType","Polling","_Transport","polling","isSSL","protocol","forceBase64","withCredentials","cookieJar","createCookieJar","poll","doPoll","encodedPayload","encodedPackets","decodedPacket","decodePayload","onOpen","close","encodePayload","doWrite","timestampRequests","timestampParam","createUri","Request","uri","xhrStatus","_this7","onData","pollXhr","_this8","_this9","xhr","open","extraHeaders","setDisableHeaderCheck","setRequestHeader","addCookies","requestTimeout","onreadystatechange","parseCookies","send","requestsCount","requests","cleanup","fromError","abort","responseText","unloadHandler","nextTick","WebSocket","MozWebSocket","isReactNative","product","WS","protocols","headers","addEventListeners","onopen","autoUnref","_socket","unref","onclose","closeEvent","lastPacket","WT","WebTransport","transport","transportOptions","closed","createBidirectionalStream","stream","binaryFlag","reader","readable","getReader","writer","getWriter","read","TextDecoder","isPlainBinary","decodePacketFromBinary","handshake","TextEncoder","arrayBuffer","encodePacketToBinary","shouldIncludeBinaryHeader","transports","websocket","webtransport","host","authority","ipv6uri","pathNames","regx","queryKey","$0","$2","Socket","writeBuffer","prevBufferLen","agent","upgrade","rememberUpgrade","addTrailingSlash","rejectUnauthorized","perMessageDeflate","closeOnBeforeunload","qry","pairs","pair","decodeURIComponent","upgrades","pingInterval","pingTimeout","pingTimeoutTimer","beforeunloadEventListener","offlineEventListener","EIO","priorWebsocketSuccess","createTransport","setTransport","onDrain","failed","onTransportOpen","upgrading","freezeTransport","onTransportClose","onupgrade","probe","onHandshake","resetPingTimeout","sendPacket","filterUpgrades","maxPayload","getWritablePackets","payloadSize","utf8Length","compress","cleanupAndClose","waitForUpgrade","filteredUpgrades","_createForOfIteratorHelper","allowArrayLike","normalCompletion","didErr","_e2","withNativeFile","File","hasBinary","deconstructPacket","buffers","packetData","pack","_deconstructPacket","attachments","placeholder","_placeholder","newData","reconstructPacket","_reconstructPacket","PacketType","RESERVED_EVENTS","Encoder","replacer","EVENT","ACK","encodeAsString","encodeAsBinary","BINARY_EVENT","BINARY_ACK","nsp","deconstruction","Decoder","reviver","reconstructor","isBinaryEvent","decodeString","BinaryReconstructor","takeBinaryData","buf","tryParse","isPayloadValid","finishedReconstruction","CONNECT","DISCONNECT","CONNECT_ERROR","reconPack","binData","freeze","connect","connect_error","disconnecting","newListener","io","connected","recovered","receiveBuffer","sendBuffer","_queue","_queueSeq","acks","auth","_opts","_autoConnect","subs","onpacket","subEvents","_readyState","_len2","_key2","retries","fromQueue","volatile","_addToQueue","ack","_registerAckCallback","isTransportWritable","engine","notifyOutgoingListeners","ackTimeout","timer","_len3","_key3","_len4","_key4","withErr","tryCount","_len5","responseArgs","_key5","_drainQueue","_packet","_sendConnectPacket","_pid","_lastOffset","onconnect","onevent","onack","ondisconnect","emitEvent","_anyListeners","_iterator","sent","_len6","_key6","emitBuffered","subDestroy","_anyOutgoingListeners","_step2","_iterator2","Backoff","jitter","attempts","rand","deviation","setMin","setMax","setJitter","Manager","nsps","reconnection","reconnectionAttempts","reconnectionDelay","reconnectionDelayMax","randomizationFactor","backoff","_parser","parser","encoder","decoder","autoConnect","_reconnection","_reconnectionAttempts","_reconnectionDelay","_randomizationFactor","_reconnectionDelayMax","_timeout","_reconnecting","reconnect","Engine","skipReconnect","openSubDestroy","maybeReconnectOnOpen","errorSub","onping","ondata","ondecoded","_nsps","_close","onreconnect","attempt","parsed","sameNamespace","forceNew","multiplex","Workloads","setSelectedWorkload","workloads","setWorkloads","spinner","setSpinner","getWorkloads","changeSelectedWorkload","workloadsList","workload","workload_name","moment","creation_time","_ref$fluid","fluid","_ref$rounded","rounded","_ref$roundedCircle","roundedCircle","_ref$thumbnail","thumbnail","getOverlayDirection","placement","isRTL","bsDirection","getInitialPopperStyles","Tooltip","_ref$placement","arrowProps","hasDoneInitialMeasure","popper","primaryPlacement","computedStyle","strategy","TOOLTIP_OFFSET","useMounted","mounted","useWillUnmount","onUnmount","valueRef","useUpdatedRef","MAX_DELAY_MS","setChainedTimeout","handleRef","timeoutAtMs","delayMs","useTimeout","defaultKey","_toPrimitive","useUncontrolledProp","propValue","wasPropRef","_useState","stateValue","isProp","wasProp","nextProps","prevState","nextState","__reactInternalSnapshotFlag","__reactInternalSnapshot","__suppressDeprecationWarning","toFnRef","refA","refB","mergeRefs","useCallbackRef","find","tar","dequal","foo","bar","ctor","_step3","_iterator3","DataView","getInt8","getBasePlacement","getWindow","isElement","isHTMLElement","isShadowRoot","ShadowRoot","getUAString","uaData","userAgentData","brands","brand","isLayoutViewport","includeScale","isFixedStrategy","clientRect","scaleX","scaleY","visualViewport","addVisualOffsets","getLayoutRect","rootNode","getRootNode","isSameNode","getNodeName","isTableElement","getDocumentElement","getParentNode","assignedSlot","getTrueOffsetParent","offsetParent","getOffsetParent","isFirefox","perspective","contain","willChange","getContainingBlock","getMainAxisFromPlacement","within","mathMax","mathMin","mergePaddingObject","expandToHashMap","hashMap","auto","basePlacements","clippingParents","reference","variationPlacements","placements","modifierPhases","phase","_state$modifiersData$","arrowElement","arrow","popperOffsets","modifiersData","basePlacement","axis","rects","toPaddingObject","arrowRect","minProp","maxProp","endDiff","startDiff","arrowOffsetParent","clientSize","centerToReference","axisProp","centerOffset","effect","_options$element","requires","requiresIfExists","getVariation","unsetSides","mapToStyles","_Object$assign2","popperRect","variation","gpuAcceleration","adaptive","roundOffsets","isFixed","_offsets$x","_offsets$y","hasX","hasY","sideX","sideY","win","heightProp","widthProp","_Object$assign","commonStyles","_ref4","dpr","roundOffsetsByDPR","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","styles","_options$scroll","scroll","_options$resize","scrollParents","scrollParent","getOppositePlacement","getOppositeVariationPlacement","getWindowScroll","pageXOffset","pageYOffset","getWindowScrollBarX","isScrollParent","_getComputedStyle","overflowX","overflowY","getScrollParent","listScrollParents","_element$ownerDocumen","isBody","updatedList","rectToClientRect","getClientRectFromMixedType","clippingParent","html","layoutViewport","getViewportRect","clientTop","clientLeft","getInnerBoundingClientRect","winScroll","scrollWidth","scrollHeight","getDocumentRect","getClippingRect","boundary","rootBoundary","mainClippingParents","clipperElement","getClippingParents","firstClippingParent","clippingRect","accRect","computeOffsets","commonX","commonY","mainAxis","detectOverflow","_options$placement","_options$strategy","_options$boundary","_options$rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","altContext","clippingClientRect","contextElement","referenceClientRect","popperClientRect","elementClientRect","overflowOffsets","offsetData","multiply","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","flipVariations","allowedAutoPlacements","preferredPlacement","oppositePlacement","getExpandedFallbackPlacements","_options$allowedAutoP","allPlacements","allowedPlacements","overflows","computeAutoPlacement","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","fittingPlacement","getSideOffsets","preventedOffsets","isAnySideFullyClipped","_options$offset","invertDistance","skidding","distanceAndSkiddingToXY","_data$state$placement","_options$tether","tether","_options$tetherOffset","tetherOffset","isBasePlacement","tetherOffsetValue","normalizedTetherOffsetValue","offsetModifierState","_offsetModifierState$","mainSide","altSide","additive","maxLen","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","minOffset","maxOffset","clientOffset","offsetModifierValue","tetherMax","preventedOffset","_offsetModifierState$2","_mainSide","_altSide","_max","isOriginSide","_offsetModifierValue","_tetherMin","_tetherMax","_preventedOffset","withinMaxClamp","getCompositeRect","elementOrVirtualElement","isOffsetParentAnElement","offsetParentIsScaled","isElementScaled","getNodeScroll","modifiers","dep","depModifier","DEFAULT_OPTIONS","areValidElements","popperGenerator","generatorOptions","_generatorOptions","_generatorOptions$def","defaultModifiers","_generatorOptions$def2","defaultOptions","orderedModifiers","effectCleanupFns","isDestroyed","setOptionsAction","cleanupModifierEffects","orderModifiers","existing","mergeByName","_ref$options","cleanupFn","noopFn","_state$elements","_state$orderedModifie","_state$orderedModifie2","onFirstUpdate","createPopper","preventOverflow","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","computeStyles","eventListeners","flip","disabledApplyStylesModifier","ariaDescribedByModifier","_popper$getAttribute","_state$elements2","EMPTY_MODIFIERS","referenceElement","popperElement","_ref$enabled","_ref$strategy","_ref$modifiers","prevModifiers","popperInstanceRef","_popperInstanceRef$cu","_popperInstanceRef$cu2","_useSafeState2","useSafeState","popperState","updateModifier","nextModifiers","optionsSupported","onceSupported","canUseDOM","wrappedHandler","__once","onceHandler","useEventCallback","useCommittedRef","getRefTarget","InitialTriggerEvents","click","mouseup","pointerup","onClickOutside","_ref$clickTrigger","clickTrigger","preventMouseClickOutsideRef","waitingForTrigger","handleMouseCapture","isLeftClickEvent","handleInitialMouse","handleMouse","_ownerWindow$event","_ownerWindow$parent","ownerWindow","currentEvent","removeInitialTriggerListener","removeMouseCaptureListener","removeMouseListener","mobileSafariHackListeners","onRootClose","useClickOutside","handleKeyUp","isEscKey","removeKeyupListener","Context","resolveContainerRef","useWaitForDOMRef","onResolved","resolvedRef","setRef","earlyRef","nextRef","toModifierArray","mergeOptionsWithPopperConfig","_modifiers$eventListe","_modifiers$preventOve","_modifiers$preventOve2","_modifiers$offset","_modifiers$arrow","enableEvents","fixed","containerPadding","_ref$popperConfig","popperConfig","toModifierMap","inProp","in","onExited","mountOnEnter","unmountOnExit","hasEnteredRef","handleExited","combinedRef","useMergedRefs","ImperativeTransition","onEntered","exited","setExited","onTransition","isInitialRef","handleTransition","useIsomorphicEffect","stale","initial","isStale","Overlay","outerRef","_props$popperConfig","Transition","runTransition","_useCallbackRef2","rootElement","attachRef","_useCallbackRef4","attachArrowRef","mergedRef","usePopper","mountOverlay","useRootClose","onHide","rootClose","rootCloseDisabled","rootCloseEvent","onExit","onExiting","onEnter","onEntering","NoopTransition","renderTransition","appear","ReactDOM","baseVal","rHyphen","pascalCase","chr","createWithBsPrefix","_ref$displayName","BsComponent","_ref2$as","Tag","componentProps","resolvedPrefix","Popover","PopoverBody","Header","PopoverHeader","Body","POPPER_OFFSET","UNMOUNTED","EXITED","ENTERING","ENTERED","EXITING","initialStatus","isMounting","enter","appearStatus","nextCallback","_proto","updateStatus","nextStatus","cancelNextCallback","getTimeouts","exit","mounting","nodeRef","forceReflow","performEnter","performExit","appearing","maybeNode","maybeAppearing","timeouts","enterTimeout","safeSetState","onTransitionEnd","setNextCallback","doesNotHaveTimeoutOrListener","addEndListener","maybeNextCallback","_this$props","childProps","TransitionGroupContext","psuedoElement","rUpper","msPattern","hyphenateStyleName","hyphenate","supportedTransforms","transforms","isTransform","removeProperty","cssText","emulateTransitionEnd","called","handle","createEvent","initEvent","transitionEnd","parseDuration","removeEmulate","transitionEndListener","safeFindDOMNode","componentOrElement","childRef","handleEnter","handleEntering","handleEntered","handleExit","handleExiting","handleAddEndListener","innerProps","fadeStyles","_fadeStyles","Fade","_ref$transitionClasse","transitionClasses","isAppearing","triggerBrowserReflow","TransitionWrapper","_ref$transition","_ref$rootClose","_ref$show","outerShow","outerProps","popperRef","firstRenderedState","setFirstRenderedState","_useOverlayOffset","customOffset","overlayRef","popoverClass","tooltipClass","useOverlayOffset","_useOverlayOffset2","actualTransition","handleFirstUpdate","BaseOverlay","overlayProps","_popperObj$state","_popperObj$state$modi","popperObj","aRef","__wrapped","wrapRefs","updatedPlacement","outOfBoundaries","handleMouseOverOut","relatedNative","related","_ref$trigger","propsShow","_ref$defaultShow","defaultShow","onToggle","propsDelay","_ref$flip","triggerNodeRef","hoverStateRef","_useUncontrolledProp2","setShow","normalizeDelay","onFocus","onBlur","handleShow","handleHide","handleFocus","handleBlur","handleMouseOver","handleMouseOut","triggers","triggerProps","onMouseOver","onMouseOut","WorkloadDetails","tooltipDelete","tooltipCopy","tooltipFullPath","OverlayTrigger","deleteWorkload","clipboard","writeText","ModelSummary","_summary$data","summary","setSummary","replaceAll","Profiling","profilingTable","setProfilingTable","profilingChartData","setProfilingChartData","ProfilingChart","ProfilingTable","_useState6","setChecked","_useState8","sorting","setSorting","showOnChart","chartData","node_name","sortedProfiling","sortedTable","requestSorting","getSortingClass","profiling","accelerator_execution_time","cpu_execution_time","op_defined","op_run","total_execution_time","chartCheck","newProfilingChartData","requestChartCheck","getChartData","profilingData","marker","xaxis","title","showticklabels","Anchor","handleKeyDown","CloseButton","_ref$ariaLabel","ariaLabel","DivStyledAsH4","AlertHeading","AlertLink","Alert","uncontrolledProps","_useUncontrolled","fieldName","_extends2","Utils","propsValue","rest","handlerName","_useUncontrolledProp","_extends","useUncontrolled","_useUncontrolled$show","_useUncontrolled$clos","closeLabel","closeVariant","_useUncontrolled$vari","dismissible","_useUncontrolled$tran","handleClose","alert","Link","Heading","Warning","warningText","Feedback","_ref$type","_ref$tooltip","FormCheckInput","_ref$isValid","_ref$isInvalid","controlId","FormContext","FormCheckLabel","htmlFor","FormCheck","bsSwitchPrefix","_ref$inline","inline","_ref$reverse","_ref$feedbackTooltip","feedbackTooltip","feedback","feedbackType","_ref$title","innerFormContext","hasLabel","hasChildOfType","Input","Label","FormControl","_classes2","htmlSize","plaintext","readOnly","FormGroup","useCol","spans","brkPoint","span","infix","Col","_useCol2","_useCol2$","colProps","_excluded2","_useCol2$2","_useCol2$2$as","FormLabel","_ref$column","column","_ref$visuallyHidden","visuallyHidden","columnClass","FormRange","FormSelect","FormText","muted","Switch","FloatingLabel","validated","Form","Group","Floating","FormFloating","Check","Text","Range","Select","InputGroupText","InputGroup","hasValidation","contextValue","InputGroupContext","Radio","Checkbox","NodeProperties","selectedNode","_selectedNode$attribu","propertyList","attributeList","attribute","_attribute$value","attribute_type","AccuracyResults","accuracy_data","ratio","baseline_accuracy","toPrecision","optimized_accuracy","_useState10","_useState12","kindOf","thing","kindOfTest","typeOfTest","isArrayBuffer","isPlainObject","isFile","isBlob","isFileList","isURLSearchParams","_ref$allOwnKeys","allOwnKeys","findKey","_global","isContextDefined","TypedArray","isTypedArray","isHTMLForm","isRegExp","reduceDescriptors","reducer","descriptors","reducedDescriptors","ALPHA","DIGIT","ALPHABET","ALPHA_DIGIT","isAsyncFn","isBuffer","isFormData","kind","FormData","isArrayBufferView","isBoolean","isStream","pipe","caseless","targetKey","stripBOM","inherits","superConstructor","toFlatObject","sourceObj","destObj","propFilter","endsWith","searchString","forEachEntry","matchAll","regExp","freezeMethods","toObjectSet","arrayOrString","delimiter","toCamelCase","toFiniteNumber","generateString","isSpecCompliantForm","toJSONObject","reducedValue","isThenable","AxiosError","captureStackTrace","utils","fileName","lineNumber","columnNumber","customProps","axiosError","isVisitable","removeBrackets","renderKey","dots","predicates","formData","metaTokens","indexes","option","visitor","defaultVisitor","useBlob","convertValue","Buffer","isFlatArray","exposedHelpers","build","charMap","AxiosURLSearchParams","_pairs","toFormData","_encode","buildURL","serializedParams","serializeFn","serialize","hashmarkIndex","InterceptorManager","fulfilled","rejected","synchronous","runWhen","silentJSONParsing","forcedJSONParsing","clarifyTimeoutError","URLSearchParams","isStandardBrowserEnv","isStandardBrowserWebWorkerEnv","WorkerGlobalScope","importScripts","buildPath","isNumericKey","isLast","arrayToObject","parsePropPath","DEFAULT_CONTENT_TYPE","transitional","transitionalDefaults","adapter","transformRequest","contentType","getContentType","hasJSONContentType","isObjectPayload","formDataToJSON","setContentType","platform","helpers","toURLEncodedForm","formSerializer","_FormData","env","rawValue","stringifySafely","transformResponse","JSONRequested","strictJSONParsing","ERR_BAD_RESPONSE","xsrfCookieName","xsrfHeaderName","maxContentLength","maxBodyLength","validateStatus","common","ignoreDuplicateOf","$internals","normalizeHeader","header","normalizeValue","matchHeaderValue","isHeaderNameFilter","AxiosHeaders","_Symbol$iterator","_Symbol$toStringTag","valueOrRewrite","rewrite","setHeader","_header","_rewrite","lHeader","setHeaders","rawHeaders","parseHeaders","tokensRE","parseTokens","deleted","deleteHeader","normalized","formatHeader","_this$constructor","asStrings","computed","accessors","defineAccessor","accessorName","methodName","buildAccessors","accessor","transformData","isCancel","__CANCEL__","CanceledError","ERR_CANCELED","expires","domain","cookie","toGMTString","buildFullPath","baseURL","requestedURL","isAbsoluteURL","relativeURL","combineURLs","originURL","msie","urlParsingNode","resolveURL","pathname","requestURL","samplesCount","firstSampleTS","timestamps","chunkLength","startedAt","bytesCount","passed","progressEventReducer","isDownloadStream","bytesNotified","_speedometer","speedometer","lengthComputable","progressBytes","rate","estimated","onCanceled","requestData","requestHeaders","cancelToken","unsubscribe","signal","username","unescape","btoa","fullPath","onloadend","responseHeaders","getAllResponseHeaders","ERR_BAD_REQUEST","settle","statusText","paramsSerializer","responseURL","onabort","ECONNABORTED","ERR_NETWORK","ontimeout","timeoutErrorMessage","ETIMEDOUT","xsrfValue","isURLSameOrigin","cookies","onDownloadProgress","onUploadProgress","upload","subscribe","aborted","parseProtocol","knownAdapters","http","xhrAdapter","adapters","nameOrAdapter","throwIfCancellationRequested","throwIfRequested","dispatchRequest","headersToObject","mergeConfig","config1","config2","getMergedValue","mergeDeepProperties","valueFromConfig2","defaultToConfig2","mergeDirectKeys","mergeMap","timeoutMessage","decompress","beforeRedirect","httpAgent","httpsAgent","socketPath","responseEncoding","configValue","VERSION","validators","deprecatedWarnings","validator","formatMessage","opt","ERR_DEPRECATED","assertOptions","allowUnknown","ERR_BAD_OPTION_VALUE","ERR_BAD_OPTION","Axios","instanceConfig","interceptors","configOrUrl","contextHeaders","boolean","function","requestInterceptorChain","synchronousRequestInterceptors","interceptor","responseInterceptorChain","chain","newConfig","generateHTTPMethod","isForm","CancelToken","resolvePromise","_listeners","onfulfilled","_resolve","HttpStatusCode","Continue","SwitchingProtocols","Processing","EarlyHints","Created","Accepted","NonAuthoritativeInformation","NoContent","ResetContent","PartialContent","MultiStatus","AlreadyReported","ImUsed","MultipleChoices","MovedPermanently","Found","SeeOther","NotModified","UseProxy","Unused","TemporaryRedirect","PermanentRedirect","BadRequest","Unauthorized","PaymentRequired","Forbidden","NotFound","MethodNotAllowed","NotAcceptable","ProxyAuthenticationRequired","RequestTimeout","Conflict","Gone","LengthRequired","PreconditionFailed","PayloadTooLarge","UriTooLong","UnsupportedMediaType","RangeNotSatisfiable","ExpectationFailed","ImATeapot","MisdirectedRequest","UnprocessableEntity","Locked","FailedDependency","TooEarly","UpgradeRequired","PreconditionRequired","TooManyRequests","RequestHeaderFieldsTooLarge","UnavailableForLegalReasons","InternalServerError","NotImplemented","BadGateway","ServiceUnavailable","GatewayTimeout","HttpVersionNotSupported","VariantAlsoNegotiates","InsufficientStorage","LoopDetected","NotExtended","NetworkAuthenticationRequired","axios","createInstance","defaultConfig","Cancel","spread","isAxiosError","formToJSON","setItem","Diagnosis","onPerfEntry","getCLS","getFID","getFCP","getLCP","getTTFB","App","reportWebVitals"],"sourceRoot":""} \ No newline at end of file diff --git a/neural_insights/web/app/static/media/IntelClear_Bd.060888be7dccf869db54.ttf b/neural_insights/web/app/static/media/IntelClear_Bd.060888be7dccf869db54.ttf deleted file mode 100644 index 5058d15085c..00000000000 Binary files a/neural_insights/web/app/static/media/IntelClear_Bd.060888be7dccf869db54.ttf and /dev/null differ diff --git a/neural_insights/web/app/static/media/IntelClear_Lt.c5e18e9d5505364da760.ttf b/neural_insights/web/app/static/media/IntelClear_Lt.c5e18e9d5505364da760.ttf deleted file mode 100644 index 151b54c7b7b..00000000000 Binary files a/neural_insights/web/app/static/media/IntelClear_Lt.c5e18e9d5505364da760.ttf and /dev/null differ diff --git a/neural_insights/web/app/static/media/IntelClear_Rg.33af11200cffaf9540ff.ttf b/neural_insights/web/app/static/media/IntelClear_Rg.33af11200cffaf9540ff.ttf deleted file mode 100644 index 0a2d0be299f..00000000000 Binary files a/neural_insights/web/app/static/media/IntelClear_Rg.33af11200cffaf9540ff.ttf and /dev/null differ diff --git a/neural_insights/web/app/static/media/intelone-display-bold.64a6eab04dcda9c570c8.ttf b/neural_insights/web/app/static/media/intelone-display-bold.64a6eab04dcda9c570c8.ttf deleted file mode 100644 index 072a9dc8880..00000000000 Binary files a/neural_insights/web/app/static/media/intelone-display-bold.64a6eab04dcda9c570c8.ttf and /dev/null differ diff --git a/neural_insights/web/app/static/media/intelone-display-light.68a9d0311f7374acb0cf.ttf b/neural_insights/web/app/static/media/intelone-display-light.68a9d0311f7374acb0cf.ttf deleted file mode 100644 index d23ed421816..00000000000 Binary files a/neural_insights/web/app/static/media/intelone-display-light.68a9d0311f7374acb0cf.ttf and /dev/null differ diff --git a/neural_insights/web/app/static/media/intelone-display-regular.0f8c3ef25c545acb6b7c.ttf b/neural_insights/web/app/static/media/intelone-display-regular.0f8c3ef25c545acb6b7c.ttf deleted file mode 100644 index a70bb54e9d0..00000000000 Binary files a/neural_insights/web/app/static/media/intelone-display-regular.0f8c3ef25c545acb6b7c.ttf and /dev/null differ diff --git a/neural_insights/web/app/static/media/intelone-mono-font-family-regular.de914c9a804c00b4f3e5.ttf b/neural_insights/web/app/static/media/intelone-mono-font-family-regular.de914c9a804c00b4f3e5.ttf deleted file mode 100644 index 271117969d3..00000000000 Binary files a/neural_insights/web/app/static/media/intelone-mono-font-family-regular.de914c9a804c00b4f3e5.ttf and /dev/null differ diff --git a/neural_insights/web/communication.py b/neural_insights/web/communication.py deleted file mode 100644 index 5d335442080..00000000000 --- a/neural_insights/web/communication.py +++ /dev/null @@ -1,97 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Objects to communicate between domain logic and outside layers.""" - -from queue import Queue -from typing import Any, Dict, List, Union - - -class Request: - """Domain defined parameters.""" - - def __init__(self, method: str, operation: str, data: dict) -> None: - """Initialize properties.""" - self.method: str = method - self.operation: str = operation - self.data: dict = data - - -class Response: - """Domain defined response.""" - - def __init__(self) -> None: - """Initialize properties.""" - self.data: Union[Dict[str, Any], List[Dict[str, Any]]] = {} - self.command: Dict[str, Any] = {} - - -def create_simple_response( - data: Union[Dict[str, Any], List[Dict[str, Any]]], -) -> Response: - """Create new Response object with only data set.""" - response = Response() - response.data = data - return response - - -class Message: - """Message used to send data to GUI.""" - - def __init__(self, status: str, subject: str, data: Any): - """Initialize message.""" - self._status: str = status - self._subject: str = subject - self._data: Any = data - - @property - def subject(self) -> str: - """Get the subject.""" - return self._subject - - @property - def status(self) -> str: - """Get the status.""" - return self._status - - @property - def data(self) -> Any: - """Get the data.""" - return self._data - - -class MessageQueue: - """Queue for passing messages to GUI.""" - - _queue: Queue = Queue() - - def post_failure(self, subject: str, data: Any) -> None: - """Post failure message.""" - self._queue.put(Message("failure", subject, data)) - - def post_success(self, subject: str, data: Any) -> None: - """Post success message.""" - self._queue.put(Message("success", subject, data)) - - def post_error(self, subject: str, data: Any) -> None: - """Post error message.""" - self._queue.put(Message("error", subject, data)) - - def post_info(self, subject: str, data: Any) -> None: - """Post info message.""" - self._queue.put(Message("info", subject, data)) - - def get(self) -> Message: - """Wait for message and return it.""" - return self._queue.get() diff --git a/neural_insights/web/configuration.py b/neural_insights/web/configuration.py deleted file mode 100644 index 7279dd4ddd3..00000000000 --- a/neural_insights/web/configuration.py +++ /dev/null @@ -1,287 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Configuration module for Neural Insights server.""" - -import argparse -import logging -import os -import secrets -import socket -import sys -from typing import Dict - -from numpy.random import randint - -from neural_compressor.utils.utility import singleton -from neural_insights.utils.consts import WORKDIR_LOCATION -from neural_insights.utils.exceptions import NotFoundException -from neural_insights.utils.logger import log -from neural_insights.utils.utils import determine_ip - - -@singleton -class Configuration: - """Configuration object for Neural Insights server.""" - - PORT_DEFAULT = 5000 - MAX_PORTS_TRIED = 10 - - def __init__(self) -> None: - """Set the variables.""" - self.server_address = "" - self.server_port = 0 - self.url_prefix: str = "" - self.gui_port = 0 - self.log_level = 0 - self.token = "" - self.scheme = "" - self.workdir = "" - self.allow_insecure_connections = False - self.tls_certificate = "" - self.tls_key = "" - self.set_up() - - def set_up(self) -> None: - """Reset variables.""" - self.determine_values_from_environment() - - def determine_values_from_environment(self) -> None: - """Set variables based on environment values.""" - args = self.get_command_line_args() - self.server_address = determine_ip() - self.server_port = self.determine_server_port(args) - self.url_prefix = self.determine_url_prefix(args) - self.gui_port = self.determine_gui_port(args) - self.log_level = self.determine_log_level(args) - self.token = secrets.token_hex(16) - self.allow_insecure_connections = args.get("allow_insecure_connections", False) - self.tls_certificate = args.get("cert", "") - self.tls_key = args.get("key", "") - self.workdir = args.get("workdir_location", WORKDIR_LOCATION) - self.scheme = "http" if self.allow_insecure_connections else "https" - - @property - def global_config_directory(self) -> str: - """Get the directory for global config files.""" - return os.path.join( - os.environ.get("HOME", ""), - ".neural_compressor", - ) - - def get_command_line_args(self) -> Dict: - """Return arguments passed in command line.""" - parser = argparse.ArgumentParser( - description="Run Neural Insights server.", - ) - parser.add_argument( - "-p", - "--port", - type=int, - help="server port number to listen on", - ) - parser.add_argument( - "-P", - "--gui-port", - type=int, - help="port number for GUI", - ) - parser.add_argument( - "-U", - "--url-prefix", - type=str, - default="", - help="URL prefix for Neural Insights instance.", - ) - parser.add_argument( - "--allow-insecure-connections", - action="store_true", - help="run server without encryption", - ) - parser.add_argument( - "--cert", - type=str, - default="", - help="TLS Certificate to use", - ) - parser.add_argument( - "--key", - type=str, - default="", - help="TLS private key to use", - ) - parser.add_argument( - "--workdir-location", - type=str, - default=WORKDIR_LOCATION, - help="Path to work directory.", - ) - parser.add_argument( - "--verbose", - "-v", - action="count", - default=2, - help="verbosity of logging output, use -vv and -vvv for even more logs", - ) - return vars(parser.parse_args()) - - def determine_server_port(self, args: Dict) -> int: - """Return port to be used by the server. - - Will raise a NotFoundException if port is already in use. - - When port given in command line, only that port will be tried. - When no port specified will try self.MAX_PORTS_TRIED times, - starting with self.PORT_DEFAULT. - """ - command_line_port = args.get("port") - if command_line_port is not None: - self._ensure_valid_port(command_line_port) - if self.is_port_taken(command_line_port): - raise NotFoundException( - f"Port {command_line_port} already in use, exiting.", - ) - else: - return command_line_port - - ports = [self.PORT_DEFAULT] + randint( - 1025, - 65536, - self.MAX_PORTS_TRIED - 1, - ).tolist() - - for port in ports: - if not self.is_port_taken(port): - return port - - raise NotFoundException( - f"Unable to find a free port in {len(ports)} attempts, exiting.", - ) - - def determine_gui_port(self, args: Dict) -> int: - """Return port to be used by the GUI client. - - Will return self.server_port unless specified in configuration. - """ - command_line_port = args.get("gui_port") - if command_line_port is not None: - self._ensure_valid_port(command_line_port) - return command_line_port - return self.server_port - - def is_port_taken(self, port: int) -> bool: - """Return if given port is already in use.""" - s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - - try: - s.bind((self.server_address, port)) - except socket.error: - return True - finally: - s.close() - - return False - - def determine_log_level(self, args: Dict) -> int: - """Determine log level based on parameters given.""" - verbosity_mapping = [ - logging.CRITICAL, - logging.WARNING, - logging.INFO, - logging.DEBUG, - ] - verbosity: int = args.get("verbose") # type:ignore - try: - return verbosity_mapping[verbosity] - except IndexError: - return logging.DEBUG - - @staticmethod - def determine_url_prefix(args: dict) -> str: - """Determine url prefix based on parameters given.""" - url_prefix = args.get("url_prefix", "") - if isinstance(url_prefix, str) and not url_prefix.startswith("/"): - url_prefix = f"/{url_prefix}" - return url_prefix - - def get_url(self) -> str: - """Return URL to access application.""" - base_url = f"{self.scheme}://{self.server_address}:{self.gui_port}" - if self.url_prefix != "/": - base_url = f"{base_url}{self.url_prefix}" - return f"{base_url}/?token={self.token}" - - def dump_token_to_file(self) -> None: - """Dump token to file.""" - token_filepath = os.path.join(WORKDIR_LOCATION, "token") - os.makedirs(os.path.dirname(token_filepath), exist_ok=True) - - if sys.platform == "win32": - self.create_secured_token_file_win(token_filepath) - - try: - token_file = os.open(token_filepath, flags=os.O_WRONLY | os.O_CREAT, mode=0o600) - os.write(token_file, self.token.encode()) - except Exception as err: - raise err - finally: - os.close(token_file) - - log.debug(f"Token has been dumped to {token_filepath}.") - - @staticmethod - def create_secured_token_file_win(token_filepath: str): - """Create secured file on Windows OS.""" - import ntsecuritycon as con # pylint: disable=import-error - import win32api # pylint: disable=import-error - import win32file # pylint: disable=import-error - import win32security # pylint: disable=import-error - - username = win32api.GetUserName() - os.makedirs(os.path.dirname(token_filepath), exist_ok=True) - - if os.path.exists(token_filepath): - os.remove(token_filepath) - - security_descriptor = win32security.SECURITY_DESCRIPTOR() - user_sid, _, _ = win32security.LookupAccountName("", username) - - access_rights = con.FILE_ALL_ACCESS - - dacl = win32security.ACL() - dacl.AddAccessAllowedAce(win32security.ACL_REVISION, access_rights, user_sid) - - security_descriptor.SetSecurityDescriptorDacl(1, dacl, 0) - - security_attributes = win32security.SECURITY_ATTRIBUTES() - security_attributes.SECURITY_DESCRIPTOR = security_descriptor - - handle = win32file.CreateFile( - token_filepath, - win32file.GENERIC_WRITE, - win32file.FILE_SHARE_READ, - security_attributes, - win32file.CREATE_NEW, - win32file.FILE_ATTRIBUTE_NORMAL, - None, - ) - - win32file.CloseHandle(handle) - - def _ensure_valid_port(self, port: int) -> None: - """Validate if proposed port number is allowed by TCP/IP.""" - if port < 1: - raise ValueError(f"Lowest allowed port number is 1, attempted to use: {port}") - if port > 65535: - raise ValueError(f"Highest allowed port number is 65535, attempted to use: {port}") diff --git a/neural_insights/web/exceptions.py b/neural_insights/web/exceptions.py deleted file mode 100644 index 9d8340527d7..00000000000 --- a/neural_insights/web/exceptions.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Web Exceptions.""" - -from neural_insights.utils.exceptions import NotFoundException - - -class ServiceNotFoundException(NotFoundException): - """Unknown Service requested.""" - - pass diff --git a/neural_insights/web/router.py b/neural_insights/web/router.py deleted file mode 100644 index 84900f885af..00000000000 --- a/neural_insights/web/router.py +++ /dev/null @@ -1,254 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Connector between api.py and components.""" -import json -import os -from threading import Thread -from typing import Any, Callable, Dict, List, Optional - -from werkzeug.wrappers import Response as WebResponse - -from neural_insights.components.diagnosis.diagnosis import Diagnosis -from neural_insights.components.diagnosis.factory import DiagnosisFactory -from neural_insights.components.diagnosis.op_details import OpDetails -from neural_insights.components.graph.graph import Graph -from neural_insights.components.graph.graph_reader import GraphReader -from neural_insights.components.workload_manager.workload_manager import WorkloadManager -from neural_insights.utils.exceptions import ClientErrorException -from neural_insights.utils.json_serializer import JsonSerializer -from neural_insights.web.communication import Request, Response, create_simple_response -from neural_insights.web.exceptions import ServiceNotFoundException -from neural_insights.web.service.request_data_processor import RequestDataProcessor - - -class RoutingDefinition: - """Abstract routing definition.""" - - def __init__(self, callback: Callable[[Dict[str, Any]], Any]) -> None: - """Initialize object.""" - self.callback = callback - - -class RealtimeRoutingDefinition(RoutingDefinition): - """Routing executed in realtime.""" - - pass - - -class DeferredRoutingDefinition(RoutingDefinition): - """Routing executed in separate thread.""" - - pass - - -class Router: - """Connector between api.py and components.""" - - def __init__(self) -> None: - """Initialize object.""" - self.routes: Dict[str, RoutingDefinition] = { - "workloads": RealtimeRoutingDefinition(get_workloads_list), - "workloads/delete": RealtimeRoutingDefinition(delete_workload), - "profiling": RealtimeRoutingDefinition(get_profiling_details), - "model/graph": RealtimeRoutingDefinition(get_model_graph), - "model/summary": RealtimeRoutingDefinition(get_model_summary), - "model/graph/highlight_pattern": RealtimeRoutingDefinition(find_pattern_in_graph), - "diagnosis/op_list": RealtimeRoutingDefinition(get_op_list), - "diagnosis/op_details": RealtimeRoutingDefinition(get_op_details), - "diagnosis/histogram": RealtimeRoutingDefinition(get_histogram), - "profiling/result": RealtimeRoutingDefinition(get_profiling_details), - } - - def handle(self, request: Request) -> Response: - """Run operation on requested component and return result.""" - routing_definition = self.routes.get(request.operation) - if routing_definition is None: - raise ServiceNotFoundException(f"Unable to find {request.operation}") - - data = self._process_routing_definition(routing_definition, request.data) - if isinstance(data, WebResponse): - return data - - serialized_data = JsonSerializer.serialize_item(data) - - return create_simple_response(serialized_data) - - def _process_routing_definition( - self, - routing_definition: RoutingDefinition, - data: dict, - ) -> Any: - """Process routing definition.""" - if isinstance(routing_definition, RealtimeRoutingDefinition): - return routing_definition.callback(data) - if isinstance(routing_definition, DeferredRoutingDefinition): - self._validate_deffered_routing_data(data) - t = Thread(target=routing_definition.callback, args=(data,)) - t.daemon = True - t.start() - return {"exit_code": 102, "message": "processing"} - raise ValueError( - f"Unsupported RoutingDefinition type: {routing_definition.__class__.__name__}", - ) - - @staticmethod - def _validate_deffered_routing_data(data: dict) -> None: - """Validate input data for Deferred Routing and raises in case of issues.""" - request_id = str(data.get("request_id", "")) - if not request_id: - raise ClientErrorException("Missing request id.") - - -def get_model_graph(data: Dict[str, Any]) -> Graph: - """Get model graph.""" - graph_reader = GraphReader() - return graph_reader.read( - model_path=RequestDataProcessor.get_string_value(data, "path"), - expanded_groups=data.get("group", []), - ) - - -def get_model_summary(data: Dict[str, Any]) -> Dict: - """Get model graph.""" - workload_id: Optional[str] = data.get("workload_id", None) - workload = WorkloadManager().get_workload(workload_id) - - if workload.model_summary_file is None: - raise Exception("Model summary not found.") - with open(workload.model_summary_file, "r") as summary_file: - model_summary = "\n".join(summary_file.readlines()) - return { - "summary": model_summary, - } - - -def find_pattern_in_graph(data: Dict[str, Any]) -> dict: - """Find OP pattern in graph for diagnosis tab.""" - graph_reader = GraphReader() - - model_path = RequestDataProcessor.get_string_value(data, "path") - op_name = data.get("op_name", None) - pattern = data.get("pattern", None) - if any(param is None for param in [model_path, op_name, pattern]): - raise ClientErrorException( - "Missing parameters. Required parameters are: path, op_name and pattern.", - ) - model_graph, expanded_groups = graph_reader.find_pattern_in_graph( - model_path=model_path, - op_name=op_name, - pattern=pattern, - ) - return {"graph": model_graph.serialize(), "groups": expanded_groups} - - -def get_workloads_list(data: Dict[str, Any]) -> dict: - """Get workloads list.""" - workload_manager = WorkloadManager() - - serialized_workloads = [workload.serialize() for workload in workload_manager.workloads] - return { - "workloads": serialized_workloads, - } - - -def delete_workload(data: Dict[str, Any]) -> dict: - """Remove workload from workloads list.""" - workload_id: Optional[str] = data.get("workload_id", None) - if workload_id is None: - raise ClientErrorException("Could not find workload ID.") - - removed_id = WorkloadManager().remove_workload(workload_id) - - return { - "workload_id": removed_id, - } - - -def get_diagnosis(workload_id: str) -> Diagnosis: - """Get diagnosis object for specified workload.""" - workload = WorkloadManager().get_workload(workload_id) - diagnosis = DiagnosisFactory.get_diagnosis(workload) - return diagnosis - - -def get_op_list(data: Dict[str, Any]) -> List[dict]: - """Get OP list for model.""" - workload_id: Optional[str] = data.get("workload_id", None) - if workload_id is None: - raise ClientErrorException("Could not find workload ID.") - diagnosis = get_diagnosis(workload_id) - - return diagnosis.get_op_list() - - -def get_op_details(data: Dict[str, Any]) -> dict: - """Get OP details for specific OP in model.""" - try: - workload_id: str = str(data.get("workload_id", None)) - op_name: str = str(data.get("op_name", None)) - except ValueError: - raise ClientErrorException("Incorrect parameter values.") - except TypeError: - raise ClientErrorException("Could not find all required parameters.") - - diagnosis = get_diagnosis(workload_id) - - op_details: Optional[OpDetails] = diagnosis.get_op_details(op_name) - if op_details is None: - return {} - return op_details.serialize() - - -def get_histogram(data: Dict[str, Any]) -> list: - """Get histogram of specific tensor in model.""" - try: - workload_id: str = str(data.get("workload_id", None)) - op_name: str = str(data.get("op_name", None)) - histogram_type: str = str(data.get("type", None)) - except ValueError: - raise ClientErrorException("Incorrect parameter values.") - except TypeError: - raise ClientErrorException("Could not find all required parameters.") - - diagnosis = get_diagnosis(workload_id) - - histogram_type_map = { - "weights": "weight", - "activation": "activation", - } - - parsed_histogram_type: Optional[str] = histogram_type_map.get(histogram_type, None) - if parsed_histogram_type is None: - raise ClientErrorException( - f"Histogram type not supported. " f"Use one of following: {histogram_type_map.keys()}", - ) - - histogram_data = diagnosis.get_histogram_data(op_name, parsed_histogram_type) - return histogram_data - - -def get_profiling_details(data: Dict[str, Any]) -> List[dict]: - """Get profiling result.""" - workload_id: Optional[str] = data.get("workload_id", None) - if workload_id is None: - raise ClientErrorException("Could not find workload ID.") - workload = WorkloadManager().get_workload(workload_id) - profiling_data_path = os.path.join( - workload.workload_location, - "profiling_data.json", - ) - with open(profiling_data_path, "r") as json_file: - profiling_data = json.load(json_file) - return profiling_data diff --git a/neural_insights/web/server.py b/neural_insights/web/server.py deleted file mode 100644 index 8d3cb1f708f..00000000000 --- a/neural_insights/web/server.py +++ /dev/null @@ -1,253 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Main endpoint for GUI.""" -import os -import time -from functools import wraps -from threading import Thread -from typing import Any, Callable - -from flask import Blueprint, Flask -from flask import Request as WebRequest -from flask import jsonify, render_template, request -from flask_cors import CORS -from flask_socketio import SocketIO -from werkzeug.serving import make_ssl_devcert -from werkzeug.wrappers import Response as WebResponse - -from neural_insights.components.workload_manager.workload_manager import WorkloadManager -from neural_insights.utils.consts import CONFIG_REFRESH_PERIOD -from neural_insights.utils.exceptions import InternalException -from neural_insights.utils.logger import log -from neural_insights.web.communication import MessageQueue, Request -from neural_insights.web.configuration import Configuration -from neural_insights.web.router import Router -from neural_insights.web.service.response_generator import ResponseGenerator - -templates_dir = os.path.abspath( - os.path.join( - os.path.dirname(__file__), - "app", - ), -) - -app = Flask( - __name__, - static_folder=templates_dir, - static_url_path="/", - template_folder=templates_dir, -) -app_blueprint = Blueprint("Neural Insights", __name__) -socketio = SocketIO() - -router = Router() - -METHODS = ["GET", "POST"] - -# Suppress TensorFlow messages -os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3" - -url_prefix: str = "" -workload_manager = None - - -def run_server(configuration: Configuration) -> None: - """Run webserver on specified scheme, address and port.""" - addr = configuration.server_address - server_port = configuration.server_port - gui_port = configuration.gui_port - token = configuration.token - - global url_prefix - url_prefix = configuration.url_prefix - - cors_allowed_origins = f"{configuration.scheme}://{addr}:{gui_port}" - - app.config["JSON_SORT_KEYS"] = False - app.register_blueprint(app_blueprint, url_prefix=url_prefix) - app.secret_key = token - CORS(app, origins=cors_allowed_origins) - socketio.init_app( - app, - cors_allowed_origins=cors_allowed_origins, - max_http_buffer_size=2000, - ) - tls_args = get_tls_args(configuration) - - global workload_manager - workload_manager = WorkloadManager(workdir_location=configuration.workdir) - - socketio.run(app, host=addr, port=server_port, **tls_args) - - -def get_tls_args(configuration: Configuration) -> dict: - """Get TLS configuration.""" - if configuration.allow_insecure_connections: - return {} - - if configuration.tls_certificate and configuration.tls_key: - certfile = configuration.tls_certificate - keyfile = configuration.tls_key - else: - os.makedirs(configuration.global_config_directory, mode=511, exist_ok=True) - base_path = os.path.join(configuration.global_config_directory, "certificate") - certfile = f"{base_path}.crt" - keyfile = f"{base_path}.key" - if not os.path.isfile(certfile) or not os.path.isfile(keyfile): - certfile, keyfile = make_ssl_devcert(base_path) - - return { - "certfile": certfile, - "keyfile": keyfile, - "do_handshake_on_connect": False, - } - - -@app_blueprint.after_request -def block_iframe(response: WebResponse) -> WebResponse: - """Block iframe and set others CSP.""" - response.headers["X-Frame-Options"] = "DENY" - response.headers["Content-Security-Policy"] = ( - "frame-ancestors 'none'; font-src 'self'; img-src 'self'; script-src 'self'" - ) - response.headers["Access-Control-Max-Age"] = "-1" - return response - - -@app_blueprint.after_request -def block_sniffing(response: WebResponse) -> WebResponse: - """Block MIME sniffing.""" - response.headers["X-Content-Type-Options"] = "nosniff" - return response - - -def require_api_token(func: Callable) -> Any: - """Validate authorization token.""" - - @wraps(func) - def check_token(*args: str, **kwargs: str) -> Any: - """Validate that correct token was provided.""" - provided_token = request.headers.get( - "Authorization", - request.args.to_dict().get("token", None), - ) - - if not app.secret_key == provided_token: - return ( - "Invalid token, please use the URL displayed by the server on startup", - 403, - ) - - return func(*args, **kwargs) - - return check_token - - -@app_blueprint.route("/", methods=METHODS) -def root() -> Any: - """Serve JS application index.""" - return render_template("index.html", url_prefix=url_prefix) - - -@app_blueprint.route("/api/", methods=METHODS) -@require_api_token -def handle_api_call(subpath: str) -> Any: - """Handle API access.""" - try: - parameters = build_parameters(subpath, request) - response = router.handle(parameters) - if isinstance(response, WebResponse): - return response - return jsonify(response.data) - except Exception as err: - if isinstance(err, InternalException): - log.critical(err) - return ResponseGenerator.from_exception(err) - - -@app_blueprint.route("/api/", methods=["OPTIONS"]) -def allow_api_call(subpath: str) -> Any: - """Allow for API access.""" - return "OK" - - -@app.errorhandler(404) -def page_not_found(e: Any) -> Any: - """Serve JS application index when no static file found.""" - return render_template( - "index.html", - url_prefix=url_prefix, - ) - - -@app_blueprint.after_request -def disable_cache(response: WebResponse) -> WebResponse: - """Disable cache on all requests.""" - response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate" - response.headers["Pragma"] = "no-cache" - response.headers["Expires"] = "0" - response.headers["Cache-Control"] = "public, max-age=0" - return response - - -def build_parameters(endpoint: str, request: WebRequest) -> Request: - """Build domain object from flask request.""" - data = request.get_json() if request.is_json else request.args.to_dict(flat=False) - return Request(request.method, endpoint, data) - - -def web_socket_publisher(web_socket: SocketIO) -> None: - """Send messages from queue via web-socket to GUI.""" - queue = MessageQueue() - while True: - message = queue.get() - web_socket.emit( - message.subject, - {"status": message.status, "data": message.data}, - ) - socketio.sleep(0) - - -publisher = Thread( - target=web_socket_publisher, - args=(socketio,), -) -publisher.daemon = True -publisher.start() - - -def config_watcher(period_in_s: int) -> None: - """Observe config for changes and send notification when changed.""" - queue = MessageQueue() - config_modification_time = None - if workload_manager is not None: - config_modification_time = os.stat(workload_manager.config_path).st_mtime - while True: - time.sleep(period_in_s) - if workload_manager is None: - continue - config_path = workload_manager.config_path - config_mod_time_new = os.stat(config_path).st_mtime - if config_modification_time != config_mod_time_new: - config_modification_time = config_mod_time_new - queue.post_info("Config update", "Workload config has been modified.") - - -conf_watcher = Thread( - target=config_watcher, - args=(CONFIG_REFRESH_PERIOD,), -) -conf_watcher.daemon = True -conf_watcher.start() diff --git a/neural_insights/web/service/__init__.py b/neural_insights/web/service/__init__.py deleted file mode 100644 index 51720d2b907..00000000000 --- a/neural_insights/web/service/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Web services.""" diff --git a/neural_insights/web/service/request_data_processor.py b/neural_insights/web/service/request_data_processor.py deleted file mode 100644 index e6cc24f9529..00000000000 --- a/neural_insights/web/service/request_data_processor.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Request data processor.""" - -from typing import Any, Dict - -from neural_insights.utils.exceptions import ClientErrorException - - -class RequestDataProcessor: - """Request data processor.""" - - @staticmethod - def get_string_value(data: Dict[str, Any], name: str) -> str: - """Get string value from request.""" - try: - return data[name][0] - except KeyError: - raise ClientErrorException(f"Missing {name} parameter") diff --git a/neural_insights/web/service/response_generator.py b/neural_insights/web/service/response_generator.py deleted file mode 100644 index f782c91824b..00000000000 --- a/neural_insights/web/service/response_generator.py +++ /dev/null @@ -1,55 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Response generator.""" - -from werkzeug.wrappers import Response - -from neural_insights.utils.exceptions import ( - AccessDeniedException, - ClientErrorException, - InternalException, - NotFoundException, -) - - -class ResponseGenerator: - """Response generator class.""" - - @staticmethod - def add_refresh(response: Response, refresh_time: int) -> Response: - """Add Refresh header to response.""" - response.headers["refresh"] = refresh_time - return response - - @staticmethod - def from_exception(exception: Exception) -> Response: - """Create Response from Exception.""" - return Response( - response=str(exception), - status=ResponseGenerator.get_status_code_for_exception(exception), - ) - - @staticmethod - def get_status_code_for_exception(exception: Exception) -> int: - """Get HTTP status code for Exception.""" - if isinstance(exception, ClientErrorException): - return 400 - if isinstance(exception, AccessDeniedException): - return 403 - if isinstance(exception, NotFoundException): - return 404 - if isinstance(exception, InternalException): - return 500 - return 500 diff --git a/neural_solution/README.md b/neural_solution/README.md deleted file mode 100644 index bb88539e4af..00000000000 --- a/neural_solution/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# What's Neural Solution? - -Neural Solution is a flexible and easy to use tool that brings the capabilities of Intel® Neural Compressor as a service. With Neural Solution, Users can effortlessly submit optimization tasks through the RESTful/gRPC APIs. Neural Solution automatically dispatches these tasks to one or multiple nodes, streamlining the entire process. - -# Why Neural Solution? - -- Task Parallelism: Neural Solution automatically schedules the optimization task queue by coordinating available resources and allows execution of multiple optimization tasks simultaneously. -- Tuning Parallelism: Neural Solution accelerates the optimization process by seamlessly parallelizing the tuning across multiple nodes. -- APIs Support: Neural Solution supports both RESTful and gRPC APIs, enabling users to conveniently submit optimization tasks. -- Code Less: When working with Hugging Face models, Neural Solution seamlessly integrates the functionality of the [Neural Coder](https://github.com/intel/neural-compressor/tree/master/neural_coder), eliminating the need for any code modifications during the optimization process. - -# How does Neural Solution Work? -![NS-OaaS-Intro](./docs/source/imgs/NS-OaaS-Intro.png) - -# Get Started -## Installation -### Prerequisites - -- Install [Anaconda](https://docs.anaconda.com/free/anaconda/install/) -- Install [Open MPI](https://www.open-mpi.org/faq/?category=building#easy-build) -- Python 3.8 or later - - -There are two ways to install the neural solution: -### Method 1. Using pip: -``` -pip install neural-solution -``` - -### Method 2. Building from source: -```shell -# get source code -git clone https://github.com/intel/neural-compressor -cd neural-compressor - -# install neural compressor -pip install -r requirements.txt -python setup.py install - -# install neural solution -pip install -r neural_solution/requirements.txt -python setup.py neural_solution install -``` - -## End-to-end examples -- [Quantizing a Hugging Face model](./examples/hf_models/README.md) -- [Quantizing a custom model](./examples/custom_models_optimized/tf_example1/README.md) -## Learn More - - -- The Architecture documents -- [APIs Reference](./docs/source/description_api.md) - -# Contact - -Please contact us at [inc.maintainers@intel.com](mailto:inc.maintainers@intel.com) for any Neural Solution related question. diff --git a/neural_solution/__init__.py b/neural_solution/__init__.py deleted file mode 100644 index 67e0ac52f38..00000000000 --- a/neural_solution/__init__.py +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Neural Solution.""" -from neural_solution.utils import logger diff --git a/neural_solution/backend/__init__.py b/neural_solution/backend/__init__.py deleted file mode 100644 index 0fea45c0091..00000000000 --- a/neural_solution/backend/__init__.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Neural Solution backend.""" -from neural_solution.backend.cluster import Cluster -from neural_solution.backend.result_monitor import ResultMonitor -from neural_solution.backend.scheduler import Scheduler -from neural_solution.backend.task_db import TaskDB -from neural_solution.backend.task_monitor import TaskMonitor diff --git a/neural_solution/backend/cluster.py b/neural_solution/backend/cluster.py deleted file mode 100644 index f742bde0726..00000000000 --- a/neural_solution/backend/cluster.py +++ /dev/null @@ -1,221 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Neural Solution cluster.""" -import sqlite3 -import threading -from collections import Counter -from typing import List - -from neural_solution.backend.utils.utility import create_dir, synchronized -from neural_solution.utils import logger - - -class Cluster: - """Cluster resource management based on sockets.""" - - def __init__(self, node_lst=[], db_path=None): - """Init Cluster. - - Args: - node_lst: node list. Defaults to []. - db_path: cluster db path. Defaults to None. - """ - self.lock = threading.Lock() - self.node_lst = node_lst - self.socket_queue = [] - self.db_path = db_path - create_dir(db_path) - self.conn = sqlite3.connect(f"{db_path}", check_same_thread=False) - self.initial_cluster_from_node_lst(node_lst) - self.lock = threading.Lock() - - def reserve_resource(self, task): - """Reserve the resource and return the requested list of resources.""" - reserved_resource_lst = [] - workers = task.workers - logger.info(f"task {task.task_id} needs {workers}") - reserved_resource_lst = self.get_free_socket(workers) - if reserved_resource_lst: - allocated_resources = {} - counts = Counter(int(item.split()[0]) for item in reserved_resource_lst) - - for node_id, count in counts.items(): - allocated_resources[node_id] = count - for node_id in allocated_resources: - sql = """ - UPDATE cluster - SET busy_sockets = busy_sockets + ?, - free_sockets = total_sockets - busy_sockets - ? - WHERE id = ? - """ - self.cursor.execute(sql, (allocated_resources[node_id], allocated_resources[node_id], node_id)) - self.conn.commit() - logger.info(f"[Cluster] Assign {reserved_resource_lst} to task {task.task_id}") - return reserved_resource_lst - - @synchronized - def free_resource(self, reserved_resource_lst): - """Free the resource by adding the previous occupied resources to the socket queue.""" - self.socket_queue += reserved_resource_lst - counts = Counter(int(item.split()[0]) for item in reserved_resource_lst) - free_resources = {} - for node_id, count in counts.items(): - free_resources[node_id] = count - for node_id, count in counts.items(): - free_resources[node_id] = count - for node_id in free_resources: - sql = """ - UPDATE cluster - SET free_sockets = free_sockets + ?, - busy_sockets = total_sockets - free_sockets - ? - WHERE id = ? - """ - self.cursor.execute(sql, (free_resources[node_id], free_resources[node_id], node_id)) - self.conn.commit() - # delete nodes with status of remove, some version without RETURNING syntax - self.cursor.execute("SELECT id FROM cluster WHERE status='remove' AND busy_sockets=0") - deleted_ids = self.cursor.fetchall() - deleted_ids = [str(id_tuple[0]) for id_tuple in deleted_ids] - self.cursor.execute("DELETE FROM cluster WHERE status='remove' AND busy_sockets=0") - self.conn.commit() - - # remove deleted nodes from socket queue - socket_queue_delete_ids = [socket for socket in self.socket_queue if socket.split()[0] in deleted_ids] - if len(socket_queue_delete_ids) > 0: - logger.info(f"[Cluster] remove node-list {socket_queue_delete_ids} from socket_queue: {self.socket_queue}") - self.socket_queue = [socket for socket in self.socket_queue if socket.split()[0] not in deleted_ids] - logger.info(f"[Cluster] free resource {reserved_resource_lst}, now have free resource {self.socket_queue}") - - @synchronized - def get_free_socket(self, num_sockets: int) -> List[str]: - """Get the free sockets list.""" - booked_socket_lst = [] - - # detect and append new resource - self.cursor.execute("SELECT id, name, total_sockets FROM cluster where status = 'join'") - new_node_lst = self.cursor.fetchall() - for index, name, total_sockets in new_node_lst: - sql = """ - UPDATE cluster - SET status = ? - WHERE id = ? - """ - self.cursor.execute(sql, ("alive", index)) - self.conn.commit() - self.socket_queue += [str(index) + " " + name] * total_sockets - logger.info(f"[Cluster] add new node-id {index} to socket_queue: {self.socket_queue}") - - # do not assign nodes with status of remove - # remove to-delete nodes from socket queue - self.cursor.execute("SELECT id FROM cluster WHERE status='remove'") - deleted_ids = self.cursor.fetchall() - deleted_ids = [str(id_tuple[0]) for id_tuple in deleted_ids] - - socket_queue_delete_ids = [socket for socket in self.socket_queue if socket.split()[0] in deleted_ids] - if len(socket_queue_delete_ids) > 0: - logger.info(f"[Cluster] remove node-list {socket_queue_delete_ids} from socket_queue: {self.socket_queue}") - self.socket_queue = [socket for socket in self.socket_queue if socket.split()[0] not in deleted_ids] - - # delete nodes with status of remove - self.cursor.execute("DELETE FROM cluster WHERE status='remove' AND busy_sockets=0") - self.conn.commit() - - if len(self.socket_queue) < num_sockets: - logger.info(f"Can not allocate {num_sockets} sockets, due to only {len(self.socket_queue)} left.") - return 0 - else: - booked_socket_lst = self.socket_queue[:num_sockets] - self.socket_queue = self.socket_queue[num_sockets:] - return booked_socket_lst - - @synchronized - def initial_cluster_from_node_lst(self, node_lst): - """Initialize cluster according to the node list. - - Args: - node_lst (List): the node list. - """ - # sqlite should set this check_same_thread to False - self.conn = sqlite3.connect(f"{self.db_path}", check_same_thread=False) - self.cursor = self.conn.cursor() - self.cursor.execute("drop table if exists cluster ") - self.cursor.execute( - r"create table cluster(id INTEGER PRIMARY KEY AUTOINCREMENT," - + "name varchar(100)," - + "node_info varchar(500)," - + "status varchar(100)," - + "free_sockets int," - + "busy_sockets int," - + "total_sockets int)" - ) - self.node_lst = node_lst - for index, node in enumerate(self.node_lst): - self.socket_queue += [str(index + 1) + " " + node.name] * node.num_sockets - self.cursor.execute( - r"insert into cluster(name, node_info, status, free_sockets, busy_sockets, total_sockets)" - + "values ('{}', '{}', '{}', {}, {}, {})".format( - node.name, - repr(node).replace("Node", f"Node{index+1}"), - "alive", - node.num_sockets, - 0, - node.num_sockets, - ) - ) - - self.conn.commit() - logger.info(f"socket_queue: {self.socket_queue}") - - -class Node: - """Node definition.""" - - name: str = "unknown_node" - ip: str = "unknown_ip" - num_sockets: int = 0 - num_cores_per_socket: int = 0 - num_gpus: int = 0 # For future use - - def __init__( - self, name: str, ip: str = "unknown_ip", num_sockets: int = 0, num_cores_per_socket: int = 0, num_gpus: int = 0 - ) -> None: - """Init node. - - hostfile template: - host1 2 20 # host1 has 2 sockets, each socket has 20 cores - host2 2 20 # host2 has 2 sockets, each socket has 20 cores - - Args: - name: node name - ip: ip address. Defaults to "unknown_ip". - num_sockets: the number of sockets. Defaults to 0. - num_cores_per_socket: the number of core(s) per socket. Defaults to 0. - num_gpus: the number of gpus. Defaults to 0. - """ - self.name = name - self.ip = ip - self.num_sockets = num_sockets - self.num_cores_per_socket = num_cores_per_socket - self.num_gpus = num_gpus - - def __repr__(self) -> str: - """Return node info. - - Returns: - str: node info. - """ - return ( - f"Node: {self.name}(ip: {self.ip}) has {self.num_sockets} socket(s) " - f"and each socket has {self.num_cores_per_socket} cores." - ) diff --git a/neural_solution/backend/result_monitor.py b/neural_solution/backend/result_monitor.py deleted file mode 100644 index fb99a34f409..00000000000 --- a/neural_solution/backend/result_monitor.py +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Neural Solution result monitor.""" - -import socket - -from neural_solution.backend.task_db import TaskDB -from neural_solution.backend.utils.utility import deserialize, serialize -from neural_solution.utils import logger - - -class ResultMonitor: - """ResultMonitor is a thread that monitors the coming task results and update the task collection in the TaskDb. - - Attributes: - port: The port that ResultMonitor listens to - task_db: the TaskDb object that manages the tasks - """ - - def __init__(self, port, task_db: TaskDB): - """Init ResultMonitor. - - Args: - port (int): the port for monitoring task results. - task_db (TaskDB): the object of TaskDB. - """ - self.s = socket.socket() - self.port = port - self.task_db = task_db - - def wait_result(self): - """Monitor the task results and update them in the task db and send back to studio.""" - self.s.bind(("localhost", self.port)) # open a port as the serving port for results - self.s.listen(10) - while True: - logger.info("[ResultMonitor] waiting for results...") - c, addr = self.s.accept() - result = c.recv(2048) - result = deserialize(result) - if "ping" in result: - logger.info("[ResultMonitor] Client query status.") - c.send(b"ok") - c.close() - continue - logger.info("[ResultMonitor] getting result: {}".format(result)) - logger.info("[ResultMonitor] getting q_model path: {}".format(result["q_model_path"])) - self.task_db.update_q_model_path_and_result(result["task_id"], result["q_model_path"], result["result"]) - c.close() - # TODO send back the result to the studio - # or let studio manually fresh the page and call the query_task_status to get the result? - - def query_task_status(self, task_id): - """Synchronize query on the task status.""" - # TODO send back the result to the studio? RPC for query? - logger.info(self.task_db.lookup_task_status(task_id)) diff --git a/neural_solution/backend/runner.py b/neural_solution/backend/runner.py deleted file mode 100644 index ebf013137c8..00000000000 --- a/neural_solution/backend/runner.py +++ /dev/null @@ -1,104 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Main backend runner.""" -import argparse -import threading - -from neural_solution.backend import ResultMonitor, Scheduler, TaskDB, TaskMonitor -from neural_solution.backend.utils.utility import build_cluster, get_db_path -from neural_solution.config import config -from neural_solution.utils import logger - - -def parse_args(args=None): - """Parse the command line options. - - Args: - args (Any, optional): the command line options. Defaults to None. - - Returns: - argparse.Namespace: arguments. - """ - parser = argparse.ArgumentParser( - description="Neural Solution runner automatically schedules multiple inc tasks and\ - executes multi-node distributed tuning." - ) - - parser.add_argument( - "-H", "--hostfile", type=str, default=None, help="Path to the host file which contains all available nodes." - ) - parser.add_argument("-TMP", "--task_monitor_port", type=int, default=2222, help="Port to monitor task.") - parser.add_argument("-RMP", "--result_monitor_port", type=int, default=3333, help="Port to monitor result.") - parser.add_argument("-WS", "--workspace", type=str, default="./", help="Work space.") - parser.add_argument( - "-CEN", "--conda_env_name", type=str, default="inc", help="Conda environment for task execution" - ) - parser.add_argument("-UP", "--upload_path", type=str, default="./examples", help="Custom example path.") - - return parser.parse_args(args=args) - - -def main(args=None): - """Implement the main entry of backend. - - create the task db. - start the result monitor. - start the task scheduler. - start the task monitor. - """ - args = parse_args(args) - - logger.info(f"Current workspace {args.workspace}") - db_path = get_db_path(args.workspace) - - # Initialize cluster from the host file. If there is no host file, build one local cluster. - cluster, num_threads_per_process = build_cluster(args.hostfile, db_path) - - # initialize the task db - task_db = TaskDB(db_path) - - # start three threads - rm = ResultMonitor(args.result_monitor_port, task_db) - t_rm = threading.Thread(target=rm.wait_result) - config.workspace = args.workspace - - ts = Scheduler( - cluster, - task_db, - args.result_monitor_port, - conda_env_name=args.conda_env_name, - upload_path=args.upload_path, - config=config, - num_threads_per_process=num_threads_per_process, - ) - t_ts = threading.Thread(target=ts.schedule_tasks) - - tm = TaskMonitor(args.task_monitor_port, task_db) - t_tm = threading.Thread(target=tm.wait_new_task) - - t_rm.start() - t_ts.start() - t_tm.start() - logger.info( - "task monitor port {} and result monitor port {}".format(args.task_monitor_port, args.result_monitor_port) - ) - logger.info("server start...") - - t_rm.join() - t_ts.join() - t_tm.join() - - -if __name__ == "__main__": - main() diff --git a/neural_solution/backend/scheduler.py b/neural_solution/backend/scheduler.py deleted file mode 100644 index 9bff3b3ea54..00000000000 --- a/neural_solution/backend/scheduler.py +++ /dev/null @@ -1,309 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Neural Solution scheduler.""" -import glob -import json -import os -import re -import shutil -import socket -import subprocess -import threading -import time - -from neural_solution.backend.cluster import Cluster -from neural_solution.backend.task import Task -from neural_solution.backend.task_db import TaskDB -from neural_solution.backend.utils.utility import ( - build_workspace, - dump_elapsed_time, - get_current_time, - get_q_model_path, - get_task_log_path, - is_remote_url, - serialize, -) -from neural_solution.utils import logger -from neural_solution.utils.utility import get_task_log_workspace, get_task_workspace - -# TODO update it according to the platform -cmd = ["echo", f"{subprocess.getoutput('conda info --base')}/etc/profile.d/conda.sh"] -process = subprocess.run(cmd, capture_output=True, text=True) -CONDA_SOURCE_PATH = process.stdout.strip() - - -class Scheduler: - """Scheduler dispatches the task with the available resources, calls the mpi command and report results.""" - - def __init__( - self, - cluster: Cluster, - task_db: TaskDB, - result_monitor_port, - conda_env_name=None, - upload_path="./examples", - config=None, - num_threads_per_process=5, - ): - """Scheduler dispatches the task with the available resources, calls the mpi command and report results. - - Attributes: - cluster: the Cluster object that manages the server resources - task_db: the TaskDb object that manages the tasks - result_monitor_port: The result monitor port to report the accuracy and performance result - conda_env_name: The basic environment for task execution - upload_path: Custom example path. - """ - self.cluster = cluster - self.task_db = task_db - self.result_monitor_port = result_monitor_port - self.conda_env_name = conda_env_name - self.upload_path = upload_path - self.config = config - self.num_threads_per_process = num_threads_per_process - - def prepare_env(self, task: Task): - """Check and create a conda environment. - - If the required packages are not installed in the conda environment, - create a new conda environment and install the required packages. - - Args: - task (Task): task - """ - # Define the prefix of the conda environment name - env_prefix = self.conda_env_name - requirement = task.requirement.split(" ") - # Skip check when requirement is empty. - if requirement == [""]: - return env_prefix - # Construct the command to list all the conda environments - cmd = ["conda", "env", "list"] - process = subprocess.run(cmd, capture_output=True, text=True) - output = process.stdout.strip() - # Parse the output to get a list of conda environment names - env_list = [line.strip().split()[0] for line in output.splitlines()[2:]] - conda_env = None - for env_name in env_list: - # Only check the conda environments that start with the specified prefix - if env_name.startswith(env_prefix): - conda_bash_cmd = f"source {CONDA_SOURCE_PATH}" - cmd = f"{conda_bash_cmd} && conda activate {env_name} && conda list" - output = subprocess.getoutput(cmd) # nosec - - # Parse the output to get a list of installed package names - installed_packages = [line.split()[0] for line in output.splitlines()[2:]] - installed_packages_version = [ - line.split()[0] + "=" + line.split()[1] for line in output.splitlines()[2:] - ] - missing_packages = set(requirement) - set(installed_packages) - set(installed_packages_version) - if not missing_packages: - conda_env = env_name - break - if conda_env is None: - # Construct the command to create a new conda environment and install the required packages - from datetime import datetime - - now = datetime.now() - suffix = now.strftime("%Y%m%d-%H%M%S") - conda_env = f"{env_prefix}_{suffix}" - # Construct the name of the new conda environment - cmd = ( - f"source {CONDA_SOURCE_PATH} && conda create -n {conda_env} --clone {env_prefix}" - f" && conda activate {conda_env} && pip install {task.requirement.replace('=','==')}" - ) - p = subprocess.Popen(cmd, shell=True) # nosec - logger.info(f"[Scheduler] Creating new environment {conda_env} start.") - p.wait() - logger.info(f"[Scheduler] Creating new environment {conda_env} end.") - return conda_env - - def prepare_task(self, task: Task): - """Prepare workspace and download run_task.py for task. - - Args: - task (Task): task - """ - self.task_path = build_workspace(path=get_task_workspace(self.config.workspace), task_id=task.task_id) - logger.info(f"****TASK PATH: {self.task_path}") - if is_remote_url(task.script_url): - task_url = task.script_url.replace("github.com", "raw.githubusercontent.com").replace("blob", "") - try: - subprocess.check_call(["wget", "-P", self.task_path, task_url]) - except subprocess.CalledProcessError as e: - logger.info("Failed: {}".format(e.cmd)) - else: - # Assuming the file is uploaded in directory examples - example_path = os.path.abspath(os.path.join(self.upload_path, task.script_url)) - # only one python file - script_path = glob.glob(os.path.join(example_path, "*.py"))[0] - # script_path = glob.glob(os.path.join(example_path, f'*{extension}'))[0] - self.script_name = script_path.split("/")[-1] - shutil.copy(script_path, os.path.abspath(self.task_path)) - task.arguments = task.arguments.replace("=dataset", "=" + os.path.join(example_path, "dataset")).replace( - "=model", "=" + os.path.join(example_path, "model") - ) - if not task.optimized: - # Generate quantization code with Neural Coder API - neural_coder_cmd = ["python -m neural_coder --enable --approach"] - # for users to define approach: "static", "static_ipex", "dynamic", "auto" - approach = task.approach - neural_coder_cmd.append(approach) - if is_remote_url(task.script_url): - self.script_name = task.script_url.split("/")[-1] - neural_coder_cmd.append(self.script_name) - neural_coder_cmd = " ".join(neural_coder_cmd) - full_cmd = """cd {}\n{}""".format(self.task_path, neural_coder_cmd) - p = subprocess.Popen(full_cmd, shell=True) # nosec - logger.info("[Neural Coder] Generating optimized code start.") - p.wait() - logger.info("[Neural Coder] Generating optimized code end.") - - def check_task_status(self, log_path): - """Check status for the task from log path. - - Args: - log_path (str): the log path for task. - - Returns: - str: status "done" or "failed" - """ - for line in reversed(open(log_path).readlines()): - res_pattern = r"[INFO] Save deploy yaml to" - # res_matches = re.findall(res_pattern, line) - if res_pattern in line: - return "done" - return "failed" - - def _parse_cmd(self, task: Task, resource): - # mpirun -np 3 -mca btl_tcp_if_include 192.168.20.0/24 -x OMP_NUM_THREADS=80 - # --host mlt-skx091,mlt-skx050,mlt-skx053 bash run_distributed_tuning.sh - self.prepare_task(task) - conda_env = self.prepare_env(task) - host_str = ",".join([item.split(" ")[1] for item in resource]) - logger.info(f"[TaskScheduler] host resource: {host_str}") - - # Activate environment - conda_bash_cmd = f"source {CONDA_SOURCE_PATH}" - conda_env_cmd = f"conda activate {conda_env}" - mpi_cmd = [ - "mpirun", - "-np", - "{}".format(task.workers), - "-host", - "{}".format(host_str), - "-map-by", - "socket:pe={}".format(self.num_threads_per_process), - "-mca", - "btl_tcp_if_include", - "192.168.20.0/24", # TODO replace it according to the node - "-x", - "OMP_NUM_THREADS={}".format(self.num_threads_per_process), - "--report-bindings", - ] - mpi_cmd = " ".join(mpi_cmd) - - # Initial Task command - task_cmd = ["python"] - task_cmd.append(self.script_name) - task_cmd.append(self.sanitize_arguments(task.arguments)) - task_cmd = " ".join(task_cmd) - - # use optimized code by Neural Coder - if not task.optimized: - task_cmd = task_cmd.replace(".py", "_optimized.py") - - # build a bash script to run task. - bash_script_name = "distributed_run.sh" if task.workers > 1 else "run.sh" - bash_script = """{}\n{}\ncd {}\n{}""".format(conda_bash_cmd, conda_env_cmd, self.task_path, task_cmd) - bash_script_path = os.path.join(self.task_path, bash_script_name) - with open(bash_script_path, "w", encoding="utf-8") as f: - f.write(bash_script) - full_cmd = """cd {}\n{} bash {}""".format(self.task_path, mpi_cmd, bash_script_name) - - return full_cmd - - def report_result(self, task_id, log_path, task_runtime): - """Report the result to the result monitor.""" - s = socket.socket() - s.connect(("localhost", self.result_monitor_port)) - results = {"optimization time (seconds)": "{:.2f}".format(task_runtime)} - for line in reversed(open(log_path).readlines()): - res_pattern = r"Tune (\d+) result is:\s.*?\(int8\|fp32\):\s+(\d+\.\d+).*?\(int8\|fp32\):\s+(\d+\.\d+).*?" - res_matches = re.findall(res_pattern, line) - if res_matches: - # results["Tuning count"] = res_matches[0][0] - results["Accuracy"] = res_matches[0][1] - results["Duration (seconds)"] = res_matches[0][2] - # break when the last result is matched - break - - results = json.dumps(results) - - s.send(serialize({"task_id": task_id, "result": results, "q_model_path": self.q_model_path})) - s.close() - - @dump_elapsed_time("Task execution") - def launch_task(self, task: Task, resource): - """Generate the mpi command and execute the task. - - Redirect the log to ./TASK_LOG_PATH/task_/txt - """ - full_cmd = self._parse_cmd(task, resource) - logger.info(f"[TaskScheduler] Parsed the command from task: {full_cmd}") - log_path = get_task_log_path(log_path=get_task_log_workspace(self.config.workspace), task_id=task.task_id) - p = subprocess.Popen(full_cmd, stdout=open(log_path, "w+"), stderr=subprocess.STDOUT, shell=True) # nosec - logger.info(f"[TaskScheduler] Start run task {task.task_id}, dump log into {log_path}") - start_time = time.time() - p.wait() - self.cluster.free_resource(resource) - task_runtime = time.time() - start_time - logger.info( - f"[TaskScheduler] Finished task {task.task_id}, and free resource {resource}, dump log into {log_path}" - ) - task_status = self.check_task_status(log_path) - self.task_db.update_task_status(task.task_id, task_status) - self.q_model_path = get_q_model_path(log_path=log_path, task_id=task.task_id) if task_status == "done" else None - self.report_result(task.task_id, log_path, task_runtime) - - def dispatch_task(self, task, resource): - """Dispatch the task in a thread.""" - t = threading.Thread(target=self.launch_task, args=(task, resource)) - t.start() - - def schedule_tasks(self): - """After each 5 seconds, check the task queue and try to schedule a task.""" - while True: - time.sleep(5) - logger.info(f"[TaskScheduler {get_current_time()}] try to dispatch a task...") - if self.task_db.get_pending_task_num() > 0: - logger.info( - f"[TaskScheduler {get_current_time()}], " - + f"there are {self.task_db.get_pending_task_num()} task pending." - ) - task_id = self.task_db.task_queue[0] - task = self.task_db.get_task_by_id(task_id) - resource = self.cluster.reserve_resource(task) - if resource: - self.task_db.task_queue.popleft() - self.task_db.update_task_status(task.task_id, "running") - self.dispatch_task(task, resource) - else: - logger.info("[TaskScheduler] no enough node resources!") - else: - logger.info("[TaskScheduler] no requests in the deque!") - - def sanitize_arguments(self, arguments: str): - """Replace space encoding with space.""" - return arguments.replace("\xa0", " ") diff --git a/neural_solution/backend/task.py b/neural_solution/backend/task.py deleted file mode 100644 index 669f1e4a99b..00000000000 --- a/neural_solution/backend/task.py +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Neural Solution task.""" - - -class Task: - """A Task is an abstraction of a user tuning request that is handled in neural solution service. - - Attributes: - task_id: The task id - arguments: The task command - workers: The requested resource unit number - status: The status of the task: pending/running/done - result: The result of the task, which is only value-assigned when the task is done - """ - - def __init__( - self, - task_id, - arguments, - workers, - status, - script_url, - optimized, - approach, - requirement, - result="", - q_model_path="", - ): - """Init task. - - Args: - task_id (str): the id of task. - arguments (str): the running arguments for task. - workers (int): the resources. - status (str): "pending", "running", "done", "failed" - script_url (str): the python script address - optimized (bool): the running script has been optimized - approach (str): the quantization method - requirement (str): python packages - result (str, optional): the result of task. Defaults to "". - q_model_path (str, optional): the quantized model path. Defaults to "". - """ - self.task_id = task_id - self.arguments = arguments - self.workers = workers - self.status = status - self.script_url = script_url - self.optimized = optimized - self.approach = approach - self.requirement = requirement - self.result = result - self.q_model_path = q_model_path diff --git a/neural_solution/backend/task_db.py b/neural_solution/backend/task_db.py deleted file mode 100644 index 08636c12b8c..00000000000 --- a/neural_solution/backend/task_db.py +++ /dev/null @@ -1,106 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Neural Solution task database.""" -import sqlite3 -import threading -from collections import deque - -from neural_solution.backend.task import Task -from neural_solution.backend.utils.utility import create_dir - - -class TaskDB: - """TaskDb manages all the tasks. - - TaskDb provides atomic operations on managing the task queue and task details. - - Attributes: - task_queue: a FIFO queue that only holds pending task ids - task_collections: a growing-only list of all task objects and their details (no garbage collection currently) - lock: the lock on the data structures to provide atomic operations - """ - - def __init__(self, db_path): - """Init TaskDB. - - Args: - db_path (str): the database path. - """ - self.task_queue = deque() - create_dir(db_path) - # sqlite should set this check_same_thread to False - self.conn = sqlite3.connect(f"{db_path}", check_same_thread=False) - self.cursor = self.conn.cursor() - self.cursor.execute( - "create table if not exists task(id TEXT PRIMARY KEY, arguments varchar(100), " - + "workers int, status varchar(20), script_url varchar(500), optimized integer, " - + "approach varchar(20), requirements varchar(500), result varchar(500), q_model_path varchar(200))" - ) - self.conn.commit() - # self.task_collections = [] - self.lock = threading.Lock() - - def append_task(self, task): - """Append the task to the task queue.""" - with self.lock: - self.task_queue.append(task.task_id) - - def get_pending_task_num(self): - """Get the number of the pending tasks.""" - with self.lock: - return len(self.task_queue) - - def get_all_pending_tasks(self): - """Get all the pending task objects.""" - self.cursor.execute(r"select * from task where status=='pending'") - task_lst = self.cursor.fetchall() - res_lst = [] - for task_tuple in task_lst: - res_lst.append(Task(*task_tuple)) - return res_lst - - def update_task_status(self, task_id, status): - """Update the task status with the task id and the status.""" - if status not in ["pending", "running", "done", "failed"]: - raise Exception("status invalid, should be one of pending/running/done") - self.cursor.execute(r"update task set status='{}' where id=?".format(status), (task_id,)) - self.conn.commit() - - def update_result(self, task_id, result_str): - """Update the task result with the result string.""" - self.cursor.execute(r"update task set result='{}' where id={}".format(result_str, task_id)) - self.conn.commit() - - def update_q_model_path_and_result(self, task_id, q_model_path, result_str): - """Update the task result with the result string.""" - self.cursor.execute( - r"update task set q_model_path='{}', result='{}' where id=?".format(q_model_path, result_str), (task_id,) - ) - self.conn.commit() - - def lookup_task_status(self, task_id): - """Look up the current task status and result.""" - self.cursor.execute(r"select status, result from task where id=?", (task_id,)) - status, result = self.cursor.fetchone() - return {"status": status, "result": result} - - def get_task_by_id(self, task_id): - """Get the task object by task id.""" - self.cursor.execute(r"select * from task where id=?", (task_id,)) - attr_tuple = self.cursor.fetchone() - return Task(*attr_tuple) - - def remove_task(self, task_id): # currently no garbage collection - """Remove task.""" - pass diff --git a/neural_solution/backend/task_monitor.py b/neural_solution/backend/task_monitor.py deleted file mode 100644 index 02da9124369..00000000000 --- a/neural_solution/backend/task_monitor.py +++ /dev/null @@ -1,66 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Neural Solution task monitor.""" -import socket - -from neural_solution.backend.utils.utility import deserialize, serialize -from neural_solution.utils import logger - - -class TaskMonitor: - """TaskMonitor is a thread that monitors the coming tasks and appends them to the task queue. - - Attributes: - port: the port that the task monitor listens to - task_db: the TaskDb object that manages the tasks - """ - - def __init__(self, port, task_db): - """Init TaskMonitor.""" - self.s = socket.socket() - self.port = port - self.task_db = task_db - - def _start_listening(self, host, port, max_parallelism): - self.s.bind(("localhost", port)) # open a port as the serving port for tasks - self.s.listen(max_parallelism) - - def _receive_task(self): - c, addr = self.s.accept() - task = c.recv(4096) - task_dict = deserialize(task) - if "ping" in task_dict: - logger.info("[TaskMonitor] Client query status.") - c.send(b"ok") - return False - task_id = task_dict["task_id"] - - logger.info("[TaskMonitor] getting task: {}".format(task_id)) - return self.task_db.get_task_by_id(task_id) - # return Task(task_id=task["task_id"], arguments=task["arguments"], - # workers=task["workers"], status="pending", script_url=task['script_url']) - - def _append_task(self, task): - self.task_db.append_task(task) - logger.info("[TaskMonitor] append task {} done.".format(task.task_id)) - - def wait_new_task(self): - """Monitor the coming tasks and append it to the task db.""" - self._start_listening("localhost", self.port, 10) - while True: - logger.info("[TaskMonitor] waiting for new tasks...") - task = self._receive_task() - if not task: - continue - self._append_task(task) diff --git a/neural_solution/backend/utils/__init__.py b/neural_solution/backend/utils/__init__.py deleted file mode 100644 index 108ea605857..00000000000 --- a/neural_solution/backend/utils/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Neural Solution backend utils.""" diff --git a/neural_solution/backend/utils/utility.py b/neural_solution/backend/utils/utility.py deleted file mode 100644 index f097402dc91..00000000000 --- a/neural_solution/backend/utils/utility.py +++ /dev/null @@ -1,249 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Neural Solution backend utils.""" -import json -import os -from urllib.parse import urlparse - -from neural_solution.utils import logger - - -def serialize(request: dict) -> bytes: - """Serialize a dict object to bytes for inter-process communication.""" - return json.dumps(request).encode() - - -def deserialize(request: bytes) -> dict: - """Deserialize the received bytes to a dict object.""" - return json.loads(request) - - -def dump_elapsed_time(customized_msg=""): - """Get the elapsed time for decorated functions. - - Args: - customized_msg (string, optional): The parameter passed to decorator. Defaults to None. - """ - import time - - def f(func): - def fi(*args, **kwargs): - start = time.time() - res = func(*args, **kwargs) - end = time.time() - logger.info( - "%s elapsed time: %s ms" - % (customized_msg if customized_msg else func.__qualname__, round((end - start) * 1000, 2)) - ) - return res - - return fi - - return f - - -def get_task_log_path(log_path, task_id): - """Get the path of task log according id. - - Args: - log_path (str): the log path of task - task_id (str): the task id - - Returns: - str: the path of task log file - """ - if not os.path.exists(log_path): - os.makedirs(log_path) - log_file_path = "{}/task_{}.txt".format(log_path, task_id) - return log_file_path - - -def get_db_path(workspace="./"): - """Get the database path. - - Args: - workspace (str, optional): the workspace for Neural Solution. Defaults to "./". - - Returns: - str: the path of database - """ - return os.path.join(workspace, "db", "task.db") - - -def get_task_workspace(workspace="./"): - """Get the workspace of task. - - Args: - workspace (str, optional): the workspace for Neural Solution. Defaults to "./". - - Returns: - str: the workspace of task - """ - return os.path.join(workspace, "task_workspace") - - -def get_task_log_workspace(workspace="./"): - """Get the log workspace for task. - - Args: - workspace (str, optional): the workspace for Neural Solution. Defaults to "./". - - Returns: - str: the log workspace for task - """ - return os.path.join(workspace, "task_log") - - -def get_serve_log_workspace(workspace="./"): - """Get log workspace for service. - - Args: - workspace (str, optional): the workspace for Neural Solution. Defaults to "./". - - Returns: - str: log workspace for service - """ - return os.path.join(workspace, "serve_log") - - -def build_local_cluster(db_path): - """Build a local cluster. - - Args: - db_path (str): database path - - Returns: - (Cluster, int): cluster and num threads per process - """ - from neural_solution.backend.cluster import Cluster, Node - - hostname = "localhost" - node1 = Node(name=hostname, num_sockets=2, num_cores_per_socket=5) - node2 = Node(name=hostname, num_sockets=2, num_cores_per_socket=5) - node3 = Node(name=hostname, num_sockets=2, num_cores_per_socket=5) - - node_lst = [node1, node2, node3] - cluster = Cluster(node_lst=node_lst, db_path=db_path) - return cluster, 5 - - -def build_cluster(file_path, db_path): - """Build cluster according to the host file. - - Args: - file_path : the path of host file. - - Returns: - Cluster: return cluster object. - """ - from neural_solution.backend.cluster import Cluster, Node - - # If no file is specified, build a local cluster - if file_path == "None" or file_path is None: - return build_local_cluster(db_path) - - if not os.path.exists(file_path): - raise Exception(f"Please check the path of host file: {file_path}.") - - node_lst = [] - num_threads_per_process = 5 - with open(file_path, "r") as f: - for line in f: - hostname, num_sockets, num_cores_per_socket = line.strip().split(" ") - num_sockets, num_cores_per_socket = int(num_sockets), int(num_cores_per_socket) - node = Node(name=hostname, num_sockets=num_sockets, num_cores_per_socket=num_cores_per_socket) - node_lst.append(node) - num_threads_per_process = num_cores_per_socket - cluster = Cluster(node_lst=node_lst, db_path=db_path) - return cluster, num_threads_per_process - - -def get_current_time(): - """Get current time. - - Returns: - str: the current time in hours, minutes, and seconds. - """ - from datetime import datetime - - return datetime.now().strftime("%H:%M:%S") - - -def synchronized(func): - """Locking for synchronization. - - Args: - func (function): decorative function - """ - - def wrapper(self, *args, **kwargs): - with self.lock: - return func(self, *args, **kwargs) - - return wrapper - - -def build_workspace(path, task_id=""): - """Build workspace of running tasks. - - Args: - path: master work directory for all tasks. - task_id: the id of task - """ - task_path = "{}/{}".format(path, task_id) - if not os.path.exists(task_path): - os.makedirs(task_path) - return os.path.abspath(task_path) - - -def is_remote_url(url_or_filename): - """Check if input is a URL. - - Args: - url_or_filename (str): url_or_filename - - Returns: - bool: True or False - """ - parsed = urlparse(url_or_filename) - return parsed.scheme in ("http", "https") - - -def create_dir(path): - """Create the (nested) path if not exist.""" - if not os.path.exists(os.path.dirname(path)): - os.makedirs(os.path.dirname(path)) - - -def get_q_model_path(log_path, task_id): - """Get the quantized model path from task log. - - Args: - log_path (str): log path for task - task_id: the id of task - - Returns: - str: quantized model path - """ - import re - - for line in reversed(open(log_path).readlines()): - match = re.search(r"(Save quantized model to|Save config file and weights of quantized model to) (.+?)\.", line) - if match: - q_model_path = match.group(2) - match_task_id = re.search(r"(.+/task_workspace/{}/[^/]+)".format(task_id), q_model_path) - if match_task_id: - q_model_path = match_task_id.group() - return q_model_path - return "quantized model path not found" diff --git a/neural_solution/bin/__init__.py b/neural_solution/bin/__init__.py deleted file mode 100644 index 7f80f09b1f0..00000000000 --- a/neural_solution/bin/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Neural Solution.""" diff --git a/neural_solution/bin/neural_solution.py b/neural_solution/bin/neural_solution.py deleted file mode 100644 index a562313febe..00000000000 --- a/neural_solution/bin/neural_solution.py +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Neural Solution entry point.""" - - -def exec(): - """Execute Neural Solution launch.""" - from neural_solution.launcher import main - - main() - - -if __name__ == "__main__": - exec() diff --git a/neural_solution/config.py b/neural_solution/config.py deleted file mode 100644 index 8ab52da571f..00000000000 --- a/neural_solution/config.py +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Config for both frontend and backend.""" - -INTERVAL_TIME_BETWEEN_DISPATCH_TASK = 3 - - -class Config: - """Config for services.""" - - workspace: str = "./ns_workspace" - task_monitor_port: int = 2222 - result_monitor_port: int = 3333 - service_address: str = "localhost" - grpc_api_port: int = 4444 - # TODO add set and get methods for each attribute - - -config = Config() diff --git a/neural_solution/docs/source/README.md b/neural_solution/docs/source/README.md deleted file mode 100644 index cf5e2cc87f7..00000000000 --- a/neural_solution/docs/source/README.md +++ /dev/null @@ -1,170 +0,0 @@ -# Get started - -- [Get started](#get-started) - - [Install Neural Solution](#install-neural-solution) - - [Prerequisites](#prerequisites) - - [Method 1. Using pip](#method-1-using-pip) - - [Method 2. Building from source](#method-2-building-from-source) - - [Start service](#start-service) - - [Submit task](#submit-task) - - [Query task status](#query-task-status) - - [Stop service](#stop-service) - - [Inspect logs](#inspect-logs) - - [Manage resource](#manage-resource) - - [Node States](#node-states) - - [Query cluster](#query-cluster) - - [Add node](#add-node) - - [Remove node](#remove-node) - -## Install Neural Solution -### Prerequisites -- Install [Anaconda](https://docs.anaconda.com/free/anaconda/install/) -- Install [Open MPI](https://www.open-mpi.org/faq/?category=building#easy-build) -- Python 3.8 or later - -There are two ways to install the neural solution: -### Method 1. Using pip -``` -pip install neural-solution -``` -### Method 2. Building from source - -```shell -# get source code -git clone https://github.com/intel/neural-compressor -cd neural-compressor - -# install neural compressor -pip install -r requirements.txt -python setup.py install - -# install neural solution -pip install -r neural_solution/requirements.txt -python setup.py neural_solution install -``` - -## Start service - -```shell -# Start neural solution service with custom configuration -neural_solution start --task_monitor_port=22222 --result_monitor_port=33333 --restful_api_port=8001 - -# Help Manual -neural_solution -h -# Help output - -usage: neural_solution {start,stop} [-h] [--hostfile HOSTFILE] [--restful_api_port RESTFUL_API_PORT] [--grpc_api_port GRPC_API_PORT] - [--result_monitor_port RESULT_MONITOR_PORT] [--task_monitor_port TASK_MONITOR_PORT] [--api_type API_TYPE] - [--workspace WORKSPACE] [--conda_env CONDA_ENV] [--upload_path UPLOAD_PATH] - -Neural Solution - -positional arguments: - {start,stop} start/stop service - -optional arguments: - -h, --help show this help message and exit - --hostfile HOSTFILE start backend serve host file which contains all available nodes - --restful_api_port RESTFUL_API_PORT - start restful serve with {restful_api_port}, default 8000 - --grpc_api_port GRPC_API_PORT - start gRPC with {restful_api_port}, default 8000 - --result_monitor_port RESULT_MONITOR_PORT - start serve for result monitor at {result_monitor_port}, default 3333 - --task_monitor_port TASK_MONITOR_PORT - start serve for task monitor at {task_monitor_port}, default 2222 - --api_type API_TYPE start web serve with all/grpc/restful, default all - --workspace WORKSPACE - neural solution workspace, default "./ns_workspace" - --conda_env CONDA_ENV - specify the running environment for the task - --upload_path UPLOAD_PATH - specify the file path for the tasks - -``` - -## Submit task - -- For RESTful API: `[user@server hf_model]$ curl -H "Content-Type: application/json" --data @./task.json http://localhost:8000/task/submit/` -- For gRPC API: `python -m neural_solution.frontend.gRPC.client submit --request="test.json"` - -> For more details, please reference the [API description](./description_api.md) and [examples](../../examples/README.md). - -## Query task status - -Query the task status and result according to the `task_id`. - -- For RESTful API: `[user@server hf_model]$ curl -X GET http://localhost:8000/task/status/{task_id}` -- For gRPC API: `python -m neural_solution.frontend.gRPC.client query --task_id={task_id}` - -> For more details, please reference the [API description](./description_api.md) and [examples](../../examples/README.md). - -## Stop service - -```shell -# Stop neural solution service with default configuration -neural_solution stop -``` - -## Inspect logs - -The default logs locate in `./ns_workspace/`. Users can specify a custom workspace by using `neural_solution ---workspace=/path/to/custom/workspace`. - -There are several logs under workspace: - -```shell -(ns) [username@servers ns_workspace]$ tree -. -├── db -│ └── task.db # database to save the task-related information -├── serve_log # service running log -│ ├── backend.log # backend log -│ ├── frontend_grpc.log # grpc frontend log -│ └── frontend.log # HTTP/RESTful frontend log -├── task_log # overall log for each task -│ ├── task_bdf0bd1b2cc14bc19bce12d4f9b333c7.txt # task log -│ └── ... -└── task_workspace # the log for each task - ... - ├── bdf0bd1b2cc14bc19bce12d4f9b333c7 # task_id - ... - -``` - -## Manage resource -Neural Solution supports cluster management for service maintainers, providing several command-line tools for efficient resource management. - -### Node States - -Each node in the cluster can have three different states: - -- Alive: Represents a node that is functioning properly and available to handle requests. -- Join: Indicates that a node is in the process of being added to the cluster but has not fully joined yet. -- Remove: Indicates that a node is scheduled to be removed from the cluster. - -Below are some commonly used commands and their usage: - -### Query cluster -This command is used to query the current status of the cluster. No additional parameters are required, simply enter the following command: -```shell -neural_solution cluster --query -``` -### Add node -This command is used to add nodes to the cluster. You can either specify a host file or provide a list of nodes separated by ";". The node format consists of three parts: hostname, number_of_sockets, and cores_per_socket. Here's a breakdown of each part: - -- hostname: This refers to the name or IP address of the node that you want to add to the cluster. It identifies the specific machine or server that will be part of the cluster. - -- number_of_sockets: This indicates the number of physical CPU sockets available on the node. A socket is a physical component that houses one or more CPU cores. It represents a physical processor unit. - -- cores_per_socket: This specifies the number of CPU cores present in each socket. A core is an individual processing unit within a CPU. - -For example: -```shell -neural_solution cluster --join "host1 2 20; host2 4 20" -``` -### Remove node -This command is used to remove nodes from the cluster based on the IDs obtained from the query. The IDs can be passed as a parameter to the command. For example: -```shell -neural_solution cluster --remove -``` -Please note that the above commands are just examples and may require additional parameters or configurations based on your specific setup. diff --git a/neural_solution/docs/source/description_api.md b/neural_solution/docs/source/description_api.md deleted file mode 100644 index 7940a6c2768..00000000000 --- a/neural_solution/docs/source/description_api.md +++ /dev/null @@ -1,181 +0,0 @@ -# Neural Solution API - -Welcome to Neural Solution OaaS API documentation. This API documentation provides a detailed description of all the endpoints available in Neural Solution OaaS API. - -## Base URL - -The base URL for Neural Solution OaaS API is `{host_ip}:port` - -## Endpoints - -### GET / - -#### Description - -This is the welcome interface for Neural Solution OaaS. - -#### Usage -```bash -curl -X GET {host_ip}:port/description -``` - -#### Responses - -| Status Code | Description | -| ----------- | ------------------------------------------------- | -| 200 | Welcome to Neural Solution OaaS! | - - -### POST /task/submit - -#### Description - -Submit a new task to Neural Solution OaaS. - -#### Parameters - -Refer to [task_request_description.md](./template/task_request_description.md). - -#### Usage -```bash -curl -X POST -H "Content-Type: application/json" -d @task_request.json {host_ip}:port/task/submit -``` -#### Responses - -| Status Code | Description | Content | -| ----------- | -----------------------| ---------------------| -| 200 | Submitted successfully.| `status`: "Successfully.", `task_id`: Hashed key, `msg` : "Task submitted successfully"| -| 500 | Submitted failed. | `status`: "Failed." | - -### GET /task/status/{task_id} - -#### Description - -Get the status of a submitted task. - -#### Parameters - -- `task_id` - The hashed key of the submitted task. - -#### Usage -```bash -curl -X GET {host_ip}:port/task/status/{task_id} -``` - -#### Responses - -| Status Code | Description | Content | -| ----------- | ---------------- | ------------- | -| 200 | The status of task . | `status`: "running"/"done"/"pending"/"failed"
`tuning_info`: tuning information
`optimization_result`: optimization time, Accuracy, Duration, result_path| - -### GET /task/log/{task_id} - -#### Description - -Get the log of a submitted task. - -#### Usage -```bash -curl -X GET {host_ip}:port/task/log/{task_id} -``` - -#### Parameters - -- `task_id` - The hashed key of the submitted task. - -#### Responses - -| Status Code | Description | Content | -| ----------- | ----------- | ------------ | -| 200 | Task log. | Task log. | - -### WebSocket /task/screen/{task_id} - -#### Description - -Get real-time log of a submitted task. - -#### Parameters - -- `task_id` - The hashed key of the submitted task. - -#### Responses - -| Status Code | Description | Content | -| ----------- | ---------------------------------------- | ---------------------| -| 101 | Get real-time task log. | Real-time task log. | -| 1000 | Normal Closure. | Connection was closed successfully.| -| 404 | Task not found. | `status`: "Failed." | - -### GET /ping - -#### Description - -Check the health status of Neural Solution. - -#### Usage -```bash -curl -X GET {host_ip}:port/task/log/{task_id} -``` - -#### Responses - -| Status Code | Description | Content | -| ----------- | ------------ | -------------------------------------- | -| 200 | The health status. | `status`: "Healthy", `msg`: "Neural Solution is running." | -| 500 | Ping fail! & error message. | `status`: "Failed.", `msg`: Error message. | - - -### GET /cluster - -#### Description - -Get the running status of Neural Solution cluster. - -#### Usage -```bash -curl -X GET {host_ip}:port/cluster -``` - -#### Responses - -| Status Code | Description | Content | -| ----------- | ------------| ------------------------------------------ | -| 200 | Cluster information. | `msg`: "Cluster information." | - -### GET /download/{task_id} - -#### Description - -Download optimized result locally. - -#### Usage -```bash -curl -X GET {host_ip}:port/download/{task_id} --output quantized_model.zip -``` - -#### Responses - -| Status Code | Description | Content | -| ----------- | ----------- | ---------------- | -| 200 | Download optimized model. | zip file | -| 400 | No quantized model when task failed. | `msg`: "Please check URL." | -| 404 | Download optimized model. | `msg`: "Task failed, file not found" | - - -### GET /description - -#### Description - -Get user-facing API. - -#### Usage -```bash -curl -X GET {host_ip}:port/description -``` - -#### Responses - -| Status Code | Description | Content | -| ----------- | ----------- | ---------------- | -| 200 | User-facing API. | `msg`: The user-facing API. | diff --git a/neural_solution/docs/source/imgs/NS-OaaS-Intro.png b/neural_solution/docs/source/imgs/NS-OaaS-Intro.png deleted file mode 100644 index 42845031702..00000000000 Binary files a/neural_solution/docs/source/imgs/NS-OaaS-Intro.png and /dev/null differ diff --git a/neural_solution/docs/source/ns_design_doc.md b/neural_solution/docs/source/ns_design_doc.md deleted file mode 100644 index 3a3872b7b48..00000000000 --- a/neural_solution/docs/source/ns_design_doc.md +++ /dev/null @@ -1,123 +0,0 @@ -## Design Doc for Optimization as a Service [WIP] - - - -### Contents - -- [Design Doc for Optimization as a Service \[WIP\]](#design-doc-for-optimization-as-a-service-wip) - - [Contents](#contents) - - [Overview](#overview) - - [Workflow of OaaS](#workflow-of-oaas) - - [Class definition diagram](#class-definition-diagram) - - [Extensibility](#extensibility) - -### Overview - -Optimization as a service(OaaS) is a platform that enables users to submit quantization tasks for their models and automatically dispatches these tasks to one or multiple nodes for accuracy-aware tuning. OaaS is designed to parallelize the tuning process in two levels: tuning and model. At the tuning level, OaaS execute the tuning process across multiple nodes for one model. At the model level, OaaS allocate free nodes to incoming requests automatically. - - -### Workflow of OaaS - -```mermaid -sequenceDiagram - participant Studio - participant TaskMonitor - participant Scheduler - participant Cluster - participant TaskLauncher - participant ResultMonitor - Par receive task - Studio ->> TaskMonitor: P1-1. Post quantization Request - TaskMonitor ->> TaskMonitor: P1-2. Add task to task DB - TaskMonitor ->> Studio: P1-3. Task received notification - and Schedule task - loop - Scheduler ->> Scheduler: P2-1. Pop task from task DB - Scheduler ->> Cluster: P2-2. Apply for resources - Note over Scheduler, Cluster: the number of Nodes - Cluster ->> Cluster: P2-3. Check the status of nodes in cluster - Cluster ->> Scheduler: P2-4. Resources info - Note over Scheduler, Cluster: host:socket list - Scheduler ->> TaskLauncher: P2-5. Dispatch task - end - and Run task - TaskLauncher ->> TaskLauncher: P3-1. Run task - Note over TaskLauncher, TaskLauncher: mpirun -np 4 -hostfile hostfile python main.py - TaskLauncher ->> TaskLauncher: P3-2. Wait task to finish... - TaskLauncher ->> Cluster: P3-3. Free resource - TaskLauncher ->> ResultMonitor: P3-4. Report the Acc and Perf - ResultMonitor ->> Studio: P3-5. Post result to Studio - and Query task status - Studio ->> ResultMonitor: P4-1. Query the status of the submitted task - ResultMonitor ->> Studio: P4-2. Post the status of queried task - End - -``` - -The optimization process is divided into four parts, each executed in separate threads. - -- Part 1. Posting new quantization task. (P1-1 -> P1-2 -> P1-3) - -- Part 2. Resource allocation and scheduling. (P2-1 -> P2-2 -> P2-3 -> P2-4 -> P2-5) - -- Part 3. Task execution and reporting. (P3-1 -> P3-2 -> P3-3 -> P3-4 -> P3-5) - -- Part 4. Updating the status. (P4-1 -> P4-2) - -### Class definition diagram - - - -```mermaid -classDiagram - - - -TaskDB "1" --> "*" Task -TaskMonitor --> TaskDB -ResultMonitor --> TaskDB -Scheduler --> TaskDB -Scheduler --> Cluster - - -class Task{ - + status - + get_status() - + update_status() -} - -class TaskDB{ - - task_collections - + append_task() - + get_all_pending_tasks() - + update_task_status() -} -class TaskMonitor{ - - task_db - + wait_new_task() -} -class Scheduler{ - - task_db - - cluster - + schedule_tasks() - + dispatch_task() - + launch_task() -} - -class ResultMonitor{ - - task_db - + query_task_status() -} -class Cluster{ - - node_list - + free() - + reserve_resource() - + get_node_status() -} - -``` - - -### Extensibility - -- The service can be deployed on various resource pool, including a set of worker nodes, such as a local cluster or cloud cluster (AWS and GCP). diff --git a/neural_solution/docs/source/template/task_request_description.md b/neural_solution/docs/source/template/task_request_description.md deleted file mode 100644 index 137c66129b3..00000000000 --- a/neural_solution/docs/source/template/task_request_description.md +++ /dev/null @@ -1,25 +0,0 @@ -### Task request description - -- `script_url` (str): The URL to download the model archive. -- `optimized` (bool): If `True`, the model script has already be optimized by `Neural Coder`. -- `arguments` (List[Union[int, str]], optional): Arguments that are needed for running the model. -- `approach` (str, optional): The optimization approach supported by `Neural Coder`. -- `requirements` (List[str], optional): The environment requirements. -- `priority`(int, optional): The importance of the task, the optional value is `1`, `2`, and `3`, `1` is the highest priority. - - -An example: - -```json -{ - "script_url": "https://github.com/huggingface/transformers/blob/v4.21-release/examples/pytorch/text-classification/run_glue.py", - "optimized": "False", - "arguments": [ - "--model_name_or_path bert-base-cased --task_name mrpc --do_eval --output_dir result" - ], - "approach": "static", - "requirements": [ - ], - "priority": 1 -} -``` diff --git a/neural_solution/examples/README.md b/neural_solution/examples/README.md deleted file mode 100644 index 85fe48fd54f..00000000000 --- a/neural_solution/examples/README.md +++ /dev/null @@ -1,27 +0,0 @@ -### Examples List - - - - - - - - - - - - - - - - - - - - - - - - - -
ModelDescriptionExample
custom modelquantize a custom modeltf_example1
huggingface modelquantize a huggingface model by specifying a URLhf_models
huggingface modelquantize a huggingface model by specifying a URL with gRPC APIhf_models_grpc
diff --git a/neural_solution/examples/custom_models_optimized/tf_example1/README.md b/neural_solution/examples/custom_models_optimized/tf_example1/README.md deleted file mode 100644 index 19aa66c9f7d..00000000000 --- a/neural_solution/examples/custom_models_optimized/tf_example1/README.md +++ /dev/null @@ -1,178 +0,0 @@ - -## An end-to-end example: quantize a custom model with Neural Solution - -In this example, we show how to quantize a [custom model](https://github.com/intel/neural-compressor/tree/master/examples/helloworld/tf_example1) with Neural Solution. - -### Objective -- Demonstrate how to prepare requirements. -- Demonstrate how to start the Neural Solution Service. -- Demonstrate how to prepare an optimization task request and submit it to Neural Solution Service. -- Demonstrate how to query the status of the task and fetch the optimization result. -- Demonstrate how to query and manage the resource of the cluster. - -### Requirements -Customizing the model requires preparing the following folders and files. -1. dataset/, place dataset -2. model/, place model weight and configuration files -3. run.py, the running python script - -The folder structure is as follows: -```shell -├── dataset -│ └── train-00173-of-01024 -├── model -│ └── mobilenet_v1_1.0_224_frozen.pb -├── README.md -├── task_request_distributed.json -├── task_request.json -└── test.py -``` - -### Start the Neural Solution Service - -```shell -# Activate your environment -conda activate ENV - -# Start neural solution service with default configuration, log will be saved in the "serve_log" folder. -neural_solution start - -# Start neural solution service with custom configuration -neural_solution start --task_monitor_port=22222 --result_monitor_port=33333 --restful_api_port=8001 - -# Stop neural solution service with default configuration -neural_solution stop - -# Help Manual -neural_solution -h -# Help output - -usage: neural_solution {start,stop} [-h] [--hostfile HOSTFILE] [--restful_api_port RESTFUL_API_PORT] [--grpc_api_port GRPC_API_PORT] - [--result_monitor_port RESULT_MONITOR_PORT] [--task_monitor_port TASK_MONITOR_PORT] [--api_type API_TYPE] - [--workspace WORKSPACE] [--conda_env CONDA_ENV] [--upload_path UPLOAD_PATH] [--query] [--join JOIN] [--remove REMOVE] - -Neural Solution - -positional arguments: - {start,stop,cluster} start/stop/management service - -optional arguments: - -h, --help show this help message and exit - --hostfile HOSTFILE start backend serve host file which contains all available nodes - --restful_api_port RESTFUL_API_PORT - start restful serve with {restful_api_port}, default 8000 - --grpc_api_port GRPC_API_PORT - start gRPC with {restful_api_port}, default 8000 - --result_monitor_port RESULT_MONITOR_PORT - start serve for result monitor at {result_monitor_port}, default 3333 - --task_monitor_port TASK_MONITOR_PORT - start serve for task monitor at {task_monitor_port}, default 2222 - --api_type API_TYPE start web serve with all/grpc/restful, default all - --workspace WORKSPACE - neural solution workspace, default "./ns_workspace" - --conda_env CONDA_ENV - specify the running environment for the task - --upload_path UPLOAD_PATH - specify the file path for the tasks - --query [cluster parameter] query cluster information - --join JOIN [cluster parameter] add new node into cluster - --remove REMOVE [cluster parameter] remove from cluster -``` - - -### Submit optimization task - -- Step 1: Prepare the json file includes request content. In this example, we have created request that quantize a [custom model](https://github.com/intel/neural-compressor/tree/master/examples/helloworld/tf_example1). - -```shell -[user@server tf_example1]$ cd path/to/neural_solution/neural_solution/examples/custom_models_optimized/tf_example1 -[user@server tf_example1]$ cat task_request.json -{ - "script_url": "tf_example1", - "optimized": "True", - "arguments": [ - "--dataset_location=dataset", "--model_path=model" - ], - "approach": "static", - "requirements": [ - ], - "workers": 1 -} -``` -When using distributed quantization, the `workers` needs to be set to greater than 1 when submitting a request. -```shell -[user@server tf_example1]$ cat task_request_distributed.json -{ - "script_url": "tf_example1", - "optimized": "True", - "arguments": [ - "--dataset_location=dataset", "--model_path=model" - ], - "approach": "static", - "requirements": [ - ], - "workers": 3 -} -``` - - -- Step 2: Submit the task request to service, and it will return the submit status and task id for future use. - -```shell -[user@server tf_example1]$ curl -H "Content-Type: application/json" --data @./task.json http://localhost:8000/task/submit/ - -# response if submit successfully -{ - "status": "successfully", - "task_id": "7602cd63d4c849e7a686a8165a77f69d", - "msg": "Task submitted successfully" -} -``` - - - -### Query optimization result - -- Query the task status and result according to the `task_id`. - -``` shell -[user@server tf_example1]$ curl -X GET http://localhost:8000/task/status/{task_id} -# return the task status -{ - "status": "done", - "tuning_info": {}, - "optimization_result": { - "optimization time (seconds)": "151.16", - "Accuracy": "0.8617", - "Duration (seconds)": "17.8213", - "result_path": "http://localhost:8000/download/7602cd63d4c849e7a686a8165a77f69d" - } -} - -``` -### Download optimized model - -- Download the optimized model according to the `task_id`. - -``` shell -[user@server tf_example1]$ curl -X GET http://localhost:8000/download/{task_id} --output quantized_model.zip -# download quantized_model.zip -``` - -### Manage resource -```shell -# query cluster information -neural_solution cluster --query - -# add new node into cluster -# parameter: " ; " -neural_solution cluster --join "host1 2 20; host2 5 20" - -# remove node from cluster according to id -neural_solution cluster --remove -``` - -### Stop the service -```shell -neural_solution stop -``` diff --git a/neural_solution/examples/custom_models_optimized/tf_example1/dataset/.gitkeep b/neural_solution/examples/custom_models_optimized/tf_example1/dataset/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/neural_solution/examples/custom_models_optimized/tf_example1/model/.gitkeep b/neural_solution/examples/custom_models_optimized/tf_example1/model/.gitkeep deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/neural_solution/examples/custom_models_optimized/tf_example1/task_request.json b/neural_solution/examples/custom_models_optimized/tf_example1/task_request.json deleted file mode 100644 index 7cce23ec4d4..00000000000 --- a/neural_solution/examples/custom_models_optimized/tf_example1/task_request.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "script_url": "custom_models_optimized/tf_example1", - "optimized": "True", - "arguments": [ - "--dataset_location=dataset", "--model_path=model" - ], - "approach": "static", - "requirements": ["tensorflow" - ], - "workers": 1 -} diff --git a/neural_solution/examples/custom_models_optimized/tf_example1/task_request_distributed.json b/neural_solution/examples/custom_models_optimized/tf_example1/task_request_distributed.json deleted file mode 100644 index d2d42585171..00000000000 --- a/neural_solution/examples/custom_models_optimized/tf_example1/task_request_distributed.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "script_url": "custom_models_optimized/tf_example1", - "optimized": "True", - "arguments": [ - "--dataset_location=dataset", "--model_path=model" - ], - "approach": "static", - "requirements": ["tensorflow" - ], - "workers": 3 -} diff --git a/neural_solution/examples/custom_models_optimized/tf_example1/test.py b/neural_solution/examples/custom_models_optimized/tf_example1/test.py deleted file mode 100644 index 2c5ccfd537c..00000000000 --- a/neural_solution/examples/custom_models_optimized/tf_example1/test.py +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Running script.""" -import tensorflow as tf - -from neural_compressor import Metric -from neural_compressor.config import PostTrainingQuantConfig, TuningCriterion -from neural_compressor.data import BilinearImagenetTransform, ComposeTransform, DefaultDataLoader, TensorflowImageRecord -from neural_compressor.quantization import fit - -flags = tf.compat.v1.flags -FLAGS = flags.FLAGS - -flags.DEFINE_string("dataset_location", None, "location of calibration dataset and evaluate dataset") - -flags.DEFINE_string("model_path", None, "location of model") - -calib_dataset = TensorflowImageRecord( - root=FLAGS.dataset_location, - transform=ComposeTransform(transform_list=[BilinearImagenetTransform(height=224, width=224)]), -) -calib_dataloader = DefaultDataLoader(dataset=calib_dataset, batch_size=10) - -eval_dataset = TensorflowImageRecord( - root=FLAGS.dataset_location, - transform=ComposeTransform(transform_list=[BilinearImagenetTransform(height=224, width=224)]), -) -eval_dataloader = DefaultDataLoader(dataset=eval_dataset, batch_size=1) - - -def main(): - """Implement running function.""" - top1 = Metric(name="topk", k=1) - tuning_criterion = TuningCriterion(strategy="basic") - config = PostTrainingQuantConfig(calibration_sampling_size=[20], quant_level=1, tuning_criterion=tuning_criterion) - model_path = FLAGS.model_path + "/mobilenet_v1_1.0_224_frozen.pb" - q_model = fit( - model=model_path, - conf=config, - calib_dataloader=calib_dataloader, - eval_dataloader=eval_dataloader, - eval_metric=top1, - ) - q_model.save("./q_model_path/q_model") - - -if __name__ == "__main__": - main() diff --git a/neural_solution/examples/hf_models/README.md b/neural_solution/examples/hf_models/README.md deleted file mode 100644 index 4b72b5d88c7..00000000000 --- a/neural_solution/examples/hf_models/README.md +++ /dev/null @@ -1,142 +0,0 @@ -## An end-to-end example: quantize a Hugging Face model with Neural Solution - -In this example, we show how to quantize a Hugging Face model with Neural Solution. - -### Objective -- Demonstrate how to start the Neural Solution Service. -- Demonstrate how to prepare an optimization task request and submit it to Neural Solution Service. -- Demonstrate how to query the status of the task and fetch the optimization result. -- Demonstrate how to query and manage the resource of the cluster. - - -### Start the Neural Solution Service - -```shell -# Activate your environment -conda activate ENV - -# Start neural solution service with default configuration, log will be saved in the "serve_log" folder. -neural_solution start - -# Start neural solution service with custom configuration -neural_solution start --task_monitor_port=22222 --result_monitor_port=33333 --restful_api_port=8001 - -# Stop neural solution service with default configuration -neural_solution stop - -# Help Manual -neural_solution -h -# Help output - -usage: neural_solution {start,stop,cluster} [-h] [--hostfile HOSTFILE] [--restful_api_port RESTFUL_API_PORT] [--grpc_api_port GRPC_API_PORT] - [--result_monitor_port RESULT_MONITOR_PORT] [--task_monitor_port TASK_MONITOR_PORT] [--api_type API_TYPE] - [--workspace WORKSPACE] [--conda_env CONDA_ENV] [--upload_path UPLOAD_PATH] [--query] [--join JOIN] [--remove REMOVE] - -Neural Solution - -positional arguments: - {start,stop,cluster} start/stop/management service - -optional arguments: - -h, --help show this help message and exit - --hostfile HOSTFILE start backend serve host file which contains all available nodes - --restful_api_port RESTFUL_API_PORT - start restful serve with {restful_api_port}, default 8000 - --grpc_api_port GRPC_API_PORT - start gRPC with {restful_api_port}, default 8000 - --result_monitor_port RESULT_MONITOR_PORT - start serve for result monitor at {result_monitor_port}, default 3333 - --task_monitor_port TASK_MONITOR_PORT - start serve for task monitor at {task_monitor_port}, default 2222 - --api_type API_TYPE start web serve with all/grpc/restful, default all - --workspace WORKSPACE - neural solution workspace, default "./ns_workspace" - --conda_env CONDA_ENV - specify the running environment for the task - --upload_path UPLOAD_PATH - specify the file path for the tasks - --query [cluster parameter] query cluster information - --join JOIN [cluster parameter] add new node into cluster - --remove REMOVE [cluster parameter] remove from cluster -``` - - -### Submit optimization task - -- Step 1: Prepare the json file includes request content. In this example, we have created request that quantize a [Text classification model](https://github.com/huggingface/transformers/tree/v4.21-release/examples/pytorch/text-classification) from Hugging Face. - -```shell -[user@server hf_model]$ cd path/to/neural_solution/examples/hf_model -[user@server hf_model]$ cat task_request.json -{ - "script_url": "https://github.com/huggingface/transformers/blob/v4.21-release/examples/pytorch/text-classification/run_glue.py", - "optimized": "False", - "arguments": [ - "--model_name_or_path=bert-base-cased", "--task_name=mrpc", "--do_eval", "--output_dir=result" - ], - "approach": "static", - "requirements": [], - "workers": 1 -} -``` - - -- Step 2: Submit the task request to service, and it will return the submit status and task id for future use. - -```shell -[user@server hf_model]$ curl -H "Content-Type: application/json" --data @./task.json http://localhost:8000/task/submit/ - -# response if submit successfully -{ - "status": "successfully", - "task_id": "cdf419910f9b4d2a8320d0e420ac1d0a", - "msg": "Task submitted successfully" -} -``` - - - -### Query optimization result - -- Query the task status and result according to the `task_id`. - -``` shell -[user@server hf_model]$ curl -X GET http://localhost:8000/task/status/{task_id} - -# return the task status -{ - "status": "done", - "optimized_result": { - "optimization time (seconds)": "58.15", - "accuracy": "0.3162", - "duration (seconds)": "4.6488" - }, - "result_path": "http://localhost:8000/download/7602cd63d4c849e7a686a8165a77f69d" - } -} -``` -### Download optimized model - -- Download the optimized model according to the `task_id`. - -``` shell -[user@server tf_example1]$ curl -X GET http://localhost:8000/download/{task_id} --output quantized_model.zip -# download quantized_model.zip -``` -### Manage resource -```shell -# query cluster information -neural_solution cluster --query - -# add new node into cluster -# parameter: " ; " -neural_solution cluster --join "host1 2 20; host2 5 20" - -# remove node from cluster according to id -neural_solution cluster --remove - -``` -### Stop the service -```shell -neural_solution stop -``` diff --git a/neural_solution/examples/hf_models/task_request.json b/neural_solution/examples/hf_models/task_request.json deleted file mode 100644 index 0566be32f3d..00000000000 --- a/neural_solution/examples/hf_models/task_request.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "script_url": "https://github.com/huggingface/transformers/blob/v4.21-release/examples/pytorch/text-classification/run_glue.py", - "optimized": "False", - "arguments": [ - "--model_name_or_path=bert-base-cased", "--task_name=mrpc", "--do_eval", "--output_dir=result" - ], - "approach": "static", - "requirements": ["datasets", "transformers=4.21.0", "torch"], - "workers": 1 -} diff --git a/neural_solution/examples/hf_models_grpc/README.md b/neural_solution/examples/hf_models_grpc/README.md deleted file mode 100644 index 4712c1b6aeb..00000000000 --- a/neural_solution/examples/hf_models_grpc/README.md +++ /dev/null @@ -1,107 +0,0 @@ -## An end-to-end example: quantize a Hugging Face model with Neural Solution gRPC API - -In this example, we show how to quantize a Hugging Face model with Neural Solution gRPC API. - -### Objective -- Demonstrate how to start the Neural Solution Service. -- Demonstrate how to prepare an optimization task request and submit it to Neural Solution Service. -- Demonstrate how to query the status of the task and fetch the optimization result. - - -### Start the Neural Solution Service - -```shell -# Activate your environment -conda activate ENV - -# Start neural solution service with default configuration, log will be saved in the "serve_log" folder. -neural_solution start - -# Start neural solution service with custom configuration -neural_solution start --task_monitor_port=22222 --result_monitor_port=33333 --grpc_api_port=8001 --api_type=grpc - -# Stop neural solution service with default configuration -neural_solution stop - -# Help Manual -neural_solution -h -# Help output - -usage: neural_solution {start,stop} [-h] [--hostfile HOSTFILE] [--restful_api_port RESTFUL_API_PORT] [--grpc_api_port GRPC_API_PORT] - [--result_monitor_port RESULT_MONITOR_PORT] [--task_monitor_port TASK_MONITOR_PORT] [--api_type API_TYPE] - [--workspace WORKSPACE] [--conda_env CONDA_ENV] [--upload_path UPLOAD_PATH] - -Neural Solution - -positional arguments: - {start,stop} start/stop service - -optional arguments: - -h, --help show this help message and exit - --hostfile HOSTFILE start backend serve host file which contains all available nodes - --restful_api_port RESTFUL_API_PORT - start restful serve with {restful_api_port}, default 8000 - --grpc_api_port GRPC_API_PORT - start gRPC with {restful_api_port}, default 8000 - --result_monitor_port RESULT_MONITOR_PORT - start serve for result monitor at {result_monitor_port}, default 3333 - --task_monitor_port TASK_MONITOR_PORT - start serve for task monitor at {task_monitor_port}, default 2222 - --api_type API_TYPE start web serve with all/grpc/restful, default all - --workspace WORKSPACE - neural solution workspace, default "./ns_workspace" - --conda_env CONDA_ENV - specify the running environment for the task - --upload_path UPLOAD_PATH - specify the file path for the tasks -``` - - -### Submit optimization task - -- Step 1: Prepare the json file includes request content. In this example, we have created request that quantize a [Text classification model](https://github.com/huggingface/transformers/tree/v4.21-release/examples/pytorch/text-classification) from Hugging Face. - -```shell -[user@server hf_models_grpc]$ cd path/to/neural_solution/examples/hf_models_grpc -[user@server hf_models_grpc]$ cat task_request.json -{ - "script_url": "https://github.com/huggingface/transformers/blob/v4.21-release/examples/pytorch/text-classification/run_glue.py", - "optimized": "False", - "arguments": [ - "--model_name_or_path=bert-base-cased", "--task_name=mrpc", "--do_eval", "--output_dir=result" - ], - "approach": "static", - "requirements": [], - "workers": 1 -} -``` - - -- Step 2: Submit the task request to service, and it will return the submit status and task id for future use. - -```shell -[user@server hf_models_grpc]$ cd path/to/neural-compressor/neural_solution/frontend/gRPC -[user@server hf_models_grpc]$ python client.py submit --request="../../examples/hf_models/task_request.json" - -# response if submit successfully -2023-06-20 14:34:55 [INFO] Neural Solution is running. -2023-06-20 14:34:55 [INFO] successfully -2023-06-20 14:34:55 [INFO] d3e10a49326449fb9d0d62f2bfc1cb43 -2023-06-20 14:34:55 [INFO] Task submitted successfully -``` - - - -### Query optimization result - -- Query the task status and result according to the `task_id`. - -``` shell -[user@server hf_models_grpc]$ python client.py --task_monitor_port=22222 --result_monitor_port=33333 --grpc_api_port=8001 query --task_id="d3e10a49326449fb9d0d62f2bfc1cb43" - - -``` -### Stop the service -```shell -neural_solution stop -``` diff --git a/neural_solution/examples/hf_models_grpc/task_request.json b/neural_solution/examples/hf_models_grpc/task_request.json deleted file mode 100644 index 0566be32f3d..00000000000 --- a/neural_solution/examples/hf_models_grpc/task_request.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "script_url": "https://github.com/huggingface/transformers/blob/v4.21-release/examples/pytorch/text-classification/run_glue.py", - "optimized": "False", - "arguments": [ - "--model_name_or_path=bert-base-cased", "--task_name=mrpc", "--do_eval", "--output_dir=result" - ], - "approach": "static", - "requirements": ["datasets", "transformers=4.21.0", "torch"], - "workers": 1 -} diff --git a/neural_solution/frontend/README.md b/neural_solution/frontend/README.md deleted file mode 100644 index bc69917a642..00000000000 --- a/neural_solution/frontend/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Client - -- [x] fastapi -- [x] gRPC diff --git a/neural_solution/frontend/__init__.py b/neural_solution/frontend/__init__.py deleted file mode 100644 index 728fe75076e..00000000000 --- a/neural_solution/frontend/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Neural Solution frontend.""" diff --git a/neural_solution/frontend/fastapi/__init__.py b/neural_solution/frontend/fastapi/__init__.py deleted file mode 100644 index c18be1eab5e..00000000000 --- a/neural_solution/frontend/fastapi/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""FastAPI frontend.""" diff --git a/neural_solution/frontend/fastapi/main_server.py b/neural_solution/frontend/fastapi/main_server.py deleted file mode 100644 index dbd46e85fa0..00000000000 --- a/neural_solution/frontend/fastapi/main_server.py +++ /dev/null @@ -1,501 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Fast api server.""" -import asyncio -import json -import os -import socket -import sqlite3 -import uuid -import zipfile - -import uvicorn -from fastapi import FastAPI, HTTPException, Request, WebSocket, WebSocketDisconnect -from fastapi.responses import FileResponse, HTMLResponse, StreamingResponse -from starlette.background import BackgroundTask -from watchdog.events import FileSystemEventHandler -from watchdog.observers import Observer - -from neural_solution.config import config -from neural_solution.frontend.task_submitter import Task, task_submitter -from neural_solution.frontend.utility import ( - check_log_exists, - deserialize, - get_baseline_during_tuning, - get_cluster_info, - get_cluster_table, - get_res_during_tuning, - is_valid_task, - is_valid_uuid, - list_to_string, - serialize, -) -from neural_solution.utils.utility import get_db_path, get_task_log_workspace, get_task_workspace - -# Get config from Launcher.sh -task_monitor_port = None -result_monitor_port = None -db_path = None - -app = FastAPI() - - -import argparse - -args = None - - -def parse_arguments(): - """Parse the command line options.""" - parser = argparse.ArgumentParser(description="Frontend with RESTful API") - parser.add_argument("-H", "--host", type=str, default="0.0.0.0", help="The address to submit task.") - parser.add_argument("-FP", "--fastapi_port", type=int, default=8000, help="Port to submit task by user.") - parser.add_argument("-TMP", "--task_monitor_port", type=int, default=2222, help="Port to monitor task.") - parser.add_argument("-RMP", "--result_monitor_port", type=int, default=3333, help="Port to monitor result.") - parser.add_argument("-WS", "--workspace", type=str, default="./", help="Work space.") - args = parser.parse_args() - return args - - -@app.get("/") -def read_root(): - """Root route.""" - return {"message": "Welcome to Neural Solution!"} - - -@app.get("/ping") -def ping(): - """Test status of services. - - Returns: - json: the status of services and message - """ - count = 0 - msg = "Neural Solution is running." - for port in [config.task_monitor_port, config.result_monitor_port]: - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - try: - sock.connect((config.service_address, port)) - sock.send(serialize({"ping": "test"})) - sock.settimeout(5) - response = sock.recv(1024) - if response == b"ok": - count += 1 - sock.close() - continue - except ConnectionRefusedError: - msg = "Ping fail! Make sure Neural Solution runner is running!" - break - except Exception as e: - print(e) - msg = "Ping fail!" - break - sock.close() - return {"status": "Healthy", "msg": msg} if count == 2 else {"status": "Failed", "msg": msg} - - -@app.get("/cluster") -def get_cluster(): - """Get the cluster info. - - Returns: - json: the cluster info. - """ - db_path = get_db_path(config.workspace) - return get_cluster_info(db_path=db_path) - - -@app.get("/clusters") -def get_clusters(): - """Get the cluster info. - - Returns: - HTMLResponse: html table of the cluster info - """ - db_path = get_db_path(config.workspace) - return HTMLResponse(content=get_cluster_table(db_path=db_path)) - - -@app.get("/description") -async def get_description(): - """Get user oriented API descriptions. - - Returns: - json: API descriptions - """ - current_dir = os.path.dirname(os.path.abspath(__file__)) - with open(os.path.join(current_dir, "..", "user_facing_api.json")) as f: - data = json.load(f) - return data - - -@app.post("/task/submit/") -async def submit_task(task: Task): - """Submit task. - - Args: - task (Task): _description_ - Fields: - task_id: The task id - arguments: The task command - workers: The requested resource unit number - status: The status of the task: pending/running/done - result: The result of the task, which is only value-assigned when the task is done - - Returns: - json: status , id of task and messages. - """ - if not is_valid_task(task.dict()): - raise HTTPException(status_code=422, detail="Invalid task") - - msg = "Task submitted successfully" - status = "successfully" - # search the current - db_path = get_db_path(config.workspace) - - if os.path.isfile(db_path): - conn = sqlite3.connect(db_path) - cursor = conn.cursor() - task_id = str(uuid.uuid4()).replace("-", "") - sql = ( - "INSERT INTO task " - "(id, script_url, optimized, arguments, approach, requirements, workers, status) " - "VALUES (?, ?, ?, ?, ?, ?, ?, 'pending')" - ) - - task_params = ( - task_id, - task.script_url, - task.optimized, - list_to_string(task.arguments), - task.approach, - list_to_string(task.requirements), - task.workers, - ) - - conn.execute(sql, task_params) - conn.commit() - try: - task_submitter.submit_task(task_id) - except ConnectionRefusedError: - msg = "Task Submitted fail! Make sure Neural Solution runner is running!" - status = "failed" - except Exception as e: - msg = "Task Submitted fail!" - print(e) - status = "failed" - conn.close() - else: - msg = "Task Submitted fail! db not found!" - return {"msg": msg} # TODO to align with return message when submit task successfully - return {"status": status, "task_id": task_id, "msg": msg} - - -@app.get("/task/{task_id}") -def get_task_by_id(task_id: str): - """Get task status, result, quantized model path according to id. - - Args: - task_id (str): the id of task. - - Returns: - json: task status, result, quantized model path - """ - if not is_valid_uuid(task_id): - raise HTTPException(status_code=422, detail="Invalid task id") - res = None - db_path = get_db_path(config.workspace) - if os.path.isfile(db_path): - conn = sqlite3.connect(db_path) - cursor = conn.cursor() - cursor.execute(r"select status, result, q_model_path from task where id=?", (task_id,)) - res = cursor.fetchone() - cursor.close() - conn.close() - return {"status": res[0], "optimized_result": deserialize(res[1]) if res[1] else res[1], "result_path": res[2]} - - -@app.get("/task/") -def get_all_tasks(): - """Get task table. - - Returns: - json: task table - """ - res = None - db_path = get_db_path(config.workspace) - if os.path.isfile(db_path): - conn = sqlite3.connect(db_path) - cursor = conn.cursor() - cursor.execute(r"select * from task") - res = cursor.fetchall() - cursor.close() - conn.close() - return {"message": res} - - -@app.get("/task/status/{task_id}") -def get_task_status_by_id(request: Request, task_id: str): - """Get task status and information according to id. - - Args: - task_id (str): the id of task. - - Returns: - json: task status and information - """ - if not is_valid_uuid(task_id): - raise HTTPException(status_code=422, detail="Invalid task id") - status = "unknown" - tuning_info = {} - optimization_result = {} - - res = None - db_path = get_db_path(config.workspace) - if os.path.isfile(db_path): - conn = sqlite3.connect(db_path) - cursor = conn.cursor() - cursor.execute(r"select status, result, q_model_path from task where id=?", (task_id,)) - res = cursor.fetchone() - cursor.close() - conn.close() - if not res: - status = "Please check url." - elif res[0] == "done": - status = res[0] - optimization_result = deserialize(res[1]) if res[1] else res[1] - download_url = str(request.base_url) + "download/" + task_id - optimization_result["result_path"] = download_url - elif res[0] == "pending": - status = "pending" - else: - baseline = get_baseline_during_tuning(task_id, get_task_log_workspace(config.workspace)) - tuning_result = get_res_during_tuning(task_id, get_task_log_workspace(config.workspace)) - status = res[0] - tuning_info = {"baseline": baseline, "message": tuning_result} - result = {"status": status, "tuning_info": tuning_info, "optimization_result": optimization_result} - return result - - -@app.get("/task/log/{task_id}") -async def read_logs(task_id: str): - """Get the log of task according to id. - - Args: - task_id (str): the id of task. - - Returns: - StreamingResponse: text stream - - Yields: - str: log lines - """ - if not is_valid_uuid(task_id): - raise HTTPException(status_code=422, detail="Invalid task id") - log_path = os.path.normpath(os.path.join(get_task_log_workspace(config.workspace), "task_{}.txt".format(task_id))) - - if not log_path.startswith(os.path.normpath(config.workspace)): - return {"error": "Logfile not found."} - - if not os.path.exists(log_path): - return {"error": "Logfile not found."} - - def stream_logs(): - with open(log_path) as f: - while True: - line = f.readline() - if not line: - break - yield line.encode() - - return StreamingResponse(stream_logs(), media_type="text/plain") - - -# Real time output log -class LogEventHandler(FileSystemEventHandler): - """Responsible for monitoring log changes and sending logs to clients. - - Args: - FileSystemEventHandler (FileSystemEventHandler): Base file system event handler that overriding methods from. - """ - - def __init__(self, websocket: WebSocket, task_id, last_position): - """Init. - - Args: - websocket (WebSocket): websocket connection - task_id (str): the id of task - last_position (int): The last line position of the existing log. - """ - super().__init__() - self.websocket = websocket - self.task_id = task_id - self.loop = asyncio.get_event_loop() - self.last_position = last_position # record last line - self.queue = asyncio.Queue() - self.timer = self.loop.create_task(self.send_messages()) - - async def send_messages(self): - """Send messages to the client.""" - while True: - try: - messages = [] - while True: - message = await asyncio.wait_for(self.queue.get(), timeout=0.1) - messages.append(message) - except asyncio.TimeoutError: - pass - - if messages: - await self.websocket.send_text("\n".join(messages)) - - def on_modified(self, event): - """File modification event.""" - log_path = "{}/task_{}.txt".format(get_task_log_workspace(config.workspace), self.task_id) - with open(log_path, "r") as f: - # Move the file pointer to the last position - f.seek(self.last_position) - lines = f.readlines() - if lines: - # Record the current position of file pointer - self.last_position = f.tell() - for line in lines: - self.queue.put_nowait(line.strip()) - - -# start log watcher -def start_log_watcher(websocket, task_id, last_position): - """Start log watcher. - - Args: - websocket (WebSocket): websocket connection - task_id (str): the id of task. - last_position (int): The last line position of the existing log. - - Returns: - Observer : monitor log file changes - """ - observer = Observer() - # watch log/task_{}.txt - log_path = "{}/task_{}.txt".format(get_task_log_workspace(config.workspace), task_id) - observer.schedule(LogEventHandler(websocket, task_id, last_position), log_path, recursive=False) - observer.start() - return observer - - -@app.websocket("/task/screen/{task_id}") -async def websocket_endpoint(websocket: WebSocket, task_id: str): - """Real time log output. - - Args: - websocket (WebSocket): websocket connection - task_id (str): the id of task. - - Raises: - HTTPException: exception - """ - if not is_valid_uuid(task_id): - raise HTTPException(status_code=422, detail="Invalid task id") - if not check_log_exists(task_id=task_id, task_log_path=get_task_log_workspace(config.workspace)): - raise HTTPException(status_code=404, detail="Task not found") - await websocket.accept() - - # send the log that has been written - log_path = os.path.normpath(os.path.join(get_task_log_workspace(config.workspace), "task_{}.txt".format(task_id))) - - if not log_path.startswith(os.path.normpath(config.workspace)): - return {"error": "Logfile not found."} - last_position = 0 - previous_log = [] - if os.path.exists(log_path): - with open(log_path, "r") as f: - previous_log = f.readlines() - last_position = f.tell() - # send previous_log - if previous_log: - await websocket.send_text("\n".join([message.strip() for message in previous_log])) - - # start log watcher - observer = start_log_watcher(websocket, task_id, last_position) - try: - while True: - await asyncio.sleep(1) - # await websocket.receive_text() - except WebSocketDisconnect: - observer.stop() - await observer.join() - - -@app.get("/download/{task_id}") -async def download_file(task_id: str): - """Download quantized model. - - Args: - task_id (str): the task id - - Raises: - HTTPException: 400, Please check URL - HTTPException: 404, Task failed, file not found - - Returns: - FileResponse: quantized model of zip file format - """ - if not is_valid_uuid(task_id): - raise HTTPException(status_code=422, detail="Invalid task id") - db_path = get_db_path(config.workspace) - if os.path.isfile(db_path): - conn = sqlite3.connect(db_path) - cursor = conn.cursor() - cursor.execute(r"select status, result, q_model_path from task where id=?", (task_id,)) - res = cursor.fetchone() - cursor.close() - conn.close() - if res is None: - raise HTTPException(status_code=400, detail="Please check URL") - if res[0] != "done": - raise HTTPException(status_code=404, detail="Task failed, file not found") - path = res[2] - zip_filename = "quantized_model.zip" - zip_filepath = os.path.abspath(os.path.join(get_task_workspace(config.workspace), task_id, zip_filename)) - - if not zip_filepath.startswith(os.path.normpath(os.path.abspath(get_task_workspace(config.workspace)))): - raise HTTPException(status_code=422, detail="Invalid File") - # create zipfile and add file - with zipfile.ZipFile(zip_filepath, "w", zipfile.ZIP_DEFLATED) as zip_file: - for root, dirs, files in os.walk(path): - for file in files: - file_path = os.path.join(root, file) - zip_file.write(file_path, os.path.basename(file_path)) - - return FileResponse( - zip_filepath, - media_type="application/octet-stream", - filename=zip_filename, - background=BackgroundTask(os.remove, zip_filepath), - ) - - -if __name__ == "__main__": - # parse the args and modified the config accordingly - args = parse_arguments() - config.workspace = args.workspace - db_path = get_db_path(config.workspace) - config.task_monitor_port = args.task_monitor_port - config.result_monitor_port = args.result_monitor_port - # initialize the task submitter - task_submitter.task_monitor_port = config.task_monitor_port - task_submitter.result_monitor_port = config.result_monitor_port - config.service_address = task_submitter.service_address - # start the app - uvicorn.run(app, host=args.host, port=args.fastapi_port) diff --git a/neural_solution/frontend/gRPC/__init__.py b/neural_solution/frontend/gRPC/__init__.py deleted file mode 100644 index ab0ac85de2a..00000000000 --- a/neural_solution/frontend/gRPC/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""GRPC frontend.""" diff --git a/neural_solution/frontend/gRPC/client.py b/neural_solution/frontend/gRPC/client.py deleted file mode 100644 index 7ae3c3d643f..00000000000 --- a/neural_solution/frontend/gRPC/client.py +++ /dev/null @@ -1,141 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Client of gRPC frontend.""" - -import argparse -import json -import os - -import grpc - -from neural_solution.config import config -from neural_solution.frontend.gRPC.proto import neural_solution_pb2, neural_solution_pb2_grpc -from neural_solution.utils import logger - - -def _parse_task_from_json(request_path): - file_path = os.path.abspath(request_path) - with open(file_path) as fp: - task = json.load(fp) - return task - - -def submit_task(args): - """Implement main entry point for the client of gRPC frontend.""" - task = _parse_task_from_json(args.request) - logger.info("Parsed task:") - logger.info(task) - - # Create a gRPC channel - port = str(config.grpc_api_port) - channel = grpc.insecure_channel("localhost:" + port) - - # Create a stub (client) - stub = neural_solution_pb2_grpc.TaskServiceStub(channel) - - # Ping serve - request = neural_solution_pb2.EmptyRequest() # pylint: disable=no-member - response = stub.Ping(request) - logger.info(response.status) - logger.info(response.msg) - - # Create a task request with the desired fields - request = neural_solution_pb2.Task( # pylint: disable=no-member - script_url=task["script_url"], - optimized=task["optimized"] == "True", - arguments=task["arguments"], - approach=task["approach"], - requirements=task["requirements"], - workers=task["workers"], - ) - - # Call the SubmitTask RPC on the server - response = stub.SubmitTask(request) - - # Process the response - logger.info(response.status) - logger.info(response.task_id) - logger.info(response.msg) - - -def run_query_task_result(args): - """Query task result according to id. - - Args: - args: args includes task_id - """ - task_id = args.task_id - # Create a gRPC channel - port = str(config.grpc_api_port) - channel = grpc.insecure_channel("localhost:" + port) - - # Create a stub (client) - stub = neural_solution_pb2_grpc.TaskServiceStub(channel) - - request = neural_solution_pb2.TaskId(task_id=task_id) # pylint: disable=no-member - response = stub.QueryTaskResult(request) - logger.info(response.status) - logger.info(response.tuning_information) - logger.info(response.optimization_result) - - -def run_query_task_status(args): - """Query task status according to id. - - Args: - args: args includes task_id - """ - task_id = args.task_id - # Create a gRPC channel - port = str(config.grpc_api_port) - channel = grpc.insecure_channel("localhost:" + port) - - # Create a stub (client) - stub = neural_solution_pb2_grpc.TaskServiceStub(channel) - - request = neural_solution_pb2.TaskId(task_id=task_id) # pylint: disable=no-member - response = stub.GetTaskById(request) - logger.info(response.status) - logger.info(response.optimized_result) - logger.info(response.result_path) - - -if __name__ == "__main__": - logger.info("Try to start gRPC server.") - """Parse the command line options.""" - parser = argparse.ArgumentParser(description="gRPC Client") - subparsers = parser.add_subparsers(help="Action", dest="action") - - submit_action_parser = subparsers.add_parser("submit", help="Submit help") - - submit_action_parser.set_defaults(func=submit_task) - submit_action_parser.add_argument("--request", type=str, default=None, help="Request json file path.") - - query_action_parser = subparsers.add_parser("query", help="Query help") - query_action_parser.set_defaults(func=run_query_task_result) - query_action_parser.add_argument("--task_id", type=str, default=None, help="Query task by task id.") - - parser.add_argument("--grpc_api_port", type=str, default="8001", help="grpc server port.") - parser.add_argument("--result_monitor_port", type=str, default="2222", help="result monitor port.") - parser.add_argument("--task_monitor_port", type=str, default="3333", help="task monitor port.") - - args = parser.parse_args() - config.grpc_api_port = args.grpc_api_port - config.result_monitor_port = args.result_monitor_port - config.task_monitor_port = args.task_monitor_port - args.func(args) - -# for test: -# python client.py query --task_id="d3e10a49326449fb9d0d62f2bfc1cb43" -# python client.py submit --request="test_task_request.json" diff --git a/neural_solution/frontend/gRPC/proto/__init__.py b/neural_solution/frontend/gRPC/proto/__init__.py deleted file mode 100644 index 06941016b4f..00000000000 --- a/neural_solution/frontend/gRPC/proto/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""GRPC proto.""" diff --git a/neural_solution/frontend/gRPC/proto/generate_cmd.sh b/neural_solution/frontend/gRPC/proto/generate_cmd.sh deleted file mode 100644 index 5e94c28798e..00000000000 --- a/neural_solution/frontend/gRPC/proto/generate_cmd.sh +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -python -m grpc_tools.protoc -I./ --python_out=. --grpc_python_out=. ./neural_solution.proto \ No newline at end of file diff --git a/neural_solution/frontend/gRPC/proto/neural_solution.proto b/neural_solution/frontend/gRPC/proto/neural_solution.proto deleted file mode 100644 index 669a9b5276e..00000000000 --- a/neural_solution/frontend/gRPC/proto/neural_solution.proto +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (c) 2023 Intel Corporation -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -import "google/protobuf/empty.proto"; - -package neural_solution; - - -// Interface exported by the server -service TaskService { - rpc Ping(google.protobuf.Empty) returns (ResponsePingMessage) {} - rpc SubmitTask(Task) returns (TaskResponse) {} - rpc GetTaskById(TaskId) returns (TaskStatus) {} - rpc QueryTaskResult(TaskId) returns (ResponseTaskResult) {} -} - - -// [/task/submit/] -// task request description -message Task { - string script_url = 1; - bool optimized = 2; - repeated string arguments = 3; - string approach = 4; - repeated string requirements = 5; - int32 workers = 6; - } -// task response -message TaskResponse { - string status = 1; - string task_id = 2; - string msg = 3; -} - - -// [/task/{task_id}] -// query task status by task id -message TaskId { - string task_id = 1; -} - -// response -message TaskStatus { - string status = 1; - string optimized_result = 2; - string result_path = 3; -} - -// empty message -message EmptyRequest {} - -// / -message WelcomeMessage { - // repsonce welcome message - string message = 1; -} - -// /ping -message ResponsePingMessage { - // repsonce message for ping - string status = 1; - string msg = 2; -} - -// // optimization result message -// message OptimizatonResult{ -// string optimization_time = 1; -// string accuracy = 2; -// string duration = 3; -// string result_path = 4; -// } - -// // tuning information - -// message TuningInformation{ -// string bseline = 1; -// string message = 2; -// } - -// /task/status/{task_id} -message ResponseTaskResult { - string status = 1; - string tuning_information = 2; - string optimization_result = 3; -} - - - diff --git a/neural_solution/frontend/gRPC/proto/neural_solution_pb2.py b/neural_solution/frontend/gRPC/proto/neural_solution_pb2.py deleted file mode 100644 index 65e8ff7ca34..00000000000 --- a/neural_solution/frontend/gRPC/proto/neural_solution_pb2.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by the protocol buffer compiler. DO NOT EDIT! -# source: neural_solution.proto -# pylint: disable=all -"""Generated protocol buffer code.""" -from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool -from google.protobuf import symbol_database as _symbol_database -from google.protobuf.internal import builder as _builder - -# @@protoc_insertion_point(imports) - -_sym_db = _symbol_database.Default() - - -from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 - -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x15neural_solution.proto\x12\x0fneural_solution\x1a\x1bgoogle/protobuf/empty.proto"y\n\x04Task\x12\x12\n\nscript_url\x18\x01 \x01(\t\x12\x11\n\toptimized\x18\x02 \x01(\x08\x12\x11\n\targuments\x18\x03 \x03(\t\x12\x10\n\x08\x61pproach\x18\x04 \x01(\t\x12\x14\n\x0crequirements\x18\x05 \x03(\t\x12\x0f\n\x07workers\x18\x06 \x01(\x05"<\n\x0cTaskResponse\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x0f\n\x07task_id\x18\x02 \x01(\t\x12\x0b\n\x03msg\x18\x03 \x01(\t"\x19\n\x06TaskId\x12\x0f\n\x07task_id\x18\x01 \x01(\t"K\n\nTaskStatus\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x18\n\x10optimized_result\x18\x02 \x01(\t\x12\x13\n\x0bresult_path\x18\x03 \x01(\t"\x0e\n\x0c\x45mptyRequest"!\n\x0eWelcomeMessage\x12\x0f\n\x07message\x18\x01 \x01(\t"2\n\x13ResponsePingMessage\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x0b\n\x03msg\x18\x02 \x01(\t"]\n\x12ResponseTaskResult\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x1a\n\x12tuning_information\x18\x02 \x01(\t\x12\x1b\n\x13optimization_result\x18\x03 \x01(\t2\xb5\x02\n\x0bTaskService\x12\x46\n\x04Ping\x12\x16.google.protobuf.Empty\x1a$.neural_solution.ResponsePingMessage"\x00\x12\x44\n\nSubmitTask\x12\x15.neural_solution.Task\x1a\x1d.neural_solution.TaskResponse"\x00\x12\x45\n\x0bGetTaskById\x12\x17.neural_solution.TaskId\x1a\x1b.neural_solution.TaskStatus"\x00\x12Q\n\x0fQueryTaskResult\x12\x17.neural_solution.TaskId\x1a#.neural_solution.ResponseTaskResult"\x00\x62\x06proto3' -) - -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, "neural_solution_pb2", globals()) -if _descriptor._USE_C_DESCRIPTORS == False: - DESCRIPTOR._options = None - _TASK._serialized_start = 71 - _TASK._serialized_end = 192 - _TASKRESPONSE._serialized_start = 194 - _TASKRESPONSE._serialized_end = 254 - _TASKID._serialized_start = 256 - _TASKID._serialized_end = 281 - _TASKSTATUS._serialized_start = 283 - _TASKSTATUS._serialized_end = 358 - _EMPTYREQUEST._serialized_start = 360 - _EMPTYREQUEST._serialized_end = 374 - _WELCOMEMESSAGE._serialized_start = 376 - _WELCOMEMESSAGE._serialized_end = 409 - _RESPONSEPINGMESSAGE._serialized_start = 411 - _RESPONSEPINGMESSAGE._serialized_end = 461 - _RESPONSETASKRESULT._serialized_start = 463 - _RESPONSETASKRESULT._serialized_end = 556 - _TASKSERVICE._serialized_start = 559 - _TASKSERVICE._serialized_end = 868 -# @@protoc_insertion_point(module_scope) diff --git a/neural_solution/frontend/gRPC/proto/neural_solution_pb2_grpc.py b/neural_solution/frontend/gRPC/proto/neural_solution_pb2_grpc.py deleted file mode 100644 index 8c5f1c25831..00000000000 --- a/neural_solution/frontend/gRPC/proto/neural_solution_pb2_grpc.py +++ /dev/null @@ -1,390 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! -# pylint: disable=all -"""Client and server classes corresponding to protobuf-defined services.""" -import grpc -from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2 - -import neural_solution.frontend.gRPC.proto.neural_solution_pb2 as neural__solution__pb2 - - -class TaskServiceStub(object): - """Interface exported by the server.""" - - def __init__(self, channel): - """Init constructor. - - Args: - channel: A grpc.Channel. - """ - self.Ping = channel.unary_unary( - "/neural_solution.TaskService/Ping", - request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString, - response_deserializer=neural__solution__pb2.ResponsePingMessage.FromString, - ) - self.SubmitTask = channel.unary_unary( - "/neural_solution.TaskService/SubmitTask", - request_serializer=neural__solution__pb2.Task.SerializeToString, - response_deserializer=neural__solution__pb2.TaskResponse.FromString, - ) - self.GetTaskById = channel.unary_unary( - "/neural_solution.TaskService/GetTaskById", - request_serializer=neural__solution__pb2.TaskId.SerializeToString, - response_deserializer=neural__solution__pb2.TaskStatus.FromString, - ) - self.QueryTaskResult = channel.unary_unary( - "/neural_solution.TaskService/QueryTaskResult", - request_serializer=neural__solution__pb2.TaskId.SerializeToString, - response_deserializer=neural__solution__pb2.ResponseTaskResult.FromString, - ) - - -class TaskServiceServicer(object): - """Interface exported by the server.""" - - def Ping(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def SubmitTask(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def GetTaskById(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - def QueryTaskResult(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") - - -def add_TaskServiceServicer_to_server(servicer, server): - """Add the TaskServiceServicer to gRpc server. - - Args: - servicer (TaskSubmitterServicer): task servicer - server (grpc._server._Server): server - """ - rpc_method_handlers = { - "Ping": grpc.unary_unary_rpc_method_handler( - servicer.Ping, - request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString, - response_serializer=neural__solution__pb2.ResponsePingMessage.SerializeToString, - ), - "SubmitTask": grpc.unary_unary_rpc_method_handler( - servicer.SubmitTask, - request_deserializer=neural__solution__pb2.Task.FromString, - response_serializer=neural__solution__pb2.TaskResponse.SerializeToString, - ), - "GetTaskById": grpc.unary_unary_rpc_method_handler( - servicer.GetTaskById, - request_deserializer=neural__solution__pb2.TaskId.FromString, - response_serializer=neural__solution__pb2.TaskStatus.SerializeToString, - ), - "QueryTaskResult": grpc.unary_unary_rpc_method_handler( - servicer.QueryTaskResult, - request_deserializer=neural__solution__pb2.TaskId.FromString, - response_serializer=neural__solution__pb2.ResponseTaskResult.SerializeToString, - ), - } - generic_handler = grpc.method_handlers_generic_handler("neural_solution.TaskService", rpc_method_handlers) - server.add_generic_rpc_handlers((generic_handler,)) - - -# This class is part of an EXPERIMENTAL API. -class TaskService(object): - """Interface exported by the server.""" - - @staticmethod - def Ping( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - """Tets server status. - - Args: - request: An iterator that yields request values for the RPC. - target: The server address. - method: The name of the RPC method. - request_serializer: Optional :term:`serializer` for serializing the request - message. Request goes unserialized in case None is passed. - response_deserializer: Optional :term:`deserializer` for deserializing the response - message. Response goes undeserialized in case None is passed. - options: An optional list of key-value pairs (:term:`channel_arguments` in gRPC Core - runtime) to configure the channel. - channel_credentials: A credential applied to the whole channel, e.g. the - return value of grpc.ssl_channel_credentials() or - grpc.insecure_channel_credentials(). - insecure: If True, specifies channel_credentials as - :term:`grpc.insecure_channel_credentials()`. This option is mutually - exclusive with the `channel_credentials` option. - call_credentials: A call credential applied to each call individually, - e.g. the output of grpc.metadata_call_credentials() or - grpc.access_token_call_credentials(). - compression: An optional value indicating the compression method to be - used over the lifetime of the channel, e.g. grpc.Compression.Gzip. - wait_for_ready: An optional flag indicating whether the RPC should fail - immediately if the connection is not ready at the time the RPC is - invoked, or if it should wait until the connection to the server - becomes ready. When using this option, the user will likely also want - to set a timeout. Defaults to True. - timeout: An optional duration of time in seconds to allow for the RPC, - after which an exception will be raised. If timeout is unspecified, - defaults to a timeout controlled by the - GRPC_PYTHON_DEFAULT_TIMEOUT_SECONDS environment variable. If that is - unset, defaults to 60 seconds. Supply a value of None to indicate that - no timeout should be enforced. - metadata: Optional metadata to send to the server. - - Returns: - The response to the RPC. - """ - return grpc.experimental.unary_unary( - request, - target, - "/neural_solution.TaskService/Ping", - google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString, - neural__solution__pb2.ResponsePingMessage.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - ) - - @staticmethod - def SubmitTask( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - """Submit task. - - Args: - request: An iterator that yields request values for the RPC. - target: The server address. - method: The name of the RPC method. - request_serializer: Optional :term:`serializer` for serializing the request - message. Request goes unserialized in case None is passed. - response_deserializer: Optional :term:`deserializer` for deserializing the response - message. Response goes undeserialized in case None is passed. - options: An optional list of key-value pairs (:term:`channel_arguments` in gRPC Core - runtime) to configure the channel. - channel_credentials: A credential applied to the whole channel, e.g. the - return value of grpc.ssl_channel_credentials() or - grpc.insecure_channel_credentials(). - insecure: If True, specifies channel_credentials as - :term:`grpc.insecure_channel_credentials()`. This option is mutually - exclusive with the `channel_credentials` option. - call_credentials: A call credential applied to each call individually, - e.g. the output of grpc.metadata_call_credentials() or - grpc.access_token_call_credentials(). - compression: An optional value indicating the compression method to be - used over the lifetime of the channel, e.g. grpc.Compression.Gzip. - wait_for_ready: An optional flag indicating whether the RPC should fail - immediately if the connection is not ready at the time the RPC is - invoked, or if it should wait until the connection to the server - becomes ready. When using this option, the user will likely also want - to set a timeout. Defaults to True. - timeout: An optional duration of time in seconds to allow for the RPC, - after which an exception will be raised. If timeout is unspecified, - defaults to a timeout controlled by the - GRPC_PYTHON_DEFAULT_TIMEOUT_SECONDS environment variable. If that is - unset, defaults to 60 seconds. Supply a value of None to indicate that - no timeout should be enforced. - metadata: Optional metadata to send to the server. - - Returns: - The response to the RPC. - """ - return grpc.experimental.unary_unary( - request, - target, - "/neural_solution.TaskService/SubmitTask", - neural__solution__pb2.Task.SerializeToString, - neural__solution__pb2.TaskResponse.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - ) - - @staticmethod - def GetTaskById( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - """Get task status according to id. - - Args: - request: An iterator that yields request values for the RPC. - target: The server address. - method: The name of the RPC method. - request_serializer: Optional :term:`serializer` for serializing the request - message. Request goes unserialized in case None is passed. - response_deserializer: Optional :term:`deserializer` for deserializing the response - message. Response goes undeserialized in case None is passed. - options: An optional list of key-value pairs (:term:`channel_arguments` in gRPC Core - runtime) to configure the channel. - channel_credentials: A credential applied to the whole channel, e.g. the - return value of grpc.ssl_channel_credentials() or - grpc.insecure_channel_credentials(). - insecure: If True, specifies channel_credentials as - :term:`grpc.insecure_channel_credentials()`. This option is mutually - exclusive with the `channel_credentials` option. - call_credentials: A call credential applied to each call individually, - e.g. the output of grpc.metadata_call_credentials() or - grpc.access_token_call_credentials(). - compression: An optional value indicating the compression method to be - used over the lifetime of the channel, e.g. grpc.Compression.Gzip. - wait_for_ready: An optional flag indicating whether the RPC should fail - immediately if the connection is not ready at the time the RPC is - invoked, or if it should wait until the connection to the server - becomes ready. When using this option, the user will likely also want - to set a timeout. Defaults to True. - timeout: An optional duration of time in seconds to allow for the RPC, - after which an exception will be raised. If timeout is unspecified, - defaults to a timeout controlled by the - GRPC_PYTHON_DEFAULT_TIMEOUT_SECONDS environment variable. If that is - unset, defaults to 60 seconds. Supply a value of None to indicate that - no timeout should be enforced. - metadata: Optional metadata to send to the server. - - Returns: - The response to the RPC. - """ - return grpc.experimental.unary_unary( - request, - target, - "/neural_solution.TaskService/GetTaskById", - neural__solution__pb2.TaskId.SerializeToString, - neural__solution__pb2.TaskStatus.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - ) - - @staticmethod - def QueryTaskResult( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - """Get task result according to id. - - Args: - request: An iterator that yields request values for the RPC. - target: The server address. - method: The name of the RPC method. - request_serializer: Optional :term:`serializer` for serializing the request - message. Request goes unserialized in case None is passed. - response_deserializer: Optional :term:`deserializer` for deserializing the response - message. Response goes undeserialized in case None is passed. - options: An optional list of key-value pairs (:term:`channel_arguments` in gRPC Core - runtime) to configure the channel. - channel_credentials: A credential applied to the whole channel, e.g. the - return value of grpc.ssl_channel_credentials() or - grpc.insecure_channel_credentials(). - insecure: If True, specifies channel_credentials as - :term:`grpc.insecure_channel_credentials()`. This option is mutually - exclusive with the `channel_credentials` option. - call_credentials: A call credential applied to each call individually, - e.g. the output of grpc.metadata_call_credentials() or - grpc.access_token_call_credentials(). - compression: An optional value indicating the compression method to be - used over the lifetime of the channel, e.g. grpc.Compression.Gzip. - wait_for_ready: An optional flag indicating whether the RPC should fail - immediately if the connection is not ready at the time the RPC is - invoked, or if it should wait until the connection to the server - becomes ready. When using this option, the user will likely also want - to set a timeout. Defaults to True. - timeout: An optional duration of time in seconds to allow for the RPC, - after which an exception will be raised. If timeout is unspecified, - defaults to a timeout controlled by the - GRPC_PYTHON_DEFAULT_TIMEOUT_SECONDS environment variable. If that is - unset, defaults to 60 seconds. Supply a value of None to indicate that - no timeout should be enforced. - metadata: Optional metadata to send to the server. - - Returns: - The response to the RPC. - """ - return grpc.experimental.unary_unary( - request, - target, - "/neural_solution.TaskService/QueryTaskResult", - neural__solution__pb2.TaskId.SerializeToString, - neural__solution__pb2.ResponseTaskResult.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - ) diff --git a/neural_solution/frontend/gRPC/server.py b/neural_solution/frontend/gRPC/server.py deleted file mode 100644 index 28b582ee99d..00000000000 --- a/neural_solution/frontend/gRPC/server.py +++ /dev/null @@ -1,153 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Server of gRPC frontend.""" - -import argparse -import logging -from concurrent import futures - -import grpc - -from neural_solution.config import config -from neural_solution.frontend.gRPC.proto import neural_solution_pb2, neural_solution_pb2_grpc -from neural_solution.frontend.task_submitter import task_submitter -from neural_solution.frontend.utility import ( - check_service_status, - query_task_result, - query_task_status, - submit_task_to_db, -) -from neural_solution.utils import logger -from neural_solution.utils.utility import dict_to_str, get_db_path - - -class TaskSubmitterServicer(neural_solution_pb2_grpc.TaskServiceServicer): - """Deliver services. - - Args: - neural_solution_pb2_grpc (): task servicer - """ - - def __init__(self) -> None: - """Init.""" - pass - - def Ping(self, empty_msg, context): - """Check service status. - - Args: - empty_msg (str): empty message - context (str): context - - Returns: - Response: service status - """ - logger.info("Ping grpc serve.") - port_lst = [config.result_monitor_port] - result = check_service_status(port_lst, service_address=config.service_address) - response = neural_solution_pb2.ResponsePingMessage(**result) # pylint: disable=no-member - return response - - def SubmitTask(self, task, context): - """Submit task. - - Args: - task (Task): task object - Fields: - task_id: The task id - arguments: The task command - workers: The requested resource unit number - status: The status of the task: pending/running/done - result: The result of the task, which is only value-assigned when the task is done - - Returns: - json: status , id of task and messages. - """ - # Process the task - logger.info("Submit task to task db") - db_path = get_db_path(config.workspace) - logger.info(db_path) - result = submit_task_to_db(task=task, task_submitter=task_submitter, db_path=get_db_path(config.workspace)) - # Return a response - response = neural_solution_pb2.TaskResponse(**result) # pylint: disable=no-member - return response - - def GetTaskById(self, task_id, context): - """Get task status, result, quantized model path according to id. - - Args: - task_id (str): the id of task. - - Returns: - json: task status, result, quantized model path - """ - db_path = get_db_path(config.workspace) - result = query_task_status(task_id.task_id, db_path) - logger.info("query result : result") - response = neural_solution_pb2.TaskStatus(**result) # pylint: disable=no-member - return response - - def QueryTaskResult(self, task_id, context): - """Get task status and information according to id. - - Args: - task_id (str): the id of task. - - Returns: - json: task status and information - """ - db_path = get_db_path(config.workspace) - result = query_task_result(task_id.task_id, db_path, config.workspace) - result["tuning_information"] = dict_to_str(result["tuning_information"]) - result["optimization_result"] = dict_to_str(result["optimization_result"]) - response = neural_solution_pb2.ResponseTaskResult(**result) # pylint: disable=no-member - return response - - -def serve(): - """Service entrance.""" - port = str(config.grpc_api_port) - server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) - neural_solution_pb2_grpc.add_TaskServiceServicer_to_server(TaskSubmitterServicer(), server) - server.add_insecure_port("[::]:" + port) - server.start() - logger.info("Server started, listening on " + port) - server.wait_for_termination() - - -def parse_arguments(): - """Parse the command line options.""" - parser = argparse.ArgumentParser(description="Frontend with gRPC API") - parser.add_argument("-H", "--host", type=str, default="0.0.0.0", help="The address to submit task.") - parser.add_argument("-FP", "--grpc_api_port", type=int, default=8001, help="Port to submit task by user.") - parser.add_argument("-TMP", "--task_monitor_port", type=int, default=2222, help="Port to monitor task.") - parser.add_argument("-RMP", "--result_monitor_port", type=int, default=3333, help="Port to monitor result.") - parser.add_argument("-WS", "--workspace", type=str, default="./ns_workspace", help="Work space.") - args = parser.parse_args() - return args - - -if __name__ == "__main__": - logger.info("Try to start gRPC server.") - logging.basicConfig() - args = parse_arguments() - logger.info(args.workspace) - config.workspace = args.workspace - config.grpc_api_port = args.grpc_api_port - config.result_monitor_port = args.result_monitor_port - config.task_monitor_port = args.task_monitor_port - # initialize the task submitter - task_submitter.task_monitor_port = config.task_monitor_port - task_submitter.result_monitor_port = config.result_monitor_port - serve() diff --git a/neural_solution/frontend/task_submitter.py b/neural_solution/frontend/task_submitter.py deleted file mode 100644 index ea862a1a25d..00000000000 --- a/neural_solution/frontend/task_submitter.py +++ /dev/null @@ -1,73 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Neural Solution task submitter.""" - -import json -import socket - -from pydantic import BaseModel # pylint: disable=no-name-in-module - -from neural_solution.config import config - - -class Task(BaseModel): - """Task definition for submitting requests. - - Args: - BaseModel (ModelMetaclass): meta class - """ - - script_url: str - optimized: bool - arguments: list - approach: str - requirements: list - workers: int - - -class TaskSubmitter: - """Responsible for submitting tasks.""" - - def __init__(self, task_monitor_port=2222, result_monitor_port=3333, service_address="localhost"): - """Init. - - Args: - task_monitor_port (int, optional): the port for monitoring tasks. Defaults to 2222. - result_monitor_port (int, optional): the port for monitoring results. Defaults to 3333. - service_address (str, optional): the service address. Defaults to "localhost". - """ - self.task_monitor_port = task_monitor_port - self.result_monitor_port = result_monitor_port - self.service_address = service_address - - def serialize(self, tid: str) -> bytes: - """Serialize a str object.""" - d = {"task_id": tid} - return json.dumps(d).encode() - - def submit_task(self, tid): - """Submit task by sending id. - - Args: - tid (str): the id of task - """ - s = socket.socket() - s.connect((self.service_address, self.task_monitor_port)) - s.send(self.serialize(tid)) - s.close() - - -task_submitter = TaskSubmitter( - task_monitor_port=config.task_monitor_port, result_monitor_port=config.result_monitor_port -) diff --git a/neural_solution/frontend/user_facing_api.json b/neural_solution/frontend/user_facing_api.json deleted file mode 100644 index d355db7fd9d..00000000000 --- a/neural_solution/frontend/user_facing_api.json +++ /dev/null @@ -1,154 +0,0 @@ -{ - "root": { - "get": { - "description": "Welcome interface", - "responses": { - "200": { - "message": "Welcome to Neural Solution!" - } - } - }, - "/task": { - "/submit": { - "post": { - "description": "Submit new task.", - "parameters": [ - "script_url", - "..." - ], - "responses": { - "200": { - "description": "Submitted successfully.", - "content": { - "status": "Successfully." - }, - "task_id": { - "type": "string", - "description": "Hashed key." - } - }, - "500":{ - "description": "Submitted failed.", - "content": { - "status": "Failed." - } - } - } - } - }, - "/status/{task_id}": { - "get": { - "description": "Get the task status.", - "responses":{ - "200": { - "description": "Task is running.", - "content": { - "status": "running" - } - } - } - } - }, - "/log/{task_id}": { - "get": { - "description": "Get the task log.", - "responses":{ - "200": { - "description": "Get the task log.", - "content": "task log" - } - } - } - }, - "/screen/{task_id}": { - "WebSocket": { - "description": "Get real-time task log.", - "responses":{ - "101": { - "description": "Get real-time task log.", - "content": "real-time task log" - }, - "1000":{ - "description": "Normal Closure", - "content": "Connection was closed successfully." - }, - "404": { - "description": "Task not found.", - "content": { - "status": "Failed." - } - } - } - } - } - }, - "/ping": { - "get":{ - "description": "Check the health status of Neural Solution", - "responses":{ - "200": { - "description": "The health status", - "content1": { - "status": "Healthy", - "msg": "Neural Solution is running." - }, - "content2": { - "status": "Failed.", - "msg": "Ping fail! & error message" - } - } - } - } - }, - "/cluster": { - "get":{ - "description": "Get cluster running status", - "responses":{ - "200": { - "description": "The cluster running status, including node information, node usage and availability, and total resources", - "content1": { - "status": "Healthy", - "msg": "Cluster information." - } - } - } - } - }, - "/download": { - "get":{ - "description": "Download optimized result.", - "responses":{ - "200": { - "description": "Download quantized model zip file locally.", - "content": "quantized model zip file." - }, - "400": { - "description": "User input error.", - "content1": { - "msg": "Please check URL." - } - }, - "404": { - "description": "No quantized model when task failed", - "content1": { - "msg": "Task failed, file not found" - } - } - } - }, - "/description":{ - "get":{ - "description": "Get user facing api.", - "responses":{ - "200": { - "description": "Get user facing api.", - "content1": { - "msg": "The user facing api." - } - } - } - } - } - } - } -} \ No newline at end of file diff --git a/neural_solution/frontend/utility.py b/neural_solution/frontend/utility.py deleted file mode 100644 index 23bc7c55fb7..00000000000 --- a/neural_solution/frontend/utility.py +++ /dev/null @@ -1,388 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Common utilities for all frontend components.""" - -import json -import os -import re -import socket -import sqlite3 -import uuid - -import pandas as pd - -from neural_solution.utils import logger -from neural_solution.utils.utility import dict_to_str, get_task_log_workspace - - -def query_task_status(task_id, db_path): - """Query task status according to id. - - Args: - task_id (str): the id of task - db_path (str): the path of database - - Returns: - dict: the task status and information. - """ - res = None - if os.path.isfile(db_path): - conn = sqlite3.connect(db_path) - cursor = conn.cursor() - cursor.execute(r"select status, result, q_model_path from task where id=?", (task_id,)) - res = cursor.fetchone() - cursor.close() - conn.close() - return { - "status": res[0], - "optimized_result": dict_to_str(deserialize(res[1]) if res[1] else res[1]), - "result_path": res[2], - } - - -def query_task_result(task_id, db_path, workspace): - """Query the task result according id. - - Args: - task_id (str): the id of task - db_path (str): the path of database - workspace (str): the workspace for Neural Solution - - Returns: - dict: task result - """ - status = "unknown" - tuning_info = {} - optimization_result = {} - - res = None - if os.path.isfile(db_path): - conn = sqlite3.connect(db_path) - cursor = conn.cursor() - cursor.execute(r"select status, result, q_model_path from task where id=?", (task_id,)) - res = cursor.fetchone() - cursor.close() - conn.close() - logger.info("in query") - if not res: - status = "Please check url." - elif res[0] == "done": - status = res[0] - optimization_result = deserialize(res[1]) if res[1] else res[1] - optimization_result["result_path"] = res[2] - elif res[0] == "pending": - status = "pending" - else: - baseline = get_baseline_during_tuning(task_id, get_task_log_workspace(workspace)) - tuning_result = get_res_during_tuning(task_id, get_task_log_workspace(workspace)) - status = res[0] - tuning_info = {"baseline": baseline, "message": tuning_result} - result = {"status": status, "tuning_information": tuning_info, "optimization_result": optimization_result} - return result - - -def check_service_status(port_lst, service_address): - """Check server status. - - Args: - port_lst (List): ports list - service_address (str): service ip - - Returns: - dict: server status and messages - """ - count = 0 - msg = "Neural Solution is running." - for port in port_lst: - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - try: - sock.connect((service_address, port)) - sock.send(serialize({"ping": "test"})) - sock.settimeout(5) - response = sock.recv(1024) - if response == b"ok": - count += 1 - sock.close() - continue - except ConnectionRefusedError: - msg = "Ping fail! Make sure Neural Solution runner is running!" - break - except Exception as e: - msg = "Ping fail! {}".format(e) - break - sock.close() - return {"status": "Healthy", "msg": msg} if count == 1 else {"status": "Failed", "msg": msg} - - -def submit_task_to_db(task, task_submitter, db_path): - """Submit the task to db. - - Args: - task (Task): the object of Task - task_submitter (TaskSubmitter): the object of TaskSubmitter - db_path (str): the path of database - - Returns: - str: task id and information - """ - msg = "Task submitted failed" - status = "failed" - task_id = "-1" - result = {"status": status, "task_id": task_id, "msg": msg} - if not is_valid_task(task.__dict__): - return result - if os.path.isfile(db_path): - conn = sqlite3.connect(db_path) - cursor = conn.cursor() - task_id = str(uuid.uuid4()).replace("-", "") - sql = ( - "INSERT INTO task " - "(id, script_url, optimized, arguments, approach, requirements, workers, status) " - "VALUES (?, ?, ?, ?, ?, ?, ?, 'pending')" - ) - - task_params = ( - task_id, - task.script_url, - task.optimized, - list_to_string(task.arguments), - task.approach, - list_to_string(task.requirements), - task.workers, - ) - - conn.execute(sql, task_params) - conn.commit() - try: - task_submitter.submit_task(task_id) - except ConnectionRefusedError: - msg = "Task Submitted fail! Make sure neural solution runner is running!" - except Exception as e: - msg = "Task Submitted fail!" - print(f"{msg} {e}") - conn.close() - status = "successfully" - msg = "Task submitted successfully" - else: - msg = "Task Submitted fail! db not found!" - result["status"] = status - result["task_id"] = task_id - result["msg"] = msg - return result - - -def serialize(request: dict) -> bytes: - """Serialize a dict object to bytes for inter-process communication.""" - return json.dumps(request).encode() - - -def deserialize(request: bytes) -> dict: - """Deserialize the received bytes to a dict object.""" - return json.loads(request) - - -def get_cluster_info(db_path: str): - """Get cluster information from database. - - Returns: - json: cluster information includes the number of nodes and node information. - """ - conn = sqlite3.connect(f"{db_path}") - cursor = conn.cursor() - cursor.execute(r"select * from cluster") - conn.commit() - rows = cursor.fetchall() - conn.close() - return {"Cluster info": rows} - - -def get_cluster_table(db_path: str): - """Get cluster table from database. - - Returns: - html: table of cluster information. - """ - conn = sqlite3.connect(f"{db_path}") - cursor = conn.cursor() - cursor.execute(r"select * from cluster") - conn.commit() - rows = cursor.fetchall() - df = pd.DataFrame(rows, columns=["Node", "Node info", "status", "free workers", "busy workers", "total workers"]) - html_table = df.to_html( - index=False, - ) - conn.close() - return html_table - - -def get_res_during_tuning(task_id: str, task_log_path): - """Get result during tuning. - - Args: - task_id (string): used to generate log path. - - Returns: - dict: the result of {"Tuning count":, "Accuracy":, "Duration (seconds)"}. - """ - results = {} - log_path = "{}/task_{}.txt".format(task_log_path, task_id) - log_path = os.path.normpath(os.path.join(task_log_path, "task_{}.txt".format(task_id))) - - if not log_path.startswith(os.path.normpath(task_log_path)): - return {"error": "Logfile not found."} - for line in reversed(open(log_path).readlines()): - res_pattern = r"Tune (\d+) result is: " - res_pattern = r"Tune (\d+) result is:\s.*?\(int8\|fp32\):\s+(\d+\.\d+).*?\(int8\|fp32\):\s+(\d+\.\d+).*?" - res_matches = re.findall(res_pattern, line) - if res_matches: - results["Tuning count"] = res_matches[0][0] - results["Accuracy"] = res_matches[0][1] - results["Duration (seconds)"] = res_matches[0][2] - # break when the last result is matched - break - - logger.info("Query results: {}".format(results)) - return results if results else "Tune 1 running..." - - -def get_baseline_during_tuning(task_id: str, task_log_path): - """Get result during tuning. - - Args: - task_id (string): used to generate log path. - - Returns: - dict: the baseline of {"Accuracy":,"Duration (seconds)":}. - """ - results = {} - log_path = "{}/task_{}.txt".format(task_log_path, task_id) - log_path = os.path.normpath(os.path.join(task_log_path, "task_{}.txt".format(task_id))) - - if not log_path.startswith(os.path.normpath(task_log_path)): - return {"error": "Logfile not found."} - for line in reversed(open(log_path).readlines()): - res_pattern = "FP32 baseline is:\s+.*?(\d+\.\d+).*?(\d+\.\d+).*?" - res_matches = re.findall(res_pattern, line) - if res_matches: - results["Accuracy"] = res_matches[0][0] - results["Duration (seconds)"] = res_matches[0][1] - # break when the last result is matched - break - - logger.info("FP32 baseline: {}".format(results)) - return results if results else "Getting FP32 baseline..." - - -def is_valid_uuid(uuid_string): - """Validate UUID format using regular expression. - - Args: - uuid_string (str): task id. - - Returns: - bool: task id is valid or invalid. - """ - uuid_regex = re.compile(r"(?i)^[0-9a-f]{8}[0-9a-f]{4}[1-5][0-9a-f]{3}[89ab][0-9a-f]{3}[0-9a-f]{12}$") - return bool(uuid_regex.match(uuid_string)) - - -def check_log_exists(task_id: str, task_log_path): - """Check whether the log file exists. - - Args: - task_id (str): task id. - - Returns: - bool: Does the log file exist. - """ - if not is_valid_uuid(task_id): - return False - log_path = os.path.normpath(os.path.join(task_log_path, "task_{}.txt".format(task_id))) - - if not log_path.startswith(os.path.normpath(task_log_path)): - return False - if os.path.exists(log_path): - return True - else: - return False - - -def list_to_string(lst: list): - """Convert the list to a space concatenated string. - - Args: - lst (list): strings - - Returns: - str: string - """ - return " ".join(str(i) for i in lst) - - -def is_invalid_str(to_test_str: str): - """Verify whether the to_test_str is valid. - - Args: - to_test_str (str): string to be tested. - - Returns: - bool: valid or invalid - """ - return any(char in to_test_str for char in [" ", '"', "'", "&", "|", ";", "`", ">"]) - - -def is_valid_task(task: dict) -> bool: - """Verify whether the task is valid. - - Args: - task (dict): task request - - Returns: - bool: valid or invalid - """ - required_fields = ["script_url", "optimized", "arguments", "approach", "requirements", "workers"] - - for field in required_fields: - if field not in task: - return False - - if not isinstance(task["script_url"], str) or is_invalid_str(task["script_url"]): - return False - - if (isinstance(task["optimized"], str) and task["optimized"] not in ["True", "False"]) or ( - not isinstance(task["optimized"], str) and not isinstance(task["optimized"], bool) - ): - return False - - if not isinstance(task["arguments"], list): - return False - else: - for argument in task["arguments"]: - if is_invalid_str(argument): - return False - - if not isinstance(task["approach"], str) or task["approach"] not in ["static", "static_ipex", "dynamic", "auto"]: - return False - - if not isinstance(task["requirements"], list): - return False - else: - for requirement in task["requirements"]: - if is_invalid_str(requirement): - return False - - if not isinstance(task["workers"], int) or task["workers"] < 1: - return False - - return True diff --git a/neural_solution/launcher.py b/neural_solution/launcher.py deleted file mode 100644 index 8e6d9c1a677..00000000000 --- a/neural_solution/launcher.py +++ /dev/null @@ -1,437 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""The entry of Neural Solution.""" -import argparse -import os -import shlex -import socket -import sqlite3 -import subprocess -import sys -import time -from datetime import datetime - -import psutil -from prettytable import PrettyTable - -from neural_solution.utils import logger -from neural_solution.utils.utility import get_db_path - - -def check_ports(args): - """Check parameters ending in '_port'. - - Args: - args (argparse.Namespace): parameters. - """ - for arg in vars(args): - if "_port" in arg: - check_port(getattr(args, arg)) - - -def check_port(port): - """Check if the given port is standardized. - - Args: - port (int): port number. - """ - if not str(port).isdigit() or int(port) < 0 or int(port) > 65535: - logger.info(f"Error: Invalid port number: {port}") - sys.exit(1) - - -def get_local_service_ip(port): - """Get the local IP address of the machine running the service. - - Args: - port (int): The port number of the service. - - Returns: - str: The IP address of the machine running the service. - """ - with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: - s.connect(("8.8.8.8", port)) - return s.getsockname()[0] - - -def stop_service(): - """Stop service.""" - # Get all running processes - for proc in psutil.process_iter(): - try: - # Get the process details - pinfo = proc.as_dict(attrs=["pid", "name", "cmdline"]) - # Check if the process is the target process - if "neural_solution.backend.runner" in pinfo["cmdline"]: - # Terminate the process using Process.kill() method - process = psutil.Process(pinfo["pid"]) - process.kill() - elif "neural_solution.frontend.fastapi.main_server" in pinfo["cmdline"]: - process = psutil.Process(pinfo["pid"]) - process.kill() - elif "neural_solution.frontend.gRPC.server" in pinfo["cmdline"]: - process = psutil.Process(pinfo["pid"]) - process.kill() - except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): - pass - # Service End - logger.info("Neural Solution Service Stopped!") - - -def check_port_free(port): - """Check if the port is free. - - Args: - port (int): port number. - - Returns: - bool : the free state of the port. - """ - for conn in psutil.net_connections(): - if conn.status == "LISTEN" and conn.laddr.port == port: - return False - return True - - -def start_service(args): - """Start service. - - Args: - args (argparse.Namespace): parameters. - """ - # Check ports - ports_flag = 0 - for port in [args.restful_api_port, args.task_monitor_port, args.result_monitor_port]: - # Check if the port is occupied - if not check_port_free(port): - logger.info(f"Port {port} is in use!") - ports_flag += 1 - if ports_flag > 0: - logger.info("Please replace the occupied port!") - sys.exit(1) - # Check completed - - # Check conda environment - if not args.conda_env: - conda_env = os.environ.get("CONDA_DEFAULT_ENV") - if not conda_env: - logger.info("No environment specified or conda environment activated !!!") - sys.exit(1) - else: - logger.info( - "No environment specified, use environment activated:" - + f" ({conda_env}) as the task runtime environment." - ) - conda_env_name = conda_env - else: - conda_env_name = args.conda_env - # Check completed - - serve_log_dir = f"{args.workspace}/serve_log" - if not os.path.exists(serve_log_dir): - os.makedirs(serve_log_dir) - date_time = datetime.now() - date_suffix = "_" + date_time.strftime("%Y%m%d-%H%M%S") - date_suffix = "" - with open(f"{serve_log_dir}/backend{date_suffix}.log", "w") as f: - subprocess.Popen( - [ - "python", - "-m", - "neural_solution.backend.runner", - "--hostfile", - shlex.quote(str(args.hostfile)), - "--task_monitor_port", - shlex.quote(str(args.task_monitor_port)), - "--result_monitor_port", - shlex.quote(str(args.result_monitor_port)), - "--workspace", - shlex.quote(str(args.workspace)), - "--conda_env_name", - shlex.quote(str(conda_env_name)), - "--upload_path", - shlex.quote(str(args.upload_path)), - ], - stdout=os.dup(f.fileno()), - stderr=subprocess.STDOUT, - ) - if args.api_type in ["all", "restful"]: - with open(f"{serve_log_dir}/frontend{date_suffix}.log", "w") as f: - subprocess.Popen( - [ - "python", - "-m", - "neural_solution.frontend.fastapi.main_server", - "--host", - "0.0.0.0", - "--fastapi_port", - shlex.quote(str(args.restful_api_port)), - "--task_monitor_port", - shlex.quote(str(args.task_monitor_port)), - "--result_monitor_port", - shlex.quote(str(args.result_monitor_port)), - "--workspace", - shlex.quote(str(args.workspace)), - ], - stdout=os.dup(f.fileno()), - stderr=subprocess.STDOUT, - ) - if args.api_type in ["all", "grpc"]: - with open(f"{serve_log_dir}/frontend_grpc.log", "w") as f: - subprocess.Popen( - [ - "python", - "-m", - "neural_solution.frontend.gRPC.server", - "--grpc_api_port", - shlex.quote(str(args.grpc_api_port)), - "--task_monitor_port", - shlex.quote(str(args.task_monitor_port)), - "--result_monitor_port", - shlex.quote(str(args.result_monitor_port)), - "--workspace", - shlex.quote(str(args.workspace)), - ], - stdout=os.dup(f.fileno()), - stderr=subprocess.STDOUT, - ) - ip_address = get_local_service_ip(80) - - # Check if the service is started - # Set the maximum waiting time to 3 seconds - timeout = 3 - # Start time - start_time = time.time() - while True: - # Check if the ports are in use - if ( - check_port_free(args.task_monitor_port) - or check_port_free(args.result_monitor_port) - or check_port_free(args.restful_api_port) - ): - # If the ports are not in use, wait for a second and check again - time.sleep(0.5) - # Check if timed out - current_time = time.time() - elapsed_time = current_time - start_time - if elapsed_time >= timeout: - # If timed out, break the loop - logger.info("Timeout!") - break - - # Continue to wait for all ports to be in use - else: - break - ports_flag = 0 - fail_msg = "Neural Solution START FAIL!" - for port in [args.task_monitor_port, args.result_monitor_port]: - if not check_port_free(port): - ports_flag += 1 - - # Check if the serve port is occupied - if not check_port_free(args.restful_api_port): - ports_flag += 1 - else: - fail_msg = f"{fail_msg}\nPlease check frontend serve log!" - - if ports_flag < 2: - fail_msg = f"{fail_msg}\nPlease check backend serve log!" - - if ports_flag < 3: - logger.info(fail_msg) - sys.exit(1) - # Check completed - - logger.info("Neural Solution Service Started!") - logger.info(f'Service log saving path is in "{os.path.abspath(serve_log_dir)}"') - logger.info(f"To submit task at: {ip_address}:{args.restful_api_port}/task/submit/") - logger.info("[For information] neural_solution -h") - - -def query_cluster(db_path: str): - """Query cluster information from database. - - Args: - db_path (str): the database path - """ - conn = sqlite3.connect(f"{db_path}") - cursor = conn.cursor() - cursor.execute(r"select * from cluster") - conn.commit() - results = cursor.fetchall() - - table = PrettyTable() - table.field_names = [i[0] for i in cursor.description] - - for row in results: - table.add_row(row) - - table.title = "Neural Solution Cluster Management System" - logger.info(table) - cursor.close() - conn.close() - - -def create_node(line: str): - """Parse line to create node. - - Args: - line (str): node information, e.g. "localhost 2 20" - - Returns: - Node: node object - """ - from neural_solution.backend.cluster import Node - - hostname, num_sockets, num_cores_per_socket = line.strip().split(" ") - num_sockets, num_cores_per_socket = int(num_sockets), int(num_cores_per_socket) - node = Node(name=hostname, num_sockets=num_sockets, num_cores_per_socket=num_cores_per_socket) - return node - - -def join_node_to_cluster(db_path: str, args): - """Append new node into cluster. - - Args: - db_path (str): the database path - """ - is_file = os.path.isfile(args.join) - node_lst = [] - if is_file: - num_threads_per_process = 5 - with open(args.join, "r") as f: - for line in f: - node_lst.append(create_node(line)) - else: - for line in args.join.split(";"): - node_lst.append(create_node(line)) - - # Insert node into cluster table. - for count, node in enumerate(node_lst): - logger.info(node) - conn = sqlite3.connect(f"{db_path}") - cursor = conn.cursor() - if count == 0: - cursor.execute("SELECT id FROM cluster ORDER BY id DESC LIMIT 1") - result = cursor.fetchone() - index = result[0] if result else 0 - - cursor.execute( - r"insert into cluster(name, node_info, status, free_sockets, busy_sockets, total_sockets)" - + "values ('{}', '{}', '{}', {}, {}, {})".format( - node.name, repr(node).replace("Node", f"Node{index+1}"), "join", node.num_sockets, 0, node.num_sockets - ) - ) - conn.commit() - index += 1 - logger.info(f"Insert node-id: {index} successfully!") - - cursor.close() - conn.close() - - -def remove_node_from_cluster(db_path: str, node_id: int): - """Remove one node from cluster table. In the future, it will be deleted in the Cluster class. - - Args: - db_path (str): the database path - node_id (int): the node id - """ - conn = sqlite3.connect(f"{db_path}") - cursor = conn.cursor() - - cursor.execute(f"SELECT status, busy_sockets FROM cluster where id = {node_id}") - results = cursor.fetchone() - - if results is None: - logger.info(f"No node-id {node_id} in cluster table.") - return - elif results[1] == 0: - sql = f"UPDATE cluster SET status = 'remove' WHERE id = {node_id}" - cursor.execute(sql) - logger.info(f"Remove node-id {node_id} successfully.") - else: - sql = f"UPDATE cluster SET status = 'remove' WHERE id = {node_id}" - cursor.execute(sql) - logger.info("Resource occupied, will be removed after resource release") - conn.commit() - - cursor.close() - conn.close() - - -def manage_cluster(args): - """Neural Solution resource management. query/join/remove node. - - Args: - args (argparse.Namespace): configuration - """ - db_path = get_db_path(args.workspace) - if args.query: - query_cluster(db_path) - if args.join: - join_node_to_cluster(db_path, args) - if args.remove: - remove_node_from_cluster(db_path, node_id=args.remove) - - -def main(): - """Implement the main function.""" - parser = argparse.ArgumentParser(description="Neural Solution") - parser.add_argument("action", choices=["start", "stop", "cluster"], help="start/stop/management service") - parser.add_argument( - "--hostfile", default=None, help="start backend serve host file which contains all available nodes" - ) - parser.add_argument( - "--restful_api_port", type=int, default=8000, help="start restful serve with {restful_api_port}, default 8000" - ) - parser.add_argument( - "--grpc_api_port", type=int, default=8001, help="start gRPC with {restful_api_port}, default 8001" - ) - parser.add_argument( - "--result_monitor_port", - type=int, - default=3333, - help="start serve for result monitor at {result_monitor_port}, default 3333", - ) - parser.add_argument( - "--task_monitor_port", - type=int, - default=2222, - help="start serve for task monitor at {task_monitor_port}, default 2222", - ) - parser.add_argument("--api_type", default="all", help="start web serve with all/grpc/restful, default all") - parser.add_argument( - "--workspace", default="./ns_workspace", help='neural solution workspace, default "./ns_workspace"' - ) - parser.add_argument("--conda_env", default=None, help="specify the running environment for the task") - parser.add_argument("--upload_path", default="examples", help="specify the file path for the tasks") - parser.add_argument("--query", action="store_true", help="[cluster parameter] query cluster information") - parser.add_argument("--join", help="[cluster parameter] add new node into cluster") - parser.add_argument("--remove", help="[cluster parameter] remove from cluster") - args = parser.parse_args() - - # Check parameters ending in '_port' - check_ports(args) - - if args.action == "start": - start_service(args) - elif args.action == "stop": - stop_service() - elif args.action == "cluster": - manage_cluster(args) - - -if __name__ == "__main__": - main() diff --git a/neural_solution/requirements.txt b/neural_solution/requirements.txt deleted file mode 100644 index 975b78686e1..00000000000 --- a/neural_solution/requirements.txt +++ /dev/null @@ -1,8 +0,0 @@ -fastapi -grpcio -mpi4py -neural_compressor>=2.2 -protobuf -pydantic -uvicorn[standard] -watchdog diff --git a/neural_solution/scripts/prepare_deps.py b/neural_solution/scripts/prepare_deps.py deleted file mode 100644 index da7a716d4a6..00000000000 --- a/neural_solution/scripts/prepare_deps.py +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Prepare all dependencies.""" - -""" -CHECK LIST: - - MPI - - CONDA - - other packages, such as, mpi4py -""" diff --git a/neural_solution/test/backend/test_cluster.py b/neural_solution/test/backend/test_cluster.py deleted file mode 100644 index e6cc63f8abf..00000000000 --- a/neural_solution/test/backend/test_cluster.py +++ /dev/null @@ -1,63 +0,0 @@ -"""Tests for cluster.""" - -import importlib -import os -import shutil -import unittest - -from neural_solution.backend.cluster import Cluster, Node -from neural_solution.backend.task import Task -from neural_solution.utils.utility import get_db_path, get_task_log_workspace, get_task_workspace - -NEURAL_SOLUTION_WORKSPACE = os.path.join(os.getcwd(), "ns_workspace") -db_path = get_db_path(NEURAL_SOLUTION_WORKSPACE) - - -class TestCluster(unittest.TestCase): - @classmethod - def setUp(self): - node_lst = [Node("node1", "localhost", 2, 4), Node("node2", "localhost", 2, 4)] - self.cluster = Cluster(node_lst, db_path=db_path) - - self.task = Task( - task_id="1", - arguments=["arg1", "arg2"], - workers=2, - status="pending", - script_url="https://example.com", - optimized=True, - approach="static", - requirement=["req1", "req2"], - result="", - q_model_path="q_model_path", - ) - - @classmethod - def tearDownClass(self): - shutil.rmtree("ns_workspace") - - def test_reserve_resource(self): - task = self.task - reserved_resource_lst = self.cluster.reserve_resource(task) - self.assertEqual(len(reserved_resource_lst), 2) - self.assertEqual(self.cluster.socket_queue, ["2 node2", "2 node2"]) - - def test_free_resource(self): - task = self.task - reserved_resource_lst = self.cluster.reserve_resource(task) - self.cluster.free_resource(reserved_resource_lst) - self.assertEqual(self.cluster.socket_queue, ["2 node2", "2 node2", "1 node1", "1 node1"]) - - def test_get_free_socket(self): - free_socket_lst = self.cluster.get_free_socket(4) - self.assertEqual(len(free_socket_lst), 4) - self.assertEqual(free_socket_lst, ["1 node1", "1 node1", "2 node2", "2 node2"]) - self.assertEqual(self.cluster.socket_queue, []) - - # Attempting to over allocate resources - free_socket_lst = self.cluster.get_free_socket(10) - self.assertEqual(free_socket_lst, 0) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_solution/test/backend/test_result_monitor.py b/neural_solution/test/backend/test_result_monitor.py deleted file mode 100644 index 1691826729f..00000000000 --- a/neural_solution/test/backend/test_result_monitor.py +++ /dev/null @@ -1,50 +0,0 @@ -import json -import threading -import unittest -from unittest.mock import MagicMock, patch - -from neural_solution.backend.result_monitor import ResultMonitor - - -class TestResultMonitor(unittest.TestCase): - @patch("socket.socket") - def test_wait_result(self, mock_socket): - # Mock data for testing - task_db = MagicMock() - task_db.lookup_task_status.return_value = "COMPLETED" - result = {"task_id": 1, "q_model_path": "path/to/q_model", "result": 0.8} - serialized_result = json.dumps(result) - - mock_c = MagicMock() - mock_c.recv.return_value = serialized_result - - mock_socket.return_value.accept.return_value = (mock_c, MagicMock()) - mock_socket.return_value.recv.return_value = serialized_result - mock_socket.return_value.__enter__.return_value = mock_socket.return_value - - # Create a ResultMonitor object and call the wait_result method - result_monitor = ResultMonitor(8080, task_db) - with patch("neural_solution.backend.result_monitor.deserialize", return_value={"ping": "test"}): - adding_abort = threading.Thread( - target=result_monitor.wait_result, - args=(), - daemon=True, - ) - adding_abort.start() - adding_abort.join(timeout=0.1) - - def test_query_task_status(self): - # Mock data for testing - task_db = MagicMock() - task_db.lookup_task_status.return_value = "done" - - # Create a ResultMonitor object and call the query_task_status method - result_monitor = ResultMonitor(8080, task_db) - result_monitor.query_task_status(1) - - # Assert that the task_db.lookup_task_status method was called with the correct argument - task_db.lookup_task_status.assert_called_once_with(1) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_solution/test/backend/test_runner.py b/neural_solution/test/backend/test_runner.py deleted file mode 100644 index c400f00c427..00000000000 --- a/neural_solution/test/backend/test_runner.py +++ /dev/null @@ -1,47 +0,0 @@ -import argparse -import os -import shutil -import threading -import unittest -from unittest.mock import patch - -from neural_solution.backend.runner import main, parse_args - - -class TestMain(unittest.TestCase): - @classmethod - def tearDownClass(cls) -> None: - os.remove("test.txt") - shutil.rmtree("ns_workspace", ignore_errors=True) - - def test_parse_args(self): - args = ["-H", "path/to/hostfile", "-TMP", "2222", "-RMP", "3333", "-CEN", "inc"] - with patch( - "argparse.ArgumentParser.parse_args", - return_value=argparse.Namespace( - hostfile="path/to/hostfile", task_monitor_port=2222, result_monitor_port=3333, conda_env_name="inc" - ), - ): - self.assertEqual( - parse_args(args), - argparse.Namespace( - hostfile="path/to/hostfile", task_monitor_port=2222, result_monitor_port=3333, conda_env_name="inc" - ), - ) - - def test_main(self): - """Test blocking flag in abort_job method.""" - path = "test.txt" - with open(path, "w") as f: - f.write("hostname1 2 20\nhostname2 2 20") - adding_abort = threading.Thread( - target=main, - kwargs={"args": ["-H", "test.txt", "-TMP", "2222", "-RMP", "3333", "-CEN", "inc_conda_env"]}, - daemon=True, - ) - adding_abort.start() - adding_abort.join(timeout=2) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_solution/test/backend/test_scheduler.py b/neural_solution/test/backend/test_scheduler.py deleted file mode 100644 index f36addc9f91..00000000000 --- a/neural_solution/test/backend/test_scheduler.py +++ /dev/null @@ -1,346 +0,0 @@ -import os -import shutil -import threading -import unittest -from subprocess import CalledProcessError -from unittest.mock import MagicMock, Mock, mock_open, patch - -from neural_solution.backend.cluster import Cluster -from neural_solution.backend.scheduler import Scheduler -from neural_solution.backend.task import Task -from neural_solution.backend.task_db import TaskDB -from neural_solution.backend.utils.utility import dump_elapsed_time, get_task_log_path -from neural_solution.config import config -from neural_solution.utils.utility import get_db_path - -NEURAL_SOLUTION_WORKSPACE = os.path.join(os.getcwd(), "ns_workspace") -db_path = get_db_path(NEURAL_SOLUTION_WORKSPACE) -config.workspace = NEURAL_SOLUTION_WORKSPACE - - -class TestScheduler(unittest.TestCase): - def setUp(self): - self.cluster = Cluster(db_path=db_path) - self.task_db = TaskDB(db_path=db_path) - self.result_monitor_port = 1234 - self.scheduler = Scheduler( - self.cluster, self.task_db, self.result_monitor_port, conda_env_name="for_ns_test", config=config - ) - - def tearDown(self) -> None: - shutil.rmtree("ns_workspace", ignore_errors=True) - - @classmethod - def tearDownClass(cls) -> None: - shutil.rmtree("examples") - - @unittest.skip("This test is skipped intentionally") - def test_prepare_env(self): - task = Task( - "test_task", - "test_arguments", - "test_workers", - "test_status", - "test_script_url", - "test_optimized", - "test_approach", - "pip", - "test_result", - "test_q_model_path", - ) - result = self.scheduler.prepare_env(task) - self.assertTrue(result.startswith(self.scheduler.conda_env_name)) - - # Test requirement in {conda_env} case - task = Task( - "test_task", - "test_arguments", - "test_workers", - "test_status", - "test_script_url", - "test_optimized", - "test_approach", - "pip", - "test_result", - "test_q_model_path", - ) - scheduler_test = Scheduler( - self.cluster, self.task_db, self.result_monitor_port, conda_env_name="base", config=config - ) - result = scheduler_test.prepare_env(task) - self.assertTrue(result.startswith("base")) - - # Test requirement is '' case - task = Task( - "test_task", - "test_arguments", - "test_workers", - "test_status", - "test_script_url", - "test_optimized", - "test_approach", - "", - "test_result", - "test_q_model_path", - ) - result = self.scheduler.prepare_env(task) - self.assertEqual(result, self.scheduler.conda_env_name) - - def test_prepare_task(self): - task = Task( - "test_task", - "test_arguments", - "test_workers", - "test_status", - "test_example", - "test_optimized", - "static", - "test_requirement", - "test_result", - "test_q_model_path", - ) - test_path = "examples/test_example" - if not os.path.exists(test_path): - os.makedirs(test_path) - with open(os.path.join(test_path, "test.py"), "w") as f: - f.write("# For Test") - - self.scheduler.prepare_task(task) - - # url case - with patch("neural_solution.backend.scheduler.is_remote_url", return_value=True): - self.scheduler.prepare_task(task) - - # optimized is False case - task = Task( - "test_task", - "test_arguments", - "test_workers", - "test_status", - "test_example", - False, - "static", - "test_requirement", - "test_result", - "test_q_model_path", - ) - self.scheduler.prepare_task(task) - - with patch("neural_solution.backend.scheduler.is_remote_url", return_value=True): - task = Task( - "test_task", - "test_arguments", - "test_workers", - "test_status", - "test_example/test.py", - False, - "static", - "test_requirement", - "test_result", - "test_q_model_path", - ) - self.scheduler.prepare_task(task) - - def test_check_task_status(self): - log_path = "test_log_path" - # done case - with patch("builtins.open", mock_open(read_data="[INFO] Save deploy yaml to\n")) as mock_file: - result = self.scheduler.check_task_status(log_path) - self.assertEqual(result, "done") - - # failed case - with patch("builtins.open", mock_open(read_data="[INFO] Deploying...\n")) as mock_file: - result = self.scheduler.check_task_status(log_path) - self.assertEqual(result, "failed") - - def test_sanitize_arguments(self): - arguments = "test_arguments\xa0" - sanitized_arguments = self.scheduler.sanitize_arguments(arguments) - self.assertEqual(sanitized_arguments, "test_arguments ") - - def test_dispatch_task(self): - task = Task( - "test_task", - "test_arguments", - "test_workers", - "test_status", - "test_script_url", - "test_optimized", - "test_approach", - "test_requirement", - "test_result", - "test_q_model_path", - ) - resource = [("node1", "8"), ("node2", "8")] - with patch("neural_solution.backend.scheduler.Scheduler.launch_task") as mock_launch_task: - self.scheduler.dispatch_task(task, resource) - self.assertTrue(mock_launch_task.called) - - @patch("socket.socket") - @patch("builtins.open") - def test_report_result(self, mock_open, mock_socket): - task_id = "test_task" - log_path = "test_log_path" - task_runtime = 10 - self.scheduler.q_model_path = None - mock_socket.return_value.connect.return_value = None - mock_open.return_value.readlines.return_value = ["Tune 1 result is: (int8|fp32): 0.8 (int8|fp32): 0.9"] - expected_result = {"optimization time (seconds)": "10.00", "Accuracy": "0.8", "Duration (seconds)": "0.9"} - - self.scheduler.report_result(task_id, log_path, task_runtime) - - mock_open.assert_called_once_with(log_path) - mock_socket.assert_called_once_with() - mock_socket.return_value.connect.assert_called_once_with(("localhost", 1234)) - mock_socket.return_value.send.assert_called_once() - - @patch("neural_solution.backend.scheduler.Scheduler.prepare_task") - @patch("neural_solution.backend.scheduler.Scheduler.prepare_env") - @patch("neural_solution.backend.scheduler.Scheduler._parse_cmd") - @patch("subprocess.Popen") - @patch("neural_solution.backend.scheduler.Scheduler.check_task_status") - @patch("neural_solution.backend.scheduler.Scheduler.report_result") - def test_launch_task( - self, - mock_report_result, - mock_check_task_status, - mock_popen, - mock_parse_cmd, - mock_prepare_env, - mock_prepare_task, - ): - task = Task( - "test_task", - "test_arguments", - "test_workers", - "test_status", - "test_script_url", - "test_optimized", - "test_approach", - "test_requirement", - "test_result", - "test_q_model_path", - ) - resource = ["1 node1", "2 node2"] - mock_parse_cmd.return_value = "test_cmd" - mock_check_task_status.return_value = "done" - mock_popen.return_value.wait.return_value = None - mock_prepare_env.return_value = "test_env" - mock_prepare_task.return_value = None - mock_report_result.return_value = None - - self.scheduler.launch_task(task, resource) - - @patch("neural_solution.backend.scheduler.Scheduler.launch_task") - @patch("neural_solution.backend.cluster.Cluster.reserve_resource") - def test_schedule_tasks(self, mock_reserve_resource, mock_launch_task): - task1 = Task( - "1", - "test_arguments", - "test_workers", - "test_status", - "test_script_url", - "test_optimized", - "test_approach", - "test_requirement", - "test_result", - "test_q_model_path", - ) - self.task_db.cursor.execute( - "insert into task values ('1', 'test_arguments', 'test_workers', \ - 'test_status', 'test_script_url', \ - 'test_optimized', 'test_approach', 'test_requirement', 'test_result', 'test_q_model_path')" - ) - - # no pending task case - adding_abort = threading.Thread( - target=self.scheduler.schedule_tasks, - args=(), - daemon=True, - ) - adding_abort.start() - adding_abort.join(timeout=10) - - # task case - self.task_db.append_task(task1) - mock_reserve_resource.return_value = [("node1", 8)] - mock_launch_task.return_value = None - - adding_abort = threading.Thread( - target=self.scheduler.schedule_tasks, - args=(), - daemon=True, - ) - adding_abort.start() - adding_abort.join(timeout=10) - - # no resource case - self.task_db.append_task(task1) - mock_reserve_resource.return_value = False - adding_abort = threading.Thread( - target=self.scheduler.schedule_tasks, - args=(), - daemon=True, - ) - adding_abort.start() - adding_abort.join(timeout=10) - - -class TestParseCmd(unittest.TestCase): - def setUp(self): - self.cluster = Cluster(db_path=db_path) - self.task_db = TaskDB(db_path=db_path) - self.result_monitor_port = 1234 - self.task_scheduler = Scheduler( - self.cluster, self.task_db, self.result_monitor_port, conda_env_name="for_ns_test", config=config - ) - self.task = MagicMock() - self.resource = ["1 node1", "2 node2", "3 node3"] - self.task.workers = 3 - self.task_name = "test_task" - self.script_name = "test_script.py" - self.task_path = "/path/to/task" - self.arguments = "arg1 arg2" - self.task.arguments = self.arguments - self.task.name = self.task_name - self.task.optimized = True - self.task.script = self.script_name - self.task.task_path = self.task_path - self.task_scheduler.script_name = self.script_name - self.task_scheduler.task_path = self.task_path - - def test__parse_cmd(self): - expected_cmd = ( - "cd /path/to/task\nmpirun -np 3 -host node1,node2,node3 -map-by socket:pe=5" - + " -mca btl_tcp_if_include 192.168.20.0/24 -x OMP_NUM_THREADS=5 --report-bindings bash distributed_run.sh" - ) - with patch("neural_solution.backend.scheduler.Scheduler.prepare_task") as mock_prepare_task, patch( - "neural_solution.backend.scheduler.Scheduler.prepare_env" - ) as mock_prepare_env, patch("neural_solution.backend.scheduler.logger.info") as mock_logger_info, patch( - "builtins.open", create=True - ) as mock_open, patch( - "neural_solution.backend.scheduler.os.path.join" - ) as mock_os_path_join: - mock_prepare_task.return_value = None - mock_prepare_env.return_value = "test_env" - mock_logger_info.return_value = None - mock_open.return_value.__enter__ = lambda x: x - mock_open.return_value.__exit__ = MagicMock() - mock_os_path_join.return_value = "/path/to/task/distributed_run.sh" - - result = self.task_scheduler._parse_cmd(self.task, self.resource) - self.assertEqual(result, expected_cmd) - - mock_prepare_task.assert_called_once_with(self.task) - mock_prepare_env.assert_called_once_with(self.task) - mock_logger_info.assert_called_once_with("[TaskScheduler] host resource: node1,node2,node3") - mock_open.assert_called_once_with("/path/to/task/distributed_run.sh", "w", encoding="utf-8") - mock_os_path_join.assert_called_once_with("/path/to/task", "distributed_run.sh") - - self.task.optimized = False - result = self.task_scheduler._parse_cmd(self.task, self.resource) - self.assertEqual(result, expected_cmd) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_solution/test/backend/test_task.py b/neural_solution/test/backend/test_task.py deleted file mode 100644 index 43d3c649ec5..00000000000 --- a/neural_solution/test/backend/test_task.py +++ /dev/null @@ -1,26 +0,0 @@ -import unittest - -from neural_solution.backend.task import Task - - -class TestTask(unittest.TestCase): - def setUp(self): - self.task = Task( - "123", "python script.py", 4, "pending", "http://example.com/script.py", True, "approach", "requirement" - ) - - def test_task_attributes(self): - self.assertEqual(self.task.task_id, "123") - self.assertEqual(self.task.arguments, "python script.py") - self.assertEqual(self.task.workers, 4) - self.assertEqual(self.task.status, "pending") - self.assertEqual(self.task.script_url, "http://example.com/script.py") - self.assertEqual(self.task.optimized, True) - self.assertEqual(self.task.approach, "approach") - self.assertEqual(self.task.requirement, "requirement") - self.assertEqual(self.task.result, "") - self.assertEqual(self.task.q_model_path, "") - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_solution/test/backend/test_task_db.py b/neural_solution/test/backend/test_task_db.py deleted file mode 100644 index 38e9690a8e7..00000000000 --- a/neural_solution/test/backend/test_task_db.py +++ /dev/null @@ -1,108 +0,0 @@ -import os -import shutil -import unittest -from unittest.mock import MagicMock, patch - -from neural_solution.backend.task_db import Task, TaskDB -from neural_solution.utils.utility import get_db_path - -NEURAL_SOLUTION_WORKSPACE = os.path.join(os.getcwd(), "ns_workspace") -db_path = get_db_path(NEURAL_SOLUTION_WORKSPACE) - - -class TestTaskDB(unittest.TestCase): - def setUp(self): - self.taskdb = TaskDB(db_path=db_path) - self.task = Task( - "1", "arguments", 1, "pending", "script_url", 0, "approach", "requirement", "result", "q_model_path" - ) - - @classmethod - def tearDownClass(cls) -> None: - shutil.rmtree("ns_workspace") - - def test_append_task(self): - self.taskdb.append_task(self.task) - self.assertEqual(len(self.taskdb.task_queue), 1) - self.assertEqual(self.taskdb.task_queue[0], "1") - - def test_get_pending_task_num(self): - self.taskdb.append_task(self.task) - self.assertEqual(self.taskdb.get_pending_task_num(), 1) - - def test_get_all_pending_tasks(self): - self.taskdb.cursor.execute( - "insert into task values ('2', 'arguments', 1, \ - 'pending', 'script_url', 0, 'approach', 'requirement', 'result', 'q_model_path')" - ) - self.taskdb.conn.commit() - pending_tasks = self.taskdb.get_all_pending_tasks() - self.assertEqual(len(pending_tasks), 1) - self.assertEqual(pending_tasks[0].task_id, "2") - - def test_update_task_status(self): - self.taskdb.cursor.execute( - "insert into task values ('3', 'arguments', 1, \ - 'pending', 'script_url', 0, 'approach', 'requirement', 'result', 'q_model_path')" - ) - self.taskdb.conn.commit() - self.taskdb.update_task_status("3", "running") - self.taskdb.cursor.execute("select status from task where id='3'") - status = self.taskdb.cursor.fetchone()[0] - self.assertEqual(status, "running") - with self.assertRaises(Exception): - self.taskdb.update_task_status("3", "invalid_status") - - def test_update_result(self): - self.taskdb.cursor.execute( - "insert into task values ('4', 'arguments', 1, \ - 'pending', 'script_url', 0, 'approach', 'requirement', 'result', 'q_model_path')" - ) - self.taskdb.conn.commit() - self.taskdb.update_result("4", "new_result") - self.taskdb.cursor.execute("select result from task where id='4'") - result = self.taskdb.cursor.fetchone()[0] - self.assertEqual(result, "new_result") - - def test_update_q_model_path_and_result(self): - self.taskdb.cursor.execute( - "insert into task values ('5', 'arguments', 1, \ - 'pending', 'script_url', 0, 'approach', 'requirement', 'result', 'q_model_path')" - ) - self.taskdb.conn.commit() - self.taskdb.update_q_model_path_and_result("5", "new_q_model_path", "new_result") - self.taskdb.cursor.execute("select q_model_path, result from task where id='5'") - q_model_path, result = self.taskdb.cursor.fetchone() - self.assertEqual(q_model_path, "new_q_model_path") - self.assertEqual(result, "new_result") - - def test_lookup_task_status(self): - self.taskdb.cursor.execute( - "insert into task values ('6', 'arguments', 1, \ - 'pending', 'script_url', 0, 'approach', 'requirement', 'result', 'q_model_path')" - ) - self.taskdb.conn.commit() - status_dict = self.taskdb.lookup_task_status("6") - self.assertEqual(status_dict["status"], "pending") - self.assertEqual(status_dict["result"], "result") - - def test_get_task_by_id(self): - self.taskdb.cursor.execute( - "insert into task values ('7', 'arguments', 1, \ - 'pending', 'script_url', 0, 'approach', 'requirement', 'result', 'q_model_path')" - ) - self.taskdb.conn.commit() - task = self.taskdb.get_task_by_id("7") - self.assertEqual(task.task_id, "7") - self.assertEqual(task.arguments, "arguments") - self.assertEqual(task.workers, 1) - self.assertEqual(task.status, "pending") - self.assertEqual(task.result, "result") - - def test_remove_task(self): - self.taskdb.remove_task("1") - # currently no garbage collection, so this function does nothing - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_solution/test/backend/test_task_monitor.py b/neural_solution/test/backend/test_task_monitor.py deleted file mode 100644 index 1e4bb069726..00000000000 --- a/neural_solution/test/backend/test_task_monitor.py +++ /dev/null @@ -1,114 +0,0 @@ -import threading -import unittest -from unittest.mock import MagicMock, Mock, patch - -from neural_solution.backend.task import Task -from neural_solution.backend.task_monitor import TaskMonitor - - -class TestTaskMonitor(unittest.TestCase): - def setUp(self): - self.mock_task_db = Mock() - self.mock_socket = Mock() - self.task_monitor = TaskMonitor(8888, self.mock_task_db) - self.task_monitor.s = self.mock_socket - - def test__start_listening(self): - mock_bind = MagicMock() - mock_listen = MagicMock() - with patch("socket.socket") as mock_socket: - mock_socket.return_value.bind = mock_bind - mock_socket.return_value.listen = mock_listen - self.task_monitor._start_listening("localhost", 8888, 10) - - def test_receive_task(self): - self.mock_socket.accept.return_value = ( - Mock(), - b'{"task_id": 123, "arguments": {}, "workers": 1, \ - "status": "pending", "script_url": "http://example.com", "optimized": True, \ - "approach": "static", "requirement": "neural_solution", "result": "", "q_model_path": ""}', - ) - self.mock_task_db.get_task_by_id.return_value = Task( - task_id=123, - arguments={}, - workers=1, - status="pending", - script_url="http://example.com", - optimized=True, - approach="static", - requirement="neural_solution", - result="", - q_model_path="", - ) - - # Test normal task case - with patch( - "neural_solution.backend.task_monitor.deserialize", - return_value={ - "task_id": 123, - "arguments": {}, - "workers": 1, - "status": "pending", - "script_url": "http://example.com", - "optimized": True, - "approach": "static", - "requirement": "neural_solution", - "result": "", - "q_model_path": "", - }, - ): - task = self.task_monitor._receive_task() - self.assertEqual(task.task_id, 123) - self.mock_task_db.get_task_by_id.assert_called_once_with(123) - - # Test ping case - with patch("neural_solution.backend.task_monitor.deserialize", return_value={"ping": "test"}): - response = self.task_monitor._receive_task() - self.assertEqual(response, False) - self.mock_task_db.get_task_by_id.assert_called_once_with(123) - - def test_append_task(self): - task = Task( - task_id=123, - arguments={}, - workers=1, - status="pending", - script_url="http://example.com", - optimized=True, - approach="static", - requirement="neural_solution", - result="", - q_model_path="", - ) - self.task_monitor._append_task(task) - self.mock_task_db.append_task.assert_called_once_with(task) - - def test_wait_new_task(self): - # Set up mock objects - mock_logger = MagicMock() - mock_task = MagicMock() - mock_receive_task = MagicMock(return_value=mock_task) - mock_append_task = MagicMock() - self.task_monitor._receive_task = mock_receive_task - self.task_monitor._append_task = mock_append_task - self.task_monitor._start_listening = MagicMock() - - # Call the function to be tested - adding_abort = threading.Thread( - target=self.task_monitor.wait_new_task, - args=(), - daemon=True, - ) - adding_abort.start() - adding_abort.join(timeout=1) - - # Test task is False - mock_receive_task = MagicMock(return_value=False) - mock_append_task = MagicMock() - self.task_monitor._receive_task = mock_receive_task - - adding_abort.join(timeout=1) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_solution/test/backend/utils/test_utility.py b/neural_solution/test/backend/utils/test_utility.py deleted file mode 100644 index dd02878ee93..00000000000 --- a/neural_solution/test/backend/utils/test_utility.py +++ /dev/null @@ -1,158 +0,0 @@ -import os -import shutil -import unittest -from unittest.mock import MagicMock, mock_open, patch - -from neural_solution.backend.utils.utility import ( - build_cluster, - build_local_cluster, - build_workspace, - create_dir, - deserialize, - dump_elapsed_time, - get_current_time, - get_q_model_path, - get_task_log_path, - is_remote_url, - serialize, - synchronized, -) -from neural_solution.config import config -from neural_solution.utils.utility import get_db_path, get_task_log_workspace, get_task_workspace - -NEURAL_SOLUTION_WORKSPACE = os.path.join(os.getcwd(), "ns_workspace") -DB_PATH = NEURAL_SOLUTION_WORKSPACE + "/db" -TASK_WORKSPACE = NEURAL_SOLUTION_WORKSPACE + "/task_workspace" -TASK_LOG_path = NEURAL_SOLUTION_WORKSPACE + "/task_log" -SERVE_LOG_PATH = NEURAL_SOLUTION_WORKSPACE + "/serve_log" - -config.workspace = NEURAL_SOLUTION_WORKSPACE -db_path = get_db_path(config.workspace) - - -class TestUtils(unittest.TestCase): - @classmethod - def tearDown(self) -> None: - if os.path.exists("ns_workspace"): - shutil.rmtree("ns_workspace") - - def test_serialize(self): - input_dict = {"key1": "value1", "key2": "value2"} - expected_output = b'{"key1": "value1", "key2": "value2"}' - self.assertEqual(serialize(input_dict), expected_output) - - def test_deserialize(self): - input_bytes = b'{"key1": "value1", "key2": "value2"}' - expected_output = {"key1": "value1", "key2": "value2"} - self.assertEqual(deserialize(input_bytes), expected_output) - - def test_dump_elapsed_time(self): - @dump_elapsed_time("test function") - def test_function(): - return True - - with patch("neural_solution.utils.logger") as mock_logger: - test_function() - - def test_get_task_log_path(self): - task_id = 123 - expected_output = f"{TASK_LOG_path}/task_{task_id}.txt" - self.assertEqual( - get_task_log_path(log_path=get_task_log_workspace(config.workspace), task_id=task_id), expected_output - ) - - def test_build_local_cluster(self): - with patch("neural_solution.backend.cluster.Node") as mock_node, patch( - "neural_solution.backend.cluster.Cluster" - ) as mock_cluster: - mock_node_obj = MagicMock() - mock_node.return_value = mock_node_obj - mock_node_obj.name = "localhost" - mock_node_obj.num_sockets = 2 - mock_node_obj.num_cores_per_socket = 5 - build_local_cluster(db_path=db_path) - mock_node.assert_called_with(name="localhost", num_sockets=2, num_cores_per_socket=5) - mock_cluster.assert_called_once() - - def test_build_cluster(self): - # Test 2 hostname - path = "test.txt" - with open(path, "w") as f: - f.write("hostname1 2 20\nhostname2 2 20") - cluster, _ = build_cluster(path, db_path=db_path) - self.assertIsNotNone(cluster) - - os.remove("test.txt") - - file_path = "test_host_file" - with patch("neural_solution.backend.cluster.Node") as mock_node, patch( - "neural_solution.backend.cluster.Cluster" - ) as mock_cluster, patch("builtins.open") as mock_open, patch("os.path.exists") as mock_exists: - # Test None - cluster, _ = build_cluster(file_path=None, db_path=db_path) - mock_cluster.assert_called() - - mock_exists.return_value = True - build_cluster(file_path, db_path=db_path) - - # test_build_cluster_file_not_exist - file_path = "test_file" - with patch("neural_solution.backend.cluster.Node"), patch("neural_solution.backend.cluster.Cluster"), patch( - "builtins.open" - ), patch("os.path.exists") as mock_exists, patch("neural_solution.utils.logger") as mock_logger: - mock_exists.return_value = False - self.assertRaises(Exception, build_cluster, file_path) - mock_logger.reset_mock() - - def test_get_current_time(self): - self.assertIsNotNone(get_current_time()) - - def test_synchronized(self): - class TestClass: - def __init__(self): - self.lock = MagicMock() - - @synchronized - def test_function(self): - return True - - test_class = TestClass() - with patch.object(test_class, "lock"): - test_class.test_function() - - def test_build_workspace(self): - task_id = 123 - expected_output = os.path.abspath(f"{TASK_WORKSPACE}/{task_id}") - self.assertEqual(build_workspace(path=get_task_workspace(config.workspace), task_id=task_id), expected_output) - - def test_is_remote_url(self): - self.assertTrue(is_remote_url("http://test.com")) - self.assertTrue(is_remote_url("https://test.com")) - self.assertFalse(is_remote_url("test.txt")) - - def test_create_dir(self): - path = "test/path/test.txt" - create_dir(path) - self.assertTrue(os.path.exists(os.path.dirname(path))) - - @patch("builtins.open", mock_open(read_data="Save quantized model to /path/to/model.")) - def test_get_q_model_path_success(self): - log_path = "fake_log_path" - q_model_path = get_q_model_path(log_path, "task_id") - self.assertEqual(q_model_path, "/path/to/model") - - @patch("builtins.open", mock_open(read_data="Save quantized model to /path/to/task_workspace/task_id/model/1.pb.")) - def test_get_q_model_path_success_task_id(self): - log_path = "fake_log_path" - q_model_path = get_q_model_path(log_path, "task_id") - self.assertEqual(q_model_path, "/path/to/task_workspace/task_id/model") - - @patch("builtins.open", mock_open(read_data="No quantized model saved.")) - def test_get_q_model_path_failure(self): - log_path = "fake_log_path" - q_model_path = get_q_model_path(log_path, "task_id") - self.assertEqual(q_model_path, "quantized model path not found") - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_solution/test/frontend/fastapi/test_main_server.py b/neural_solution/test/frontend/fastapi/test_main_server.py deleted file mode 100644 index ebda4064fa7..00000000000 --- a/neural_solution/test/frontend/fastapi/test_main_server.py +++ /dev/null @@ -1,309 +0,0 @@ -import asyncio -import os -import shutil -import sqlite3 -import unittest -from unittest.mock import MagicMock, Mock, patch - -from fastapi import WebSocket -from fastapi.testclient import TestClient - -from neural_solution.config import config -from neural_solution.frontend.fastapi.main_server import LogEventHandler, Observer, app, start_log_watcher - -NEURAL_SOLUTION_WORKSPACE = os.path.join(os.getcwd(), "ns_workspace") -DB_PATH = NEURAL_SOLUTION_WORKSPACE + "/db" -TASK_WORKSPACE = NEURAL_SOLUTION_WORKSPACE + "/task_workspace" -TASK_LOG_path = NEURAL_SOLUTION_WORKSPACE + "/task_log" -SERVE_LOG_PATH = NEURAL_SOLUTION_WORKSPACE + "/serve_log" - -client = TestClient(app) - - -def build_db(): - if not os.path.exists(DB_PATH): - os.makedirs(DB_PATH) - conn = sqlite3.connect( - f"{DB_PATH}/task.db", check_same_thread=False - ) # sqlite should set this check_same_thread to False - cursor = conn.cursor() - cursor.execute( - "create table if not exists task(id TEXT PRIMARY KEY, arguments varchar(100), " - + "workers int, status varchar(20), script_url varchar(500), optimized integer, " - + "approach varchar(20), requirements varchar(500), result varchar(500), q_model_path varchar(200))" - ) - cursor.execute("drop table if exists cluster ") - cursor.execute( - r"create table cluster(id INTEGER PRIMARY KEY AUTOINCREMENT," - + "node_info varchar(500)," - + "status varchar(100)," - + "free_sockets int," - + "busy_sockets int," - + "total_sockets int)" - ) - - conn.commit() - conn.close - - -def delete_db(): - if os.path.exists(DB_PATH): - shutil.rmtree(DB_PATH) - - -def use_db(): - def f(func): - def fi(*args, **kwargs): - build_db() - res = func(*args, **kwargs) - delete_db() - - return fi - - return f - - -class TestMain(unittest.TestCase): - @classmethod - def setUpClass(self): - if not os.path.exists(TASK_LOG_path): - os.makedirs(TASK_LOG_path) - - @classmethod - def tearDownClass(self): - shutil.rmtree(NEURAL_SOLUTION_WORKSPACE, ignore_errors=True) - delete_db() - - def test_read_root(self): - response = client.get("/") - assert response.status_code == 200 - self.assertEqual(response.json(), {"message": "Welcome to Neural Solution!"}) - - @patch("neural_solution.frontend.fastapi.main_server.socket") - def test_ping(self, mock_socket): - response = client.get("/ping") - self.assertEqual(response.status_code, 200) - self.assertIn("status", response.json()) - self.assertIn("msg", response.json()) - - @use_db() - def test_get_cluster(self): - response = client.get("/cluster") - assert response.status_code == 200 - assert "Cluster info" in response.json() - - @use_db() - def test_get_clusters(self): - response = client.get("/clusters") - assert response.status_code == 200 - assert "table" in response.text - - def test_get_description(self): - data = { - "description": "", - } - path = "../../doc" - if not os.path.exists(path): - os.makedirs(path) - with open(os.path.join(path, "user_facing_api.json"), "w") as f: - import json - - json.dump(data, f) - response = client.get("/description") - assert response.status_code == 200 - assert "description" in response.text - shutil.rmtree(path) - - @patch("neural_solution.frontend.fastapi.main_server.task_submitter.submit_task") - def test_submit_task(self, mock_submit_task): - task = { - "script_url": "http://example.com/script.py", - "optimized": "True", - "arguments": ["arg1", "arg2"], - "approach": "static", - "requirements": ["req1", "req2"], - "workers": 3, - } - - # test invalid task - task_invalid = { - "script_url": "http://example.com/script.py", - "optimized": "True", - "arguments": "invalid str, should be list", - "approach": "static", - "requirements": ["req1", "req2"], - "workers": 3, - } - response = client.post("/task/submit/", json=task_invalid) - print(response) - self.assertEqual(response.status_code, 422) - self.assertIn("arguments", response.text) - - # test no db case - delete_db() - response = client.post("/task/submit/", json=task) - self.assertEqual(response.status_code, 200) - self.assertIn("msg", response.json()) - self.assertIn("Task Submitted fail! db not found!", response.json()["msg"]) - mock_submit_task.assert_not_called() - - # test successfully - build_db() - response = client.post("/task/submit/", json=task) - self.assertEqual(response.status_code, 200) - self.assertIn("status", response.json()) - self.assertIn("task_id", response.json()) - self.assertIn("msg", response.json()) - self.assertIn("successfully", response.json()["status"]) - mock_submit_task.assert_called_once() - - # test ConnectionRefusedError case - mock_submit_task.side_effect = ConnectionRefusedError - response = client.post("/task/submit/", json=task) - self.assertEqual(response.status_code, 200) - self.assertIn("status", response.json()) - self.assertIn("task_id", response.json()) - self.assertIn("msg", response.json()) - self.assertEqual(response.json()["status"], "failed") - self.assertIn("Task Submitted fail! Make sure Neural Solution runner is running!", response.json()["msg"]) - mock_submit_task.assert_called() - - # test generic Exception case - response = client.post("/task/submit/", json=task) - self.assertEqual(response.status_code, 200) - self.assertIn("status", response.json()) - self.assertIn("task_id", response.json()) - self.assertIn("msg", response.json()) - self.assertEqual(response.json()["status"], "failed") - self.assertIn("Task Submitted fail!", response.json()["msg"]) - mock_submit_task.assert_called() - - delete_db() - - @use_db() - @patch("neural_solution.frontend.fastapi.main_server.task_submitter.submit_task") - def test_get_task_by_id(self, mock_submit_task): - task = { - "script_url": "http://example.com/script.py", - "optimized": True, - "arguments": ["arg1", "arg2"], - "approach": "static", - "requirements": ["req1", "req2"], - "workers": 3, - } - response = client.post("/task/submit/", json=task) - task_id = response.json()["task_id"] - response = client.get(f"/task/{task_id}") - assert response.status_code == 200 - assert response.json()["status"] == "pending" - - @use_db() - def test_get_all_tasks(self): - response = client.get("/task/") - assert response.status_code == 200 - delete_db() - response = client.get("/task/") - assert response.status_code == 200 - assert response.json()["message"] is None - - @use_db() - @patch("neural_solution.frontend.fastapi.main_server.task_submitter.submit_task") - def test_get_task_status_by_id(self, mock_submit_task): - task = { - "script_url": "http://example.com/script.py", - "optimized": True, - "arguments": ["arg1", "arg2"], - "approach": "static", - "requirements": ["req1", "req2"], - "workers": 3, - } - response = client.post("/task/submit/", json=task) - task_id = response.json()["task_id"] - response = client.get(f"/task/status/{task_id}") - assert response.status_code == 200 - self.assertIn("pending", response.text) - - response = client.get("/task/status/error_id") - assert response.status_code == 422 - self.assertIn("Invalid task id", response.text) - - def test_read_logs(self): - task_id = "65f87f89fd674724930ef659cbe86e08" - log_path = f"{TASK_LOG_path}/task_{task_id}.txt" - with open(log_path, "w") as f: - f.write(f"I am {task_id}.") - response = client.get(f"/task/log/{task_id}") - assert response.status_code == 200 - self.assertIn(task_id, response.text) - os.remove(log_path) - - -class TestLogEventHandler(unittest.TestCase): - def setUp(self): - self.loop = asyncio.get_event_loop() - - def test_init(self): - mock_websocket = MagicMock() - mock_websocket.send_text = MagicMock() - handler = LogEventHandler(mock_websocket, "test_task_id", 0) - self.assertEqual(handler.websocket, mock_websocket) - self.assertEqual(handler.task_id, "test_task_id") - self.assertEqual(handler.last_position, 0) - self.assertIsInstance(handler.queue, asyncio.Queue) - self.assertIsInstance(handler.timer, asyncio.Task) - - def test_on_modified(self): - config.workspace = NEURAL_SOLUTION_WORKSPACE - mock_websocket = MagicMock() - mock_websocket.send_text = MagicMock() - task_id = "1234" - log_path = f"{TASK_LOG_path}/task_{task_id}.txt" - if not os.path.exists(TASK_LOG_path): - os.makedirs(TASK_LOG_path) - - with open(log_path, "w") as f: - f.write(f"I am {task_id}.") - - handler = LogEventHandler(mock_websocket, "1234", 0) - - handler.queue.put_nowait("test message") - event = MagicMock() - task_id = "1234" - log_path = f"{TASK_LOG_path}/task_{task_id}.txt" - event.src_path = log_path - with patch("builtins.open", MagicMock()) as mock_file: - mock_file.return_value.__enter__.return_value.seek.return_value = None - mock_file.return_value.__enter__.return_value.readlines.return_value = ["test line"] - handler.on_modified(event) - mock_file.assert_called_once_with(log_path, "r") - mock_file.return_value.__enter__.return_value.seek.assert_called_once_with(0) - mock_file.return_value.__enter__.return_value.readlines.assert_called_once() - # handler.queue.put_nowait.assert_called_once_with("test line") - os.remove(log_path) - - -class TestStartLogWatcher(unittest.TestCase): - def setUp(self): - self.loop = asyncio.get_event_loop() - - def test_start_log_watcher(self): - mock_observer = MagicMock() - mock_observer.schedule = MagicMock() - with patch("neural_solution.frontend.fastapi.main_server.Observer", MagicMock(return_value=mock_observer)): - observer = start_log_watcher("test_websocket", "1234", 0) - self.assertIsInstance(observer, type(mock_observer)) - - -class TestWebsocketEndpoint(unittest.TestCase): - def setUp(self): - self.loop = asyncio.get_event_loop() - self.client = TestClient(app) - - def test_websocket_endpoint(self): - pass - # with self.assertRaises(HTTPException): - # asyncio.run(websocket_endpoint(WebSocket, "nonexistent_task")) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_solution/test/frontend/fastapi/test_task_submitter.py b/neural_solution/test/frontend/fastapi/test_task_submitter.py deleted file mode 100644 index fadea615650..00000000000 --- a/neural_solution/test/frontend/fastapi/test_task_submitter.py +++ /dev/null @@ -1,46 +0,0 @@ -import socket -import unittest -from unittest.mock import patch - -from neural_solution.frontend.task_submitter import Task, TaskSubmitter - - -class TestTask(unittest.TestCase): - def test_task_creation(self): - script_url = "https://example.com" - optimized = True - arguments = ["arg1", "arg2"] - approach = "approach" - requirements = ["req1", "req2"] - workers = 2 - - task = Task( - script_url=script_url, - optimized=optimized, - arguments=arguments, - approach=approach, - requirements=requirements, - workers=workers, - ) - - self.assertEqual(task.script_url, script_url) - self.assertEqual(task.optimized, optimized) - self.assertEqual(task.arguments, arguments) - self.assertEqual(task.approach, approach) - self.assertEqual(task.requirements, requirements) - self.assertEqual(task.workers, workers) - - -class TestTaskSubmitter(unittest.TestCase): - @patch("socket.socket") - def test_submit_task(self, mock_socket): - task_submitter = TaskSubmitter() - task_id = "65f87f89fd674724930ef659cbe86e08" - task_submitter.submit_task(task_id) - mock_socket.return_value.connect.assert_called_once_with(("localhost", 2222)) - mock_socket.return_value.send.assert_called_once_with(b'{"task_id": "65f87f89fd674724930ef659cbe86e08"}') - mock_socket.return_value.close.assert_called_once() - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_solution/test/frontend/fastapi/test_utils.py b/neural_solution/test/frontend/fastapi/test_utils.py deleted file mode 100644 index 7b16c639d67..00000000000 --- a/neural_solution/test/frontend/fastapi/test_utils.py +++ /dev/null @@ -1,212 +0,0 @@ -import os -import shutil -import unittest -from unittest.mock import mock_open, patch - -from neural_solution.frontend.utility import ( - check_log_exists, - deserialize, - get_baseline_during_tuning, - get_cluster_info, - get_cluster_table, - get_res_during_tuning, - is_valid_task, - list_to_string, - serialize, -) - -NEURAL_SOLUTION_WORKSPACE = os.path.join(os.getcwd(), "ns_workspace") -DB_PATH = NEURAL_SOLUTION_WORKSPACE + "/db/task.db" -TASK_WORKSPACE = NEURAL_SOLUTION_WORKSPACE + "/task_workspace" -TASK_LOG_path = NEURAL_SOLUTION_WORKSPACE + "/task_log" -SERVE_LOG_PATH = NEURAL_SOLUTION_WORKSPACE + "/serve_log" - - -class TestMyModule(unittest.TestCase): - @classmethod - def setUpClass(self): - if not os.path.exists(TASK_LOG_path): - os.makedirs(TASK_LOG_path) - - @classmethod - def tearDownClass(self): - shutil.rmtree(NEURAL_SOLUTION_WORKSPACE, ignore_errors=True) - - def test_serialize(self): - request = {"key": "value"} - expected_result = b'{"key": "value"}' - self.assertEqual(serialize(request), expected_result) - - def test_deserialize(self): - request = b'{"key": "value"}' - expected_result = {"key": "value"} - self.assertEqual(deserialize(request), expected_result) - - @patch("sqlite3.connect") - def test_get_cluster_info(self, mock_connect): - mock_cursor = mock_connect().cursor.return_value - mock_cursor.fetchall.return_value = [(1, "node info", "status", 1, 2, 3)] - expected_result = {"Cluster info": [(1, "node info", "status", 1, 2, 3)]} - self.assertEqual(get_cluster_info(TASK_LOG_path), expected_result) - - @patch("sqlite3.connect") - def test_get_cluster_table(self, mock_connect): - mock_cursor = mock_connect().cursor.return_value - mock_cursor.fetchall.return_value = [(1, "node info", "status", 1, 2, 3)] - expected_result = ( - '\n' - " \n" - ' \n' - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - "
NodeNode infostatusfree workersbusy workerstotal workers
1node infostatus123
" - ) - self.assertEqual(get_cluster_table(TASK_LOG_path), expected_result) - - def test_get_res_during_tuning(self): - task_id = "12345" - log_path = f"{TASK_LOG_path}/task_{task_id}.txt" - with open(log_path, "w") as f: - f.write("Tune 1 result is: (int8|fp32): 0.123 (int8|fp32): 0.456") - expected_result = {"Tuning count": "1", "Accuracy": "0.123", "Duration (seconds)": "0.456"} - self.assertEqual(get_res_during_tuning(task_id, TASK_LOG_path), expected_result) - os.remove(log_path) - - def test_get_baseline_during_tuning(self): - task_id = "12345" - log_path = f"{TASK_LOG_path}/task_{task_id}.txt" - with open(log_path, "w") as f: - f.write("FP32 baseline is: 0.123 0.456") - expected_result = {"Accuracy": "0.123", "Duration (seconds)": "0.456"} - self.assertEqual(get_baseline_during_tuning(task_id, TASK_LOG_path), expected_result) - os.remove(log_path) - - def test_check_log_exists(self): - task_id = "65f87f89fd674724930ef659cbe86e08" - log_path = f"{TASK_LOG_path}/task_{task_id}.txt" - with patch("os.path.exists") as mock_exists: - mock_exists.return_value = True - self.assertTrue(check_log_exists(task_id, TASK_LOG_path)) - mock_exists.return_value = False - self.assertFalse(check_log_exists(task_id, TASK_LOG_path)) - - def test_list_to_string(self): - lst = ["Hello", "Neural", "Solution"] - expected_result = "Hello Neural Solution" - self.assertEqual(list_to_string(lst), expected_result) - - def test_is_valid_task(self): - task_sql_injection = { - "script_url": "https://github.com/huggingface/transformers/blob/v4.21-release/examples/pytorch/text-classification/run_glue.py", - "optimized": "False", - "arguments": [], - "approach": "5', '6', 7, 'pending'), ('1b9ff5c2fd2143d58522bd71d18845a3', '2', 3, '4', '5', '6', 7, 'pending') ON CONFLICT (id) DO UPDATE SET id = '1b9ff5c2fd2143d58522bd71d18845a3', q_model_path = '/home/victim/.ssh' --", - "requirements": [], - "workers": 1, - } - self.assertFalse(is_valid_task(task_sql_injection)) - - task_cmd_injection = { - "script_url": 'https://github.com/huggingface/transformers/blob/v4.21-release/examples/pytorch/text-classification/run_glue.py & eval "$(echo ZWNobyAiRG9tYWluIGV4cGFuc2lvbiIgPiB+L2F0dGFjay5weSI= | base64 --decode)"', - "optimized": "False", - "arguments": ["--model_name_or_path bert-base-cased --task_name mrpc --do_eval --output_dir result"], - "approach": "static", - "requirements": [], - "workers": 1, - } - self.assertFalse(is_valid_task(task_cmd_injection)) - - task_lack_field = { - "optimized": "True", - } - self.assertFalse(is_valid_task(task_lack_field)) - - task_script_url_not_str = { - "script_url": ["custom_models_optimized/tf_example1"], - "optimized": "True", - "arguments": ["--dataset_location=dataset --model_path=model"], - "approach": "static", - "requirements": ["tensorflow"], - "workers": 1, - } - self.assertFalse(is_valid_task(task_script_url_not_str)) - - task_optimized_not_bool_str = { - "script_url": ["custom_models_optimized/tf_example1"], - "optimized": "True or False", - "arguments": ["--dataset_location=dataset", "--model_path=model"], - "approach": "static", - "requirements": ["tensorflow"], - "workers": 1, - } - self.assertFalse(is_valid_task(task_optimized_not_bool_str)) - - task_arguments_not_list = { - "script_url": ["custom_models_optimized/tf_example1"], - "optimized": "True", - "arguments": 123, - "approach": "static", - "requirements": ["tensorflow"], - "workers": 1, - } - self.assertFalse(is_valid_task(task_arguments_not_list)) - - task_arguments_invalid = { - "script_url": ["custom_models_optimized/tf_example1"], - "optimized": "True", - "arguments": ["--dataset_location=dataset --model_path=model"], - "approach": "static", - "requirements": ["tensorflow"], - "workers": 1, - } - self.assertFalse(is_valid_task(task_arguments_not_list)) - - task_approach_is_invalid = { - "script_url": ["custom_models_optimized/tf_example1"], - "optimized": "True", - "arguments": [], - "approach": "static or dynamic", - "requirements": ["tensorflow"], - "workers": 1, - } - self.assertFalse(is_valid_task(task_approach_is_invalid)) - - task_requirements_not_list = { - "script_url": ["custom_models_optimized/tf_example1"], - "optimized": "True", - "arguments": [], - "approach": "static", - "requirements": "tensorflow", - "workers": 1, - } - self.assertFalse(is_valid_task(task_requirements_not_list)) - - task_normal = { - "script_url": "custom_models_optimized/tf_example1", - "optimized": "True", - "arguments": ["--dataset_location=dataset", "--model_path=model"], - "approach": "static", - "requirements": ["tensorflow"], - "workers": 1, - } - self.assertTrue(is_valid_task(task_normal)) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_solution/test/requirements.txt b/neural_solution/test/requirements.txt deleted file mode 100644 index f7621d172eb..00000000000 --- a/neural_solution/test/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -httpx diff --git a/neural_solution/test/test_logger.py b/neural_solution/test/test_logger.py deleted file mode 100644 index fd0453069f4..00000000000 --- a/neural_solution/test/test_logger.py +++ /dev/null @@ -1,35 +0,0 @@ -"""Tests for logging utilities.""" - -import unittest - -from neural_solution.utils import logger - - -class TestLogger(unittest.TestCase): - def test_logger(self): - logger.log(0, "call logger log function.") - logger.log(1, {"msg": "call logger log function."}) - logger.debug("call logger debug function.") - logger.debug({"msg": "call logger debug function."}) - logger.error("call logger error function.") - logger.error({"msg": "call logger error function."}) - logger.fatal("call logger fatal function") - logger.fatal({"msg": "call logger fatal function"}) - logger.info("call logger info function") - logger.info({"msg": "call logger info function."}) - logger.warn("call logger warn function") - logger.warn({"msg": "call logger warn function"}) - logger.warning("call logger warning function") - logger.warning({"msg": "call logger warning function"}) - logger.warning(["call logger warning function", "done"]) - logger.warning(("call logger warning function", "done")) - logger.warning({"msg": {("bert", "embedding"): {"weight": {"dtype": ["unint8", "int8"]}}}}) - logger.warning({"msg": {("bert", "embedding"): {"op": ("a", "b")}}}) - # the following log will not be prettified - logger.warning([{"msg": "call logger warning function"}, {"msg2": "done"}]) - logger.warning(({"msg": "call logger warning function"}, {"msg2": "done"})) - logger.warning(({"msg": [{"sub_msg": "call logger"}, {"sub_msg2": "call warning function"}]}, {"msg2": "done"})) - - -if __name__ == "__main__": - unittest.main() diff --git a/neural_solution/utils/__init__.py b/neural_solution/utils/__init__.py deleted file mode 100644 index 1e1ab4fbdf4..00000000000 --- a/neural_solution/utils/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""All common functions for both backend and frontend.""" diff --git a/neural_solution/utils/logger.py b/neural_solution/utils/logger.py deleted file mode 100644 index 819403d1398..00000000000 --- a/neural_solution/utils/logger.py +++ /dev/null @@ -1,132 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Logger: handles logging functionalities.""" - -import logging -import os - - -class Logger(object): - """Logger class.""" - - __instance = None - - def __new__(cls): - """Create a singleton Logger instance.""" - if Logger.__instance is None: - Logger.__instance = object.__new__(cls) - Logger.__instance._log() - return Logger.__instance - - def _log(self): - """Set up the logger format and handler.""" - LOGLEVEL = os.environ.get("LOGLEVEL", "INFO").upper() - self._logger = logging.getLogger("neural_compressor") - self._logger.handlers.clear() - self._logger.setLevel(LOGLEVEL) - formatter = logging.Formatter("%(asctime)s [%(levelname)s] %(message)s", "%Y-%m-%d %H:%M:%S") - streamHandler = logging.StreamHandler() - streamHandler.setFormatter(formatter) - self._logger.addHandler(streamHandler) - self._logger.propagate = False - - def get_logger(self): - """Get the logger.""" - return self._logger - - -def _pretty_dict(value, indent=0): - """Make the logger dict pretty.""" - prefix = "\n" + " " * (indent + 4) - if isinstance(value, dict): - items = [prefix + repr(key) + ": " + _pretty_dict(value[key], indent + 4) for key in value] - return "{%s}" % (",".join(items) + "\n" + " " * indent) - elif isinstance(value, list): - items = [prefix + _pretty_dict(item, indent + 4) for item in value] - return "[%s]" % (",".join(items) + "\n" + " " * indent) - elif isinstance(value, tuple): - items = [prefix + _pretty_dict(item, indent + 4) for item in value] - return "(%s)" % (",".join(items) + "\n" + " " * indent) - else: - return repr(value) - - -level = Logger().get_logger().level -DEBUG = logging.DEBUG - - -def log(level, msg, *args, **kwargs): - """Output log with the level as a parameter.""" - if isinstance(msg, dict): - for _, line in enumerate(_pretty_dict(msg).split("\n")): - Logger().get_logger().log(level, line, *args, **kwargs) - else: - Logger().get_logger().log(level, msg, *args, **kwargs) - - -def debug(msg, *args, **kwargs): - """Output log with the debug level.""" - if isinstance(msg, dict): - for _, line in enumerate(_pretty_dict(msg).split("\n")): - Logger().get_logger().debug(line, *args, **kwargs) - else: - Logger().get_logger().debug(msg, *args, **kwargs) - - -def error(msg, *args, **kwargs): - """Output log with the error level.""" - if isinstance(msg, dict): - for _, line in enumerate(_pretty_dict(msg).split("\n")): - Logger().get_logger().error(line, *args, **kwargs) - else: - Logger().get_logger().error(msg, *args, **kwargs) - - -def fatal(msg, *args, **kwargs): - """Output log with the fatal level.""" - if isinstance(msg, dict): - for _, line in enumerate(_pretty_dict(msg).split("\n")): - Logger().get_logger().fatal(line, *args, **kwargs) - else: - Logger().get_logger().fatal(msg, *args, **kwargs) - - -def info(msg, *args, **kwargs): - """Output log with the info level.""" - if isinstance(msg, dict): - for _, line in enumerate(_pretty_dict(msg).split("\n")): - Logger().get_logger().info(line, *args, **kwargs) - else: - Logger().get_logger().info(msg, *args, **kwargs) - - -def warn(msg, *args, **kwargs): - """Output log with the warning level.""" - if isinstance(msg, dict): - for _, line in enumerate(_pretty_dict(msg).split("\n")): - Logger().get_logger().warning(line, *args, **kwargs) - else: - Logger().get_logger().warning(msg, *args, **kwargs) - - -def warning(msg, *args, **kwargs): - """Output log with the warning level (Alias of the method warn).""" - if isinstance(msg, dict): - for _, line in enumerate(_pretty_dict(msg).split("\n")): - Logger().get_logger().warning(line, *args, **kwargs) - else: - Logger().get_logger().warning(msg, *args, **kwargs) diff --git a/neural_solution/utils/utility.py b/neural_solution/utils/utility.py deleted file mode 100644 index 79cef4565d0..00000000000 --- a/neural_solution/utils/utility.py +++ /dev/null @@ -1,79 +0,0 @@ -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Neural Solution utility.""" - -import json -import os - - -def get_db_path(workspace="./"): - """Get the database path. - - Args: - workspace (str, optional): . Defaults to "./". - - Returns: - str: the path of database - """ - db_path = os.path.join(workspace, "db", "task.db") - return os.path.abspath(db_path) - - -def get_task_workspace(workspace="./"): - """Get the workspace of task. - - Args: - workspace (str, optional): the workspace for Neural Solution. Defaults to "./". - - Returns: - str: the workspace of task - """ - return os.path.join(workspace, "task_workspace") - - -def get_task_log_workspace(workspace="./"): - """Get the log workspace for task. - - Args: - workspace (str, optional): the workspace for Neural Solution. Defaults to "./". - - Returns: - str: the workspace of task. - """ - return os.path.join(workspace, "task_log") - - -def get_serve_log_workspace(workspace="./"): - """Get log workspace for service. - - Args: - workspace (str, optional): the workspace for Neural Solution. Defaults to "./". - - Returns: - str: the log workspace for service - """ - return os.path.join(workspace, "serve_log") - - -def dict_to_str(d): - """Convert a dict object to a string object. - - Args: - d (dict): a dict object - - Returns: - str: string - """ - result = json.dumps(d) - return result diff --git a/neural_solution/version.py b/neural_solution/version.py deleted file mode 100644 index 106f241e994..00000000000 --- a/neural_solution/version.py +++ /dev/null @@ -1,19 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# Copyright (c) 2023 Intel Corporation -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -"""Neural Solution.""" - -from neural_compressor.version import __version__ diff --git a/pyproject.toml b/pyproject.toml index f2c53b1c100..f17c3af16b2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [tool.isort] profile = "black" line_length = 120 -known_first_party = ["neural_compressor", "neural_insights", "neural_solution"] +known_first_party = ["neural_compressor"] extend_skip_glob = ["**/__init__.py"] diff --git a/setup.py b/setup.py index 949d53f910f..f1a9c9b22f6 100644 --- a/setup.py +++ b/setup.py @@ -46,7 +46,7 @@ def get_build_version(): "neural_compressor": { "project_name": "neural_compressor", "include_packages": find_packages( - include=["neural_compressor", "neural_compressor.*", "neural_coder", "neural_coder.*"], + include=["neural_compressor", "neural_compressor.*"], exclude=[ "neural_compressor.template", ], @@ -58,7 +58,7 @@ def get_build_version(): "neural_compressor_2x": { "project_name": "neural_compressor", "include_packages": find_packages( - include=["neural_compressor", "neural_compressor.*", "neural_coder", "neural_coder.*"], + include=["neural_compressor", "neural_compressor.*"], exclude=[ "neural_compressor.template", "neural_compressor.common", @@ -119,35 +119,6 @@ def get_build_version(): ), "install_requires": fetch_requirements("requirements_ort.txt"), }, - "neural_insights": { - "project_name": "neural_insights", - "include_packages": find_packages(include=["neural_insights", "neural_insights.*"], exclude=["test.*", "test"]), - "package_data": { - "neural_insights": [ - "bin/*", - "*.yaml", - "web/app/*.*", - "web/app/static/css/*", - "web/app/static/js/*", - "web/app/static/media/*", - "web/app/icons/*", - ] - }, - "install_requires": fetch_requirements("neural_insights/requirements.txt"), - "entry_points": {"console_scripts": ["neural_insights = neural_insights.bin.neural_insights:execute"]}, - }, - "neural_solution": { - "project_name": "neural_solution", - "include_packages": find_packages(include=["neural_solution", "neural_solution.*"]), - "package_data": { - "neural_solution": [ - "scripts/*.*", - "frontend/*.json", - ] - }, - "install_requires": fetch_requirements("neural_solution/requirements.txt"), - "entry_points": {"console_scripts": ["neural_solution = neural_solution.bin.neural_solution:exec"]}, - }, } @@ -160,14 +131,6 @@ def get_build_version(): ext_modules = [] cmdclass = {} - if "neural_insights" in sys.argv: - sys.argv.remove("neural_insights") - cfg_key = "neural_insights" - - if "neural_solution" in sys.argv: - sys.argv.remove("neural_solution") - cfg_key = "neural_solution" - if "2x" in sys.argv: sys.argv.remove("2x") cfg_key = "neural_compressor_2x" diff --git a/test/neural_coder/test_common.py b/test/neural_coder/test_common.py deleted file mode 100644 index 72142aa18e5..00000000000 --- a/test/neural_coder/test_common.py +++ /dev/null @@ -1,20 +0,0 @@ -import unittest - -from neural_coder.utils import common - - -class TestCommon(unittest.TestCase): - def test_move_element_to_front(self): - f = common.move_element_to_front - self.assertEqual(f([1, 2, 3, 4], 0), [1, 2, 3, 4]) - self.assertEqual(f([1, 2, 3, 4], 1), [1, 2, 3, 4]) - self.assertEqual(f([1, 2, 3, 4], 2), [2, 1, 3, 4]) - self.assertEqual(f([1, 2, 3, 4], 3), [3, 1, 2, 4]) - self.assertEqual(f([1, 2, 3, 4], 4), [4, 1, 2, 3]) - self.assertEqual(f([1, 2, 3, 4], "a"), [1, 2, 3, 4]) - self.assertEqual(f(["a", "b", "c", "d"], "d"), ["d", "a", "b", "c"]) - self.assertEqual(f(["ab", "a", "ac", "ad"], "a"), ["a", "ab", "ac", "ad"]) - - -if __name__ == "__main__": - unittest.main() diff --git a/test/neural_coder/test_line_operation.py b/test/neural_coder/test_line_operation.py deleted file mode 100644 index 822621bb39d..00000000000 --- a/test/neural_coder/test_line_operation.py +++ /dev/null @@ -1,46 +0,0 @@ -import unittest - -from neural_coder.utils import line_operation - - -class TestLineOperation(unittest.TestCase): - def test_get_line_indent_level(self): - f = line_operation.get_line_indent_level - self.assertEqual(f(" model(input)"), 4) - self.assertEqual(f(" model(input)"), 8) - self.assertEqual(f("model(input)"), 0) - self.assertEqual(f("# model(input)"), 0) - - def test_single_line_comment_or_empty_line_detection(self): - f = line_operation.single_line_comment_or_empty_line_detection - self.assertEqual(f("# test"), True) - self.assertEqual(f("test # test"), False) - self.assertEqual(f(" "), True) - self.assertEqual(f(" test"), False) - self.assertEqual(f('"""test"""'), True) - - def test_is_eval_func_model_name(self): - f = line_operation.is_eval_func_model_name - self.assertEqual(f("model", "model(input)")[0], True) - self.assertEqual(f("model", "model()")[0], True) - self.assertEqual(f("model", "# model(input)")[0], False) - self.assertEqual(f("model", "test # model(input)")[0], False) - self.assertEqual(f("model", "output = model(input)")[0], True) - self.assertEqual(f("model", "model = Net()")[0], False) - - def test_get_line_left_hand_side(self): - f = line_operation.get_line_left_hand_side - self.assertEqual(f("output = model(input)"), "output") - self.assertEqual(f("output=model(input)"), "output") - self.assertEqual(f("test = num"), "test") - - def test_of_definition_format(self): - f = line_operation.of_definition_format - self.assertEqual(f("output = model(input)"), (True, "output", "model")) - self.assertEqual(f("output=model(input)"), (True, "output", "model")) - self.assertEqual(f("model = Net()"), (True, "model", "Net")) - self.assertEqual(f("model = Net"), (False, "", "")) - - -if __name__ == "__main__": - unittest.main() diff --git a/test/strategy/test_basic.py b/test/strategy/test_basic.py index 55ba1fc857d..56e82f6994b 100644 --- a/test/strategy/test_basic.py +++ b/test/strategy/test_basic.py @@ -85,21 +85,6 @@ def fake_eval(model): q_model = fit(model=self.constant_graph, conf=conf, calib_dataloader=dataloader, eval_func=fake_eval) self.assertIsNotNone(q_model) - def test_diagnosis(self): - from neural_compressor.config import PostTrainingQuantConfig - from neural_compressor.data import DATALOADERS, Datasets - from neural_compressor.quantization import fit - - # dataset and dataloader - dataset = Datasets("tensorflow")["dummy"](((100, 3, 3, 1))) - dataloader = DATALOADERS["tensorflow"](dataset) - - # tuning and accuracy criterion - conf = PostTrainingQuantConfig(diagnosis=True) - q_model = fit(model=self.constant_graph, conf=conf, calib_dataloader=dataloader, eval_func=lambda model: 1) - self.assertEqual(os.path.exists(os.path.join(self.workspace, "inspect_saved/fp32/inspect_result.pkl")), True) - self.assertEqual(os.path.exists(os.path.join(self.workspace, "inspect_saved/quan/inspect_result.pkl")), True) - def test_run_create_eval_from_metric_and_dataloader(self): from neural_compressor.config import PostTrainingQuantConfig from neural_compressor.data import DATALOADERS, Datasets